src/reader tests: Have parse() return a unique_ptr

The reason being that some tests called parse() twice, which will silently destruct the first parser.
Once the `Module` owns the AST nodes, the second call will end up deleting all the AST nodes. Tests would then perform use-after-free for the AST nodes belonging to the first parser / module.
There's no reason why the unique_ptr can't be returned, which is cleaner overall.

Bug: tint:335
Change-Id: I7ff2e9777a7ebeb76702f806294fe4c2c49bd7c9
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/33241
Auto-Submit: Ben Clayton <bclayton@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/reader/spirv/function_arithmetic_test.cc b/src/reader/spirv/function_arithmetic_test.cc
index 52b93e1..415e0b1 100644
--- a/src/reader/spirv/function_arithmetic_test.cc
+++ b/src/reader/spirv/function_arithmetic_test.cc
@@ -131,9 +131,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -158,9 +158,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -187,9 +187,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -216,9 +216,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -247,9 +247,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -278,9 +278,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -311,9 +311,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -344,9 +344,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -379,9 +379,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -406,9 +406,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -460,11 +460,11 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << p->error() << "\n"
       << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   std::ostringstream ss;
   ss << R"(VariableConst{
@@ -690,11 +690,11 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << p->error() << "\n"
       << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -725,11 +725,11 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << p->error() << "\n"
       << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -836,11 +836,11 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << p->error() << "\n"
       << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -871,11 +871,11 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << p->error() << "\n"
       << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -926,9 +926,9 @@
      OpReturn
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_10
@@ -955,9 +955,9 @@
      OpReturn
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_10
@@ -984,9 +984,9 @@
      OpReturn
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_10
@@ -1013,9 +1013,9 @@
      OpReturn
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_10
@@ -1042,9 +1042,9 @@
      OpReturn
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_10
@@ -1071,9 +1071,9 @@
      OpReturn
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_3
@@ -1102,9 +1102,9 @@
      OpReturn
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_3
diff --git a/src/reader/spirv/function_bit_test.cc b/src/reader/spirv/function_bit_test.cc
index d34b963..3a03837 100644
--- a/src/reader/spirv/function_bit_test.cc
+++ b/src/reader/spirv/function_bit_test.cc
@@ -149,11 +149,11 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << p->error() << "\n"
       << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   std::ostringstream ss;
   ss << R"(VariableConst{
@@ -396,9 +396,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -423,9 +423,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -452,9 +452,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -481,9 +481,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -508,9 +508,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -539,9 +539,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -572,9 +572,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -604,9 +604,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
diff --git a/src/reader/spirv/function_call_test.cc b/src/reader/spirv/function_call_test.cc
index 2686ab5..a30ec37 100644
--- a/src/reader/spirv/function_call_test.cc
+++ b/src/reader/spirv/function_call_test.cc
@@ -30,7 +30,7 @@
 using ::testing::HasSubstr;
 
 TEST_F(SpvParserTest, EmitStatement_VoidCallNoParams) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      %void = OpTypeVoid
      %voidfn = OpTypeFunction %void
 
@@ -68,7 +68,7 @@
 }
 
 TEST_F(SpvParserTest, EmitStatement_ScalarCallNoParams) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      %void = OpTypeVoid
      %voidfn = OpTypeFunction %void
      %uint = OpTypeInt 32 0
@@ -88,7 +88,7 @@
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
   {
-    FunctionEmitter fe(p, *spirv_function(100));
+    FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
     EXPECT_TRUE(fe.EmitBody());
     EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   VariableConst{
@@ -109,7 +109,7 @@
   }
 
   {
-    FunctionEmitter fe(p, *spirv_function(50));
+    FunctionEmitter fe(p.get(), *spirv_function(p.get(), 50));
     EXPECT_TRUE(fe.EmitBody());
     EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(Return{
   {
@@ -120,7 +120,7 @@
 }
 
 TEST_F(SpvParserTest, EmitStatement_ScalarCallNoParamsUsedTwice) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      %void = OpTypeVoid
      %voidfn = OpTypeFunction %void
      %uint = OpTypeInt 32 0
@@ -144,7 +144,7 @@
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
   {
-    FunctionEmitter fe(p, *spirv_function(100));
+    FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
     EXPECT_TRUE(fe.EmitBody()) << p->error();
     EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   Variable{
@@ -179,7 +179,7 @@
         << ToString(fe.ast_body());
   }
   {
-    FunctionEmitter fe(p, *spirv_function(50));
+    FunctionEmitter fe(p.get(), *spirv_function(p.get(), 50));
     EXPECT_TRUE(fe.EmitBody()) << p->error();
     EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(Return{
   {
@@ -190,7 +190,7 @@
 }
 
 TEST_F(SpvParserTest, EmitStatement_CallWithParams) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      %void = OpTypeVoid
      %voidfn = OpTypeFunction %void
      %uint = OpTypeInt 32 0
diff --git a/src/reader/spirv/function_cfg_test.cc b/src/reader/spirv/function_cfg_test.cc
index af2553c..03b7f11 100644
--- a/src/reader/spirv/function_cfg_test.cc
+++ b/src/reader/spirv/function_cfg_test.cc
@@ -123,7 +123,7 @@
 }
 
 TEST_F(SpvParserTest, TerminatorsAreValid_SingleBlock) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %42 = OpLabel
@@ -132,13 +132,13 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_TRUE(fe.TerminatorsAreValid());
 }
 
 TEST_F(SpvParserTest, TerminatorsAreValid_Sequence) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %20 = OpLabel
@@ -150,13 +150,13 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_TRUE(fe.TerminatorsAreValid()) << p->error();
 }
 
 TEST_F(SpvParserTest, TerminatorsAreValid_If) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %20 = OpLabel
@@ -175,13 +175,13 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_TRUE(fe.TerminatorsAreValid()) << p->error();
 }
 
 TEST_F(SpvParserTest, TerminatorsAreValid_Switch) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -203,13 +203,13 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_TRUE(fe.TerminatorsAreValid());
 }
 
 TEST_F(SpvParserTest, TerminatorsAreValid_Loop_SingleBlock) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -225,13 +225,13 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_TRUE(fe.TerminatorsAreValid());
 }
 
 TEST_F(SpvParserTest, TerminatorsAreValid_Loop_Simple) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -253,13 +253,13 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_TRUE(fe.TerminatorsAreValid());
 }
 
 TEST_F(SpvParserTest, TerminatorsAreValid_Kill) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -268,13 +268,13 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_TRUE(fe.TerminatorsAreValid());
 }
 
 TEST_F(SpvParserTest, TerminatorsAreValid_Unreachable) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -283,13 +283,13 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_TRUE(fe.TerminatorsAreValid());
 }
 
 TEST_F(SpvParserTest, TerminatorsAreValid_MissingTerminator) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -301,7 +301,7 @@
 }
 
 TEST_F(SpvParserTest, TerminatorsAreValid_DisallowLoopToEntryBlock) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -313,14 +313,14 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_FALSE(fe.TerminatorsAreValid());
   EXPECT_THAT(p->error(), Eq("Block 20 branches to function entry block 10"));
 }
 
 TEST_F(SpvParserTest, TerminatorsAreValid_DisallowNonBlock) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -329,7 +329,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_FALSE(fe.TerminatorsAreValid());
   EXPECT_THAT(p->error(),
@@ -338,7 +338,7 @@
 }
 
 TEST_F(SpvParserTest, TerminatorsAreValid_DisallowBlockInDifferentFunction) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -355,7 +355,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_FALSE(fe.TerminatorsAreValid());
   EXPECT_THAT(p->error(), Eq("Block 10 in function 100 branches to 210 which "
@@ -363,7 +363,7 @@
 }
 
 TEST_F(SpvParserTest, RegisterMerges_NoMerges) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -372,7 +372,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_TRUE(fe.RegisterMerges());
 
@@ -386,7 +386,7 @@
 }
 
 TEST_F(SpvParserTest, RegisterMerges_GoodSelectionMerge_BranchConditional) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -402,7 +402,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_TRUE(fe.RegisterMerges());
 
@@ -435,7 +435,7 @@
 }
 
 TEST_F(SpvParserTest, RegisterMerges_GoodSelectionMerge_Switch) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -451,7 +451,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_TRUE(fe.RegisterMerges());
 
@@ -484,7 +484,7 @@
 }
 
 TEST_F(SpvParserTest, RegisterMerges_GoodLoopMerge_SingleBlockLoop) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -500,7 +500,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_TRUE(fe.RegisterMerges());
 
@@ -534,7 +534,7 @@
 
 TEST_F(SpvParserTest,
        RegisterMerges_GoodLoopMerge_MultiBlockLoop_ContinueIsHeader) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -553,7 +553,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_TRUE(fe.RegisterMerges());
 
@@ -587,7 +587,7 @@
 
 TEST_F(SpvParserTest,
        RegisterMerges_GoodLoopMerge_MultiBlockLoop_ContinueIsNotHeader_Branch) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -609,7 +609,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_TRUE(fe.RegisterMerges());
 
@@ -644,7 +644,7 @@
 TEST_F(
     SpvParserTest,
     RegisterMerges_GoodLoopMerge_MultiBlockLoop_ContinueIsNotHeader_BranchConditional) {  // NOLINT
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -666,7 +666,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_TRUE(fe.RegisterMerges());
 
@@ -699,7 +699,7 @@
 }
 
 TEST_F(SpvParserTest, RegisterMerges_SelectionMerge_BadTerminator) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -715,7 +715,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_FALSE(fe.RegisterMerges());
   EXPECT_THAT(p->error(), Eq("Selection header 10 does not end in an "
@@ -723,7 +723,7 @@
 }
 
 TEST_F(SpvParserTest, RegisterMerges_LoopMerge_BadTerminator) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -745,7 +745,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_FALSE(fe.RegisterMerges());
   EXPECT_THAT(p->error(), Eq("Loop header 20 does not end in an OpBranch or "
@@ -753,7 +753,7 @@
 }
 
 TEST_F(SpvParserTest, RegisterMerges_BadMergeBlock) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -769,7 +769,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_FALSE(fe.RegisterMerges());
   EXPECT_THAT(p->error(),
@@ -777,7 +777,7 @@
 }
 
 TEST_F(SpvParserTest, RegisterMerges_HeaderIsItsOwnMerge) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -793,7 +793,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_FALSE(fe.RegisterMerges());
   EXPECT_THAT(p->error(),
@@ -801,7 +801,7 @@
 }
 
 TEST_F(SpvParserTest, RegisterMerges_MergeReused) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -827,7 +827,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_FALSE(fe.RegisterMerges());
   EXPECT_THAT(
@@ -836,7 +836,7 @@
 }
 
 TEST_F(SpvParserTest, RegisterMerges_EntryBlockIsLoopHeader) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -852,7 +852,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_FALSE(fe.RegisterMerges());
   EXPECT_THAT(p->error(),
@@ -860,7 +860,7 @@
 }
 
 TEST_F(SpvParserTest, RegisterMerges_BadContinueTarget) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -876,7 +876,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_FALSE(fe.RegisterMerges());
   EXPECT_THAT(p->error(),
@@ -884,7 +884,7 @@
 }
 
 TEST_F(SpvParserTest, RegisterMerges_MergeSameAsContinue) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -904,7 +904,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_FALSE(fe.RegisterMerges());
   EXPECT_THAT(p->error(),
@@ -913,7 +913,7 @@
 }
 
 TEST_F(SpvParserTest, RegisterMerges_ContinueReused) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -948,7 +948,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_FALSE(fe.RegisterMerges());
   EXPECT_THAT(p->error(), Eq("Block 40 declared as continue target for more "
@@ -956,7 +956,7 @@
 }
 
 TEST_F(SpvParserTest, RegisterMerges_SingleBlockLoop_NotItsOwnContinue) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -975,7 +975,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   EXPECT_FALSE(fe.RegisterMerges());
   EXPECT_THAT(
@@ -984,7 +984,7 @@
 }
 
 TEST_F(SpvParserTest, ComputeBlockOrder_OneBlock) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %42 = OpLabel
@@ -993,7 +993,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1005,7 +1005,7 @@
 }
 
 TEST_F(SpvParserTest, ComputeBlockOrder_IgnoreStaticalyUnreachable) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -1020,7 +1020,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1028,7 +1028,7 @@
 }
 
 TEST_F(SpvParserTest, ComputeBlockOrder_KillIsDeadEnd) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -1043,7 +1043,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1051,7 +1051,7 @@
 }
 
 TEST_F(SpvParserTest, ComputeBlockOrder_UnreachableIsDeadEnd) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -1066,7 +1066,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1074,7 +1074,7 @@
 }
 
 TEST_F(SpvParserTest, ComputeBlockOrder_ReorderSequence) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -1089,7 +1089,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1107,7 +1107,7 @@
 }
 
 TEST_F(SpvParserTest, ComputeBlockOrder_DupConditionalBranch) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -1123,7 +1123,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1131,7 +1131,7 @@
 }
 
 TEST_F(SpvParserTest, ComputeBlockOrder_RespectConditionalBranchOrder) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -1150,7 +1150,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1158,7 +1158,7 @@
 }
 
 TEST_F(SpvParserTest, ComputeBlockOrder_TrueOnlyBranch) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -1174,7 +1174,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1182,7 +1182,7 @@
 }
 
 TEST_F(SpvParserTest, ComputeBlockOrder_FalseOnlyBranch) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -1198,7 +1198,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1206,7 +1206,7 @@
 }
 
 TEST_F(SpvParserTest, ComputeBlockOrder_SwitchOrderNaturallyReversed) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -1225,7 +1225,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1234,7 +1234,7 @@
 
 TEST_F(SpvParserTest,
        ComputeBlockOrder_SwitchWithDefaultOrderNaturallyReversed) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -1256,7 +1256,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1264,7 +1264,7 @@
 }
 
 TEST_F(SpvParserTest, ComputeBlockOrder_Switch_DefaultSameAsACase) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -1286,7 +1286,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1318,9 +1318,9 @@
 
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1354,9 +1354,9 @@
 
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1387,9 +1387,9 @@
 
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1424,9 +1424,9 @@
 
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1466,9 +1466,9 @@
 
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1515,9 +1515,9 @@
 
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1565,9 +1565,9 @@
 
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1615,9 +1615,9 @@
 
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1659,9 +1659,9 @@
 
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1684,9 +1684,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1708,9 +1708,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1732,9 +1732,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1761,9 +1761,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1790,9 +1790,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1819,9 +1819,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1851,9 +1851,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1884,9 +1884,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1924,9 +1924,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1961,9 +1961,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -1994,9 +1994,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -2027,9 +2027,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -2064,9 +2064,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -2104,9 +2104,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -2146,9 +2146,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -2186,9 +2186,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -2219,9 +2219,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -2251,9 +2251,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -2290,9 +2290,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -2319,9 +2319,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -2348,9 +2348,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -2377,9 +2377,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -2419,9 +2419,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -2462,9 +2462,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -2505,9 +2505,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -2548,9 +2548,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -2591,9 +2591,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -2639,9 +2639,9 @@
      %99 = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
 
@@ -2668,9 +2668,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -2693,9 +2693,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -2721,9 +2721,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -2753,9 +2753,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -2791,9 +2791,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -2828,9 +2828,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -2851,9 +2851,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -2878,9 +2878,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -2913,9 +2913,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -2960,9 +2960,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -3004,9 +3004,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -3041,9 +3041,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -3089,9 +3089,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -3138,9 +3138,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -3182,9 +3182,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -3231,9 +3231,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -3290,9 +3290,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -3350,9 +3350,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -3400,9 +3400,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -3454,9 +3454,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -3509,9 +3509,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -3560,9 +3560,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -3604,9 +3604,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -3653,9 +3653,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   fe.RegisterMerges();
@@ -3697,9 +3697,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   EXPECT_TRUE(fe.VerifyHeaderContinueMergeOrder());
@@ -3729,9 +3729,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   EXPECT_TRUE(fe.VerifyHeaderContinueMergeOrder());
@@ -3764,9 +3764,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   EXPECT_TRUE(fe.VerifyHeaderContinueMergeOrder());
@@ -3803,9 +3803,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   EXPECT_TRUE(fe.VerifyHeaderContinueMergeOrder());
@@ -3847,9 +3847,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   EXPECT_TRUE(fe.VerifyHeaderContinueMergeOrder());
@@ -3876,9 +3876,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   EXPECT_TRUE(fe.VerifyHeaderContinueMergeOrder());
@@ -3905,9 +3905,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   EXPECT_TRUE(fe.VerifyHeaderContinueMergeOrder());
@@ -3936,9 +3936,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   EXPECT_TRUE(fe.VerifyHeaderContinueMergeOrder());
@@ -3967,9 +3967,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   EXPECT_TRUE(fe.VerifyHeaderContinueMergeOrder());
@@ -4003,9 +4003,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   EXPECT_TRUE(fe.VerifyHeaderContinueMergeOrder());
@@ -4043,9 +4043,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   EXPECT_TRUE(fe.VerifyHeaderContinueMergeOrder());
@@ -4065,9 +4065,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   EXPECT_TRUE(fe.VerifyHeaderContinueMergeOrder());
@@ -4099,9 +4099,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   EXPECT_TRUE(fe.VerifyHeaderContinueMergeOrder());
@@ -4137,9 +4137,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   EXPECT_TRUE(fe.VerifyHeaderContinueMergeOrder());
@@ -4175,9 +4175,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   EXPECT_TRUE(fe.VerifyHeaderContinueMergeOrder());
@@ -4210,9 +4210,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   EXPECT_TRUE(fe.VerifyHeaderContinueMergeOrder());
@@ -4248,9 +4248,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   EXPECT_TRUE(fe.VerifyHeaderContinueMergeOrder());
@@ -4278,9 +4278,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   EXPECT_TRUE(fe.VerifyHeaderContinueMergeOrder());
@@ -4321,9 +4321,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe)) << p->error();
   // Some further processing
   EXPECT_THAT(
@@ -4352,9 +4352,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe)) << p->error();
   EXPECT_THAT(p->error(), Eq("Invalid function exit at block 50 from continue "
                              "construct starting at 50"));
@@ -4380,9 +4380,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(p->error(), Eq("Invalid function exit at block 50 from continue "
                              "construct starting at 50"));
@@ -4408,9 +4408,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(p->error(), Eq("Invalid function exit at block 50 from continue "
                              "construct starting at 50"));
@@ -4436,9 +4436,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(
       p->error(),
@@ -4469,9 +4469,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(p->error(),
               Eq("Invalid exit (50->20) from continue construct: 50 is not the "
@@ -4503,9 +4503,9 @@
      %99 = OpLabel ; outer merge
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(p->error(), Eq("Invalid backedge (50->10): does not branch to "
                              "the corresponding loop header, expected 20"));
@@ -4525,9 +4525,9 @@
      %99 = OpLabel ; outer merge
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi20 = fe.GetBlockInfo(20);
@@ -4557,9 +4557,9 @@
      %99 = OpLabel ; outer merge
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi40 = fe.GetBlockInfo(40);
@@ -4593,9 +4593,9 @@
      %99 = OpLabel ; outer merge
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi50 = fe.GetBlockInfo(50);
@@ -4629,9 +4629,9 @@
      %99 = OpLabel ; outer merge
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe)) << p->error();
 
   auto* bi50 = fe.GetBlockInfo(50);
@@ -4663,9 +4663,9 @@
      %99 = OpLabel ; outer merge
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(p->error(),
               Eq("Invalid exit (40->99) from continue construct: 40 is not the "
@@ -4688,9 +4688,9 @@
      %99 = OpLabel ; outer merge
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(20);
@@ -4716,9 +4716,9 @@
      %99 = OpLabel ; outer merge
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(20);
@@ -4747,9 +4747,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(20);
@@ -4775,9 +4775,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(30);
@@ -4800,9 +4800,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(20);
@@ -4828,9 +4828,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   // Then clause
@@ -4863,9 +4863,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(
       p->error(),
@@ -4903,9 +4903,9 @@
      %99 = OpLabel ; if-selection's merge
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(
       p->error(),
@@ -4927,9 +4927,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(10);
@@ -4952,9 +4952,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(20);
@@ -4980,9 +4980,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(30);
@@ -5005,9 +5005,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(10);
@@ -5037,9 +5037,9 @@
      %99 = OpLabel ; outer merge
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(30);
@@ -5069,9 +5069,9 @@
      %99 = OpLabel ; outer merge
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(30);
@@ -5097,9 +5097,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(
       p->error(),
@@ -5132,9 +5132,9 @@
      %99 = OpLabel ; outer merge
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(
       p->error(),
@@ -5164,9 +5164,9 @@
      %99 = OpLabel ; outer merge
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(
       p->error(),
@@ -5194,9 +5194,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(30);
@@ -5228,9 +5228,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(60);
@@ -5259,9 +5259,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(30);
@@ -5298,9 +5298,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(40);
@@ -5337,9 +5337,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(40);
@@ -5379,9 +5379,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(p->error(),
               Eq("Invalid exit (50->99) from continue construct: 50 is not the "
@@ -5413,9 +5413,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(
       p->error(),
@@ -5450,9 +5450,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(
       p->error(),
@@ -5480,9 +5480,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(30);
@@ -5518,9 +5518,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(40);
@@ -5556,9 +5556,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(40);
@@ -5595,9 +5595,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe)) << p->error();
 
   auto* bi = fe.GetBlockInfo(40);
@@ -5631,9 +5631,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   EXPECT_TRUE(fe.VerifyHeaderContinueMergeOrder());
@@ -5669,9 +5669,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   EXPECT_TRUE(fe.VerifyHeaderContinueMergeOrder());
@@ -5710,9 +5710,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe)) << p->error();
 
   auto* bi = fe.GetBlockInfo(40);
@@ -5750,9 +5750,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(40);
@@ -5801,9 +5801,9 @@
 
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(
       p->error(),
@@ -5831,9 +5831,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(30);
@@ -5862,9 +5862,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(30);
@@ -5893,9 +5893,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(30);
@@ -5933,9 +5933,9 @@
      %99 = OpLabel ; if-selection's merge
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(
       p->error(),
@@ -5967,9 +5967,9 @@
      %99 = OpLabel ; if-selection's merge
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(p->error(),
               Eq("Control flow diverges at block 20 (to 25, 30) but it is not "
@@ -6013,9 +6013,9 @@
      %99 = OpLabel ; loop merge
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(p->error(),
               Eq("Invalid exit (40->20) from continue construct: 40 is not the "
@@ -6052,9 +6052,9 @@
      %99 = OpLabel ; switch merge
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowFindSwitchCaseHeaders(&fe));
   EXPECT_THAT(fe.block_order(), ElementsAre(10, 20, 40, 50, 99));
   EXPECT_THAT(p->error(),
@@ -6095,9 +6095,9 @@
      %99 = OpLabel ; switch merge
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(p->error(), Eq("Branch from 10 to 50 bypasses continue target 40 "
                              "(dominance rule violated)"));
@@ -6136,9 +6136,9 @@
      %99 = OpLabel ; switch merge
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(fe.block_order(), ElementsAre(10, 20, 40, 50, 49, 99));
   EXPECT_THAT(p->error(), Eq("Branch from 10 to 50 bypasses continue target 40 "
@@ -6180,9 +6180,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(
       p->error(),
@@ -6226,9 +6226,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(
       p->error(),
@@ -6249,9 +6249,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(10);
@@ -6274,9 +6274,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(10);
@@ -6299,9 +6299,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(10);
@@ -6327,9 +6327,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(10);
@@ -6358,9 +6358,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(20);
@@ -6391,9 +6391,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(
       p->error(),
@@ -6422,9 +6422,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(
       p->error(),
@@ -6456,9 +6456,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(p->error(),
               // Weird error, but still we caught it.
@@ -6496,9 +6496,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(
       p->error(),
@@ -6530,9 +6530,9 @@
      %80 = OpLabel
      OpBranch %60 ; bad branch
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(
       p->error(),
@@ -6563,9 +6563,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowFindSwitchCaseHeaders(&fe));
   EXPECT_THAT(p->error(),
               Eq("Block 50 is a case block for switch-selection header 10 and "
@@ -6595,9 +6595,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowFindSwitchCaseHeaders(&fe));
   EXPECT_THAT(p->error(),
               Eq("Block 50 is the default block for switch-selection header 10 "
@@ -6624,9 +6624,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(
       p->error(),
@@ -6649,9 +6649,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(p->error(),
               Eq("Control flow diverges at block 20 (to 30, 40) but it is not "
@@ -6674,9 +6674,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(p->error(),
               Eq("Control flow diverges at block 10 (to 99, 20) but it is not "
@@ -6708,9 +6708,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(20);
@@ -6745,9 +6745,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi20 = fe.GetBlockInfo(20);
@@ -6786,9 +6786,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi10 = fe.GetBlockInfo(10);
@@ -6809,9 +6809,9 @@
      %10 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
 
   auto* bi = fe.GetBlockInfo(10);
@@ -6838,9 +6838,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowFindIfSelectionInternalHeaders(&fe));
 
   auto* bi10 = fe.GetBlockInfo(10);
@@ -6882,9 +6882,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowFindIfSelectionInternalHeaders(&fe));
 
   auto* bi10 = fe.GetBlockInfo(10);
@@ -6920,9 +6920,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowFindIfSelectionInternalHeaders(&fe));
 
   auto* bi10 = fe.GetBlockInfo(10);
@@ -6961,9 +6961,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowFindIfSelectionInternalHeaders(&fe));
 
   EXPECT_THAT(fe.block_order(), ElementsAre(10, 20, 80, 99));
@@ -6995,9 +6995,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowFindIfSelectionInternalHeaders(&fe));
 
   EXPECT_THAT(fe.block_order(), ElementsAre(10, 20, 30, 80, 99));
@@ -7030,9 +7030,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowFindIfSelectionInternalHeaders(&fe));
 
   EXPECT_THAT(fe.block_order(), ElementsAre(10, 20, 30, 80, 99));
@@ -7065,9 +7065,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowFindIfSelectionInternalHeaders(&fe));
 
   EXPECT_THAT(fe.block_order(), ElementsAre(10, 30, 20, 80, 99));
@@ -7106,9 +7106,9 @@
      %99 = OpLabel
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   // Error out sooner in the flow
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(p->error(),
@@ -7135,9 +7135,9 @@
      OpReturn
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(fe.block_order(), ElementsAre(10, 20, 80, 99));
 
@@ -7173,9 +7173,9 @@
      OpReturn
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(fe.block_order(), ElementsAre(10, 20, 30, 80, 99));
 
@@ -7210,9 +7210,9 @@
      OpReturn
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(fe.block_order(), ElementsAre(10, 20, 30, 80, 99));
 
@@ -7248,9 +7248,9 @@
      %99 = OpLabel ; outer merge
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowFindIfSelectionInternalHeaders(&fe));
   EXPECT_THAT(
       p->error(),
@@ -7280,9 +7280,9 @@
      %99 = OpLabel ; outer merge
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowFindIfSelectionInternalHeaders(&fe));
   EXPECT_THAT(
       p->error(),
@@ -7318,9 +7318,9 @@
      %99 = OpLabel ; outer merge
      OpReturn
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowFindIfSelectionInternalHeaders(&fe));
   EXPECT_THAT(p->error(),
               Eq("Block 70 is the merge block for 50 but has alternate paths "
@@ -7357,9 +7357,9 @@
      OpReturn
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -7467,9 +7467,9 @@
      OpReturn
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -7592,9 +7592,9 @@
      OpReturn
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error() << assembly;
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -7758,9 +7758,9 @@
      OpReturn
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   fe.RegisterBasicBlocks();
   fe.ComputeBlockOrderAndPositions();
   EXPECT_TRUE(fe.VerifyHeaderContinueMergeOrder());
@@ -7770,7 +7770,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_If_Empty) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -7782,7 +7782,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(If{
@@ -7797,7 +7797,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_If_Then_NoElse) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -7816,7 +7816,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -7843,7 +7843,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_If_NoThen_Else) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -7862,7 +7862,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -7893,7 +7893,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_If_Then_Else) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -7916,7 +7916,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -7954,7 +7954,7 @@
   // TODO(dneto): This should get an extra if(true) around
   // the premerge code.
   // See https://bugs.chromium.org/p/tint/issues/detail?id=82
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -7981,7 +7981,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -8028,7 +8028,7 @@
 
 TEST_F(SpvParserTest, EmitBody_If_Then_Premerge) {
   // The premerge *is* the else.
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -8051,7 +8051,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -8090,7 +8090,7 @@
 
 TEST_F(SpvParserTest, EmitBody_If_Else_Premerge) {
   // The premerge *is* the then-clause.
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -8113,7 +8113,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -8155,7 +8155,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_If_Nest_If) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -8196,7 +8196,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -8265,7 +8265,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Loop_SingleBlock_TrueBackedge) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -8284,7 +8284,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -8318,7 +8318,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Loop_SingleBlock_FalseBackedge) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -8337,7 +8337,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -8367,7 +8367,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Loop_SingleBlock_BothBackedge) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -8386,7 +8386,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -8408,7 +8408,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Loop_SingleBlock_UnconditionalBackege) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -8427,7 +8427,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -8449,7 +8449,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Loop_Unconditional_Body_SingleBlockContinue) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -8476,7 +8476,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -8508,7 +8508,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Loop_Unconditional_Body_MultiBlockContinue) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -8539,7 +8539,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -8575,7 +8575,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Loop_Unconditional_Body_ContinueNestIf) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -8611,7 +8611,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -8659,7 +8659,7 @@
 
 TEST_F(SpvParserTest, EmitBody_Loop_MultiBlockContinueIsEntireLoop) {
   // Test case where both branches exit. e.g both go to merge.
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -8682,7 +8682,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -8716,7 +8716,7 @@
 
 TEST_F(SpvParserTest, EmitBody_Loop_Never) {
   // Test case where both branches exit. e.g both go to merge.
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -8738,7 +8738,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Loop{
   Assignment{
@@ -8770,7 +8770,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Loop_TrueToBody_FalseBreaks) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -8796,7 +8796,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Loop{
   Assignment{
@@ -8835,7 +8835,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Loop_FalseToBody_TrueBreaks) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -8861,7 +8861,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Loop{
   Assignment{
@@ -8901,7 +8901,7 @@
 
 TEST_F(SpvParserTest, EmitBody_Loop_NestedIfContinue) {
   // By construction, it has to come from nested code.
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -8933,7 +8933,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Loop{
   If{
@@ -8964,7 +8964,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Loop_BodyAlwaysBreaks) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -8988,7 +8988,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Loop{
@@ -9011,7 +9011,7 @@
 TEST_F(SpvParserTest, EmitBody_Loop_BodyConditionallyBreaks_FromTrue) {
   // The else-branch has a continue but it's skipped because it's from a
   // block that immediately precedes the continue construct.
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -9035,7 +9035,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Loop{
@@ -9065,7 +9065,7 @@
 TEST_F(SpvParserTest, EmitBody_Loop_BodyConditionallyBreaks_FromFalse) {
   // The else-branch has a continue but it's skipped because it's from a
   // block that immediately precedes the continue construct.
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -9089,7 +9089,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Loop{
@@ -9121,7 +9121,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Loop_BodyConditionallyBreaks_FromTrue_Early) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -9149,7 +9149,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Loop{
@@ -9181,7 +9181,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Loop_BodyConditionallyBreaks_FromFalse_Early) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -9209,7 +9209,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Loop{
@@ -9245,7 +9245,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Switch_DefaultIsMerge_NoCases) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -9260,7 +9260,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -9284,7 +9284,7 @@
 
 // First do no special control flow: no fallthroughs, breaks, continues.
 TEST_F(SpvParserTest, EmitBody_Switch_DefaultIsMerge_OneCase) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -9303,7 +9303,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -9332,7 +9332,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Switch_DefaultIsMerge_TwoCases) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -9355,7 +9355,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -9390,7 +9390,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Switch_DefaultIsMerge_CasesWithDup) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -9413,7 +9413,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -9450,7 +9450,7 @@
 TEST_F(SpvParserTest, EmitBody_Switch_DefaultIsCase_NoDupCases) {
   // The default block is not the merge block. But not the same as a case
   // either.
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -9477,7 +9477,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -9519,7 +9519,7 @@
   // The default block is not the merge block and is the same as a case.
   // We emit the default case separately, but just before the labeled
   // case, and with a fallthrough.
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -9546,7 +9546,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -9588,7 +9588,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Switch_Case_SintValue) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -9616,7 +9616,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -9657,7 +9657,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Switch_Case_UintValue) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -9684,7 +9684,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -9725,7 +9725,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Return_TopLevel) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -9734,7 +9734,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Return{}
@@ -9742,7 +9742,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Return_InsideIf) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -9758,7 +9758,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(If{
@@ -9774,7 +9774,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Return_InsideLoop) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -9796,7 +9796,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Loop{
@@ -9807,7 +9807,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_ReturnValue_TopLevel) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %200 = OpFunction %uint None %uintfn
 
      %210 = OpLabel
@@ -9824,7 +9824,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(200));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 200));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Return{
@@ -9836,7 +9836,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_ReturnValue_InsideIf) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %200 = OpFunction %uint None %uintfn
 
      %210 = OpLabel
@@ -9861,7 +9861,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(200));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 200));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(If{
@@ -9885,7 +9885,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_ReturnValue_Loop) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %200 = OpFunction %void None %voidfn
 
      %210 = OpLabel
@@ -9916,7 +9916,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(200));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 200));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Loop{
@@ -9935,7 +9935,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Kill_TopLevel) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -9944,7 +9944,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Discard{}
@@ -9952,7 +9952,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Kill_InsideIf) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -9968,7 +9968,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(If{
@@ -9984,7 +9984,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Kill_InsideLoop) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -10006,7 +10006,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Loop{
@@ -10017,7 +10017,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Unreachable_TopLevel) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -10026,7 +10026,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Return{}
@@ -10034,7 +10034,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Unreachable_InsideIf) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -10050,7 +10050,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(If{
@@ -10066,7 +10066,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Unreachable_InsideLoop) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -10088,7 +10088,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Loop{
@@ -10099,7 +10099,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Unreachable_InNonVoidFunction) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %200 = OpFunction %uint None %uintfn
 
      %210 = OpLabel
@@ -10116,7 +10116,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(200));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 200));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Return{
@@ -10128,7 +10128,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Branch_BackEdge_MultiBlockLoop) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -10148,7 +10148,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Loop{
@@ -10164,7 +10164,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Branch_BackEdge_SingleBlockLoop) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -10181,7 +10181,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Loop{
@@ -10197,7 +10197,7 @@
 TEST_F(SpvParserTest, EmitBody_Branch_SwitchBreak_LastInCase) {
   // When the break is last in its case, we omit it because it's implicit in
   // WGSL.
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -10216,7 +10216,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -10246,7 +10246,7 @@
 
 TEST_F(SpvParserTest, EmitBody_Branch_SwitchBreak_NotLastInCase) {
   // When the break is not last in its case, we must emit a 'break'
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -10274,7 +10274,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -10319,7 +10319,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Branch_LoopBreak_MultiBlockLoop_FromBody) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -10343,7 +10343,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Loop{
@@ -10368,7 +10368,7 @@
     EmitBody_Branch_LoopBreak_MultiBlockLoop_FromContinueConstructConditional) {
   // This case is invalid because the backedge block doesn't post-dominate the
   // continue target.
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -10394,7 +10394,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody()) << p->error();
   EXPECT_THAT(p->error(),
               Eq("Invalid exit (40->99) from continue construct: 40 is not the "
@@ -10404,7 +10404,7 @@
 
 TEST_F(SpvParserTest,
        EmitBody_Branch_LoopBreak_MultiBlockLoop_FromContinueConstructEnd) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -10424,7 +10424,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Loop{
   continuing {
@@ -10440,7 +10440,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Branch_LoopContinue_LastInLoopConstruct) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -10464,7 +10464,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Loop{
   Assignment{
@@ -10484,7 +10484,7 @@
 
 TEST_F(SpvParserTest, EmitBody_Branch_LoopContinue_BeforeLast) {
   // By construction, it has to come from nested code.
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -10516,7 +10516,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Loop{
   If{
@@ -10547,7 +10547,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Branch_LoopContinue_FromSwitch) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -10583,7 +10583,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -10633,7 +10633,7 @@
 
 TEST_F(SpvParserTest, EmitBody_Branch_IfBreak_FromThen) {
   // When unconditional, the if-break must be last in the then clause.
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -10651,7 +10651,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(If{
   (
@@ -10674,7 +10674,7 @@
 
 TEST_F(SpvParserTest, EmitBody_Branch_IfBreak_FromElse) {
   // When unconditional, the if-break must be last in the else clause.
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -10692,7 +10692,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(If{
   (
@@ -10718,7 +10718,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Branch_Fallthrough) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -10741,7 +10741,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -10777,7 +10777,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_Branch_Forward) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -10791,7 +10791,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -10874,7 +10874,7 @@
 //      kForward: dup general case
 
 TEST_F(SpvParserTest, EmitBody_BranchConditional_Back_SingleBlock_Back) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -10893,7 +10893,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -10915,7 +10915,7 @@
 
 TEST_F(SpvParserTest,
        EmitBody_BranchConditional_Back_SingleBlock_LoopBreak_OnTrue) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -10934,7 +10934,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -10964,7 +10964,7 @@
 
 TEST_F(SpvParserTest,
        EmitBody_BranchConditional_Back_SingleBlock_LoopBreak_OnFalse) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -10983,7 +10983,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -11017,7 +11017,7 @@
 
 TEST_F(SpvParserTest,
        EmitBody_BranchConditional_Back_MultiBlock_LoopBreak_OnTrue) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -11039,7 +11039,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -11071,7 +11071,7 @@
 
 TEST_F(SpvParserTest,
        EmitBody_BranchConditional_Back_MultiBlock_LoopBreak_OnFalse) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -11093,7 +11093,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -11131,7 +11131,7 @@
        EmitBody_BranchConditional_SwitchBreak_SwitchBreak_LastInCase) {
   // When the break is last in its case, we omit it because it's implicit in
   // WGSL.
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -11150,7 +11150,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -11181,7 +11181,7 @@
 TEST_F(SpvParserTest,
        EmitBody_BranchConditional_SwitchBreak_SwitchBreak_NotLastInCase) {
   // When the break is not last in its case, we must emit a 'break'
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -11209,7 +11209,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -11254,7 +11254,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_BranchConditional_SwitchBreak_Continue_OnTrue) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -11290,7 +11290,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -11347,7 +11347,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_BranchConditional_SwitchBreak_Continue_OnFalse) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -11383,7 +11383,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -11444,7 +11444,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_BranchConditional_SwitchBreak_Forward_OnTrue) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -11467,7 +11467,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -11511,7 +11511,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_BranchConditional_SwitchBreak_Forward_OnFalse) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -11534,7 +11534,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -11575,7 +11575,7 @@
 
 TEST_F(SpvParserTest,
        EmitBody_BranchConditional_SwitchBreak_Fallthrough_OnTrue) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -11598,7 +11598,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -11647,7 +11647,7 @@
 
 TEST_F(SpvParserTest,
        EmitBody_BranchConditional_SwitchBreak_Fallthrough_OnFalse) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -11670,7 +11670,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -11715,7 +11715,7 @@
 
 TEST_F(SpvParserTest,
        EmitBody_BranchConditional_LoopBreak_SingleBlock_LoopBreak) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -11738,7 +11738,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -11767,7 +11767,7 @@
 
 TEST_F(SpvParserTest,
        EmitBody_BranchConditional_LoopBreak_MultiBlock_LoopBreak) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -11794,7 +11794,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -11826,7 +11826,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_BranchConditional_LoopBreak_Continue_OnTrue) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -11865,7 +11865,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -11920,7 +11920,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_BranchConditional_LoopBreak_Continue_OnFalse) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -11959,7 +11959,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -12016,7 +12016,7 @@
 TEST_F(SpvParserTest,
        EmitBody_BranchConditional_LoopBreak_Fallthrough_IsError) {
   // It's an error because switch break conflicts with loop break.
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -12055,7 +12055,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody()) << p->error();
   EXPECT_THAT(
       p->error(),
@@ -12064,7 +12064,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_BranchConditional_LoopBreak_Forward_OnTrue) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -12096,7 +12096,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -12143,7 +12143,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_BranchConditional_LoopBreak_Forward_OnFalse) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -12175,7 +12175,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -12218,7 +12218,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_BranchConditional_Continue_Continue_FromHeader) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -12241,7 +12241,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -12269,7 +12269,7 @@
 
 TEST_F(SpvParserTest,
        EmitBody_BranchConditional_Continue_Continue_AfterHeader_Unconditional) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -12296,7 +12296,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -12330,7 +12330,7 @@
        EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional) {
   // Create an intervening block so we actually require a "continue" statement
   // instead of just an adjacent fallthrough to the continue target.
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -12366,7 +12366,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -12416,7 +12416,7 @@
     SpvParserTest,
     EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional_EmptyContinuing) {  // NOLINT
   // Like the previous tests, but with an empty continuing clause.
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -12452,7 +12452,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -12493,7 +12493,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_BranchConditional_LoopContinue_FromSwitch) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -12529,7 +12529,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -12578,7 +12578,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_BranchConditional_Continue_IfBreak_OnTrue) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -12615,7 +12615,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -12673,7 +12673,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_BranchConditional_Continue_IfBreak_OnFalse) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -12710,7 +12710,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -12764,7 +12764,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_BranchConditional_Continue_Fallthrough_OnTrue) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -12804,7 +12804,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -12871,7 +12871,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_BranchConditional_Continue_Fallthrough_OnFalse) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -12911,7 +12911,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -12974,7 +12974,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_BranchConditional_Continue_Forward_OnTrue) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -13006,7 +13006,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -13053,7 +13053,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_BranchConditional_Continue_Forward_OnFalse) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -13085,7 +13085,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -13128,7 +13128,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_BranchConditional_IfBreak_IfBreak_Same) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -13147,7 +13147,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -13170,7 +13170,7 @@
 
 TEST_F(SpvParserTest,
        EmitBody_BranchConditional_IfBreak_IfBreak_DifferentIsError) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -13197,7 +13197,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
   EXPECT_THAT(
       p->error(),
@@ -13206,7 +13206,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_BranchConditional_Fallthrough_Fallthrough_Same) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -13229,7 +13229,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -13268,7 +13268,7 @@
        EmitBody_BranchConditional_Fallthrough_NotLastInCase_IsError) {
   // See also
   // ClassifyCFGEdges_Fallthrough_BranchConditionalWith_Forward_IsError.
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -13294,7 +13294,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody());
   // The weird forward branch pulls in 40 as part of the selection rather than
   // as a case.
@@ -13305,7 +13305,7 @@
 }
 
 TEST_F(SpvParserTest, EmitBody_BranchConditional_Forward_Forward_Same) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -13319,7 +13319,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
   Identifier[not set]{var_1}
@@ -13335,7 +13335,7 @@
 
 TEST_F(SpvParserTest,
        EmitBody_BranchConditional_Forward_Forward_Different_IsError) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
 
      %10 = OpLabel
@@ -13351,7 +13351,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody());
   EXPECT_THAT(p->error(),
               Eq("Control flow diverges at block 10 (to 20, 99) but it is not "
@@ -13361,7 +13361,7 @@
 TEST_F(SpvParserTest,
        DISABLED_Switch_NotAsSelectionHeader_NonDefaultBranchesAreContinue) {
   // Adapted from SPIRV-Tools test MissingMergeOneUnseenTargetSwitchGood
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
  %100 = OpFunction %void None %voidfn
  %entry = OpLabel
  OpBranch %loop
@@ -13386,7 +13386,7 @@
  OpFunctionEnd
    )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(unhandled case)"))
       << ToString(fe.ast_body());
@@ -13395,7 +13395,7 @@
 TEST_F(SpvParserTest,
        DISABLED_Switch_NotAsSelectionHeader_DefaultBranchIsContinue) {
   // Adapted from SPIRV-Tools test MissingMergeOneUnseenTargetSwitchGood
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
  %100 = OpFunction %void None %voidfn
  %entry = OpLabel
  OpBranch %loop
@@ -13420,7 +13420,7 @@
  OpFunctionEnd
    )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(unhandled case)"))
       << ToString(fe.ast_body());
@@ -13433,9 +13433,9 @@
      OpReturn
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_EQ(fe.SiblingLoopConstruct(nullptr), nullptr);
 }
 
@@ -13448,9 +13448,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   ASSERT_TRUE(FlowLabelControlFlowConstructs(&fe)) << p->error();
   const Construct* c = fe.GetBlockInfo(10)->construct;
   EXPECT_NE(c, nullptr);
@@ -13473,9 +13473,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   ASSERT_TRUE(FlowLabelControlFlowConstructs(&fe)) << p->error();
   const Construct* c = fe.GetBlockInfo(20)->construct;
   EXPECT_EQ(c->kind, Construct::kContinue);
@@ -13501,10 +13501,10 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << p->error() << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   ASSERT_TRUE(FlowLabelControlFlowConstructs(&fe)) << p->error();
   const Construct* c = fe.GetBlockInfo(20)->construct;
   EXPECT_EQ(c->kind, Construct::kContinue);
@@ -13530,9 +13530,9 @@
 
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   ASSERT_TRUE(FlowLabelControlFlowConstructs(&fe)) << p->error();
   const Construct* c = fe.GetBlockInfo(30)->construct;
   EXPECT_EQ(c->kind, Construct::kContinue);
diff --git a/src/reader/spirv/function_composite_test.cc b/src/reader/spirv/function_composite_test.cc
index 45b17b5..0cc2cc8 100644
--- a/src/reader/spirv/function_composite_test.cc
+++ b/src/reader/spirv/function_composite_test.cc
@@ -82,9 +82,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   VariableConst{
@@ -138,9 +138,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -179,9 +179,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -210,9 +210,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -245,9 +245,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -276,9 +276,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody());
   EXPECT_THAT(p->error(), Eq("CompositeExtract %1 index value 900 is out of "
                              "bounds for vector of 2 elements"));
@@ -296,9 +296,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -327,9 +327,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody()) << p->error();
   EXPECT_THAT(p->error(), Eq("CompositeExtract %2 index value 3 is out of "
                              "bounds for matrix of 3 elements"));
@@ -347,9 +347,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -381,9 +381,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -413,9 +413,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody()) << p->error();
   EXPECT_THAT(p->error(), Eq("can't do OpCompositeExtract on a runtime array"));
 }
@@ -432,9 +432,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -474,9 +474,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -518,9 +518,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody());
   EXPECT_THAT(p->error(), Eq("CompositeExtract %2 index value 40 is out of "
                              "bounds for structure %25 having 3 members"));
@@ -540,9 +540,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -579,9 +579,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   VariableConst{
@@ -617,9 +617,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   VariableConst{
@@ -657,9 +657,9 @@
      OpFunctionEnd
 )";
 
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_10
@@ -699,9 +699,9 @@
      OpFunctionEnd
 )";
 
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_10
@@ -758,9 +758,9 @@
      OpFunctionEnd
 )";
 
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_10
@@ -789,9 +789,9 @@
      OpFunctionEnd
 )";
 
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody()) << p->error();
   EXPECT_THAT(p->error(),
               Eq("invalid vectorshuffle ID %10: index too large: 9"));
diff --git a/src/reader/spirv/function_conversion_test.cc b/src/reader/spirv/function_conversion_test.cc
index ac7dda5..e95afa7 100644
--- a/src/reader/spirv/function_conversion_test.cc
+++ b/src/reader/spirv/function_conversion_test.cc
@@ -78,9 +78,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -104,9 +104,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -134,9 +134,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody());
   EXPECT_THAT(p->error(),
               HasSubstr("unhandled expression for ID 2\n%2 = OpTypeVoid"));
@@ -150,9 +150,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody());
   EXPECT_THAT(p->error(),
               HasSubstr("unhandled expression for ID 2\n%2 = OpTypeVoid"));
@@ -166,9 +166,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody());
   EXPECT_THAT(p->error(),
               HasSubstr("unhandled expression for ID 2\n%2 = OpTypeVoid"));
@@ -182,9 +182,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody());
   EXPECT_THAT(p->error(),
               HasSubstr("unhandled expression for ID 2\n%2 = OpTypeVoid"));
@@ -198,9 +198,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody());
   EXPECT_THAT(p->error(),
               HasSubstr("operand for conversion to floating point must be "
@@ -215,9 +215,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody());
   EXPECT_THAT(
       p->error(),
@@ -234,9 +234,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_1
@@ -261,9 +261,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_1
@@ -290,9 +290,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_1
@@ -317,9 +317,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_1
@@ -345,9 +345,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody());
   EXPECT_THAT(p->error(), Eq("operand for conversion to floating point must be "
                              "integral scalar or vector, but got: __bool"));
@@ -361,9 +361,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody());
   EXPECT_THAT(p->error(),
               Eq("operand for conversion to floating point must be integral "
@@ -379,9 +379,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_1
@@ -408,9 +408,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_1
@@ -435,9 +435,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_1
@@ -464,9 +464,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_1
@@ -490,9 +490,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody());
   EXPECT_THAT(p->error(),
               Eq("operand for conversion to signed integer must be floating "
@@ -507,9 +507,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody());
   EXPECT_THAT(p->error(),
               Eq("operand for conversion to signed integer must be floating "
@@ -525,9 +525,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_1
@@ -552,9 +552,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_1
@@ -581,9 +581,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_1
@@ -608,9 +608,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_1
@@ -636,9 +636,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody());
   EXPECT_THAT(p->error(),
               Eq("operand for conversion to unsigned integer must be floating "
@@ -653,9 +653,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody());
   EXPECT_THAT(p->error(),
               Eq("operand for conversion to unsigned integer must be floating "
@@ -671,9 +671,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_1
@@ -700,9 +700,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_1
@@ -727,9 +727,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_1
@@ -756,9 +756,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableConst{
     x_1
diff --git a/src/reader/spirv/function_decl_test.cc b/src/reader/spirv/function_decl_test.cc
index 6142726..ed1afb6 100644
--- a/src/reader/spirv/function_decl_test.cc
+++ b/src/reader/spirv/function_decl_test.cc
@@ -50,14 +50,14 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctionDeclaration_VoidFunctionWithoutParams) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %100 = OpFunction %void None %voidfn
      %entry = OpLabel
      OpReturn
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitFunctionDeclaration());
   EXPECT_THAT(p->module().to_str(), HasSubstr(R"(
   Function x_100 -> __void
@@ -67,7 +67,7 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctionDeclaration_NonVoidResultType) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %fn_ret_float = OpTypeFunction %float
      %100 = OpFunction %float None %fn_ret_float
      %entry = OpLabel
@@ -75,7 +75,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitFunctionDeclaration());
 
   EXPECT_THAT(p->module().to_str(), HasSubstr(R"(
@@ -86,7 +86,7 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctionDeclaration_MixedParamTypes) {
-  auto* p = parser(test::Assemble(Names({"a", "b", "c"}) + CommonTypes() + R"(
+  auto p = parser(test::Assemble(Names({"a", "b", "c"}) + CommonTypes() + R"(
      %fn_mixed_params = OpTypeFunction %float %uint %float %int
 
      %100 = OpFunction %void None %fn_mixed_params
@@ -98,7 +98,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitFunctionDeclaration());
 
   EXPECT_THAT(p->module().to_str(), HasSubstr(R"(
@@ -125,7 +125,7 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctionDeclaration_GenerateParamNames) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %fn_mixed_params = OpTypeFunction %float %uint %float %int
 
      %100 = OpFunction %void None %fn_mixed_params
@@ -137,7 +137,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitFunctionDeclaration());
 
   EXPECT_THAT(p->module().to_str(), HasSubstr(R"(
diff --git a/src/reader/spirv/function_glsl_std_450_test.cc b/src/reader/spirv/function_glsl_std_450_test.cc
index e333e41..c5ee0cc 100644
--- a/src/reader/spirv/function_glsl_std_450_test.cc
+++ b/src/reader/spirv/function_glsl_std_450_test.cc
@@ -96,9 +96,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -127,9 +127,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -162,9 +162,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -194,9 +194,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -234,9 +234,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -265,9 +265,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -300,9 +300,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -332,9 +332,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -372,9 +372,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -406,9 +406,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
diff --git a/src/reader/spirv/function_logical_test.cc b/src/reader/spirv/function_logical_test.cc
index e50915a..1630a1f 100644
--- a/src/reader/spirv/function_logical_test.cc
+++ b/src/reader/spirv/function_logical_test.cc
@@ -202,9 +202,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -229,9 +229,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -282,11 +282,11 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << p->error() << "\n"
       << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   std::ostringstream ss;
   ss << R"(VariableConst{
@@ -697,9 +697,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -728,9 +728,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -767,9 +767,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -798,9 +798,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -837,9 +837,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -868,9 +868,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -907,9 +907,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -938,9 +938,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -977,9 +977,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -1008,9 +1008,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -1047,9 +1047,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -1078,9 +1078,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -1117,9 +1117,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   VariableConst{
@@ -1148,9 +1148,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   VariableConst{
@@ -1179,9 +1179,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   VariableConst{
@@ -1210,9 +1210,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   VariableConst{
@@ -1249,9 +1249,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   VariableConst{
@@ -1294,9 +1294,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   VariableConst{
@@ -1327,9 +1327,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   VariableConst{
@@ -1360,9 +1360,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   VariableConst{
@@ -1389,9 +1389,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   VariableConst{
@@ -1422,9 +1422,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   VariableConst{
@@ -1451,9 +1451,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   VariableConst{
diff --git a/src/reader/spirv/function_memory_test.cc b/src/reader/spirv/function_memory_test.cc
index 63013cf..86e5189 100644
--- a/src/reader/spirv/function_memory_test.cc
+++ b/src/reader/spirv/function_memory_test.cc
@@ -30,7 +30,7 @@
 using ::testing::HasSubstr;
 
 TEST_F(SpvParserTest, EmitStatement_StoreBoolConst) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      %void = OpTypeVoid
      %voidfn = OpTypeFunction %void
      %ty = OpTypeBool
@@ -48,7 +48,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(Assignment{
   Identifier[not set]{x_1}
@@ -65,7 +65,7 @@
 }
 
 TEST_F(SpvParserTest, EmitStatement_StoreUintConst) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      %void = OpTypeVoid
      %voidfn = OpTypeFunction %void
      %ty = OpTypeInt 32 0
@@ -80,7 +80,7 @@
      OpReturn
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody());
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(Assignment{
   Identifier[not set]{x_1}
@@ -93,7 +93,7 @@
 }
 
 TEST_F(SpvParserTest, EmitStatement_StoreIntConst) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      %void = OpTypeVoid
      %voidfn = OpTypeFunction %void
      %ty = OpTypeInt 32 1
@@ -108,7 +108,7 @@
      OpReturn
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody());
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(Assignment{
   Identifier[not set]{x_1}
@@ -121,7 +121,7 @@
 }
 
 TEST_F(SpvParserTest, EmitStatement_StoreFloatConst) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      %void = OpTypeVoid
      %voidfn = OpTypeFunction %void
      %ty = OpTypeFloat 32
@@ -136,7 +136,7 @@
      OpReturn
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody());
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(Assignment{
   Identifier[not set]{x_1}
@@ -149,7 +149,7 @@
 }
 
 TEST_F(SpvParserTest, EmitStatement_LoadBool) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      %void = OpTypeVoid
      %voidfn = OpTypeFunction %void
      %ty = OpTypeBool
@@ -165,7 +165,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
   VariableConst{
@@ -179,7 +179,7 @@
 }
 
 TEST_F(SpvParserTest, EmitStatement_LoadScalar) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      %void = OpTypeVoid
      %voidfn = OpTypeFunction %void
      %ty = OpTypeInt 32 0
@@ -194,7 +194,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   VariableConst{
@@ -219,7 +219,7 @@
 }
 
 TEST_F(SpvParserTest, EmitStatement_UseLoadedScalarTwice) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      %void = OpTypeVoid
      %voidfn = OpTypeFunction %void
      %ty = OpTypeInt 32 0
@@ -235,7 +235,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   VariableConst{
@@ -259,7 +259,7 @@
 }
 
 TEST_F(SpvParserTest, EmitStatement_StoreToModuleScopeVar) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      %void = OpTypeVoid
      %voidfn = OpTypeFunction %void
      %ty = OpTypeInt 32 0
@@ -272,7 +272,7 @@
      OpReturn
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody());
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(Assignment{
   Identifier[not set]{x_1}
@@ -300,7 +300,7 @@
 }
 
 TEST_F(SpvParserTest, EmitStatement_AccessChain_BaseIsNotPointer) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      %void = OpTypeVoid
      %voidfn = OpTypeFunction %void
      %10 = OpTypeInt 32 0
@@ -336,10 +336,10 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << assembly << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody());
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(Assignment{
   MemberAccessor[not set]{
@@ -369,10 +369,10 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << assembly << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody());
   EXPECT_THAT(p->error(), Eq("Access chain %2 index %42 value 42 is out of "
                              "bounds for vector of 4 elements"));
@@ -399,10 +399,10 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << assembly << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody());
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(Assignment{
   ArrayAccessor[not set]{
@@ -436,10 +436,10 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << assembly << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody());
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(Assignment{
   ArrayAccessor[not set]{
@@ -479,10 +479,10 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << assembly << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody());
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(Assignment{
   ArrayAccessor[not set]{
@@ -521,10 +521,10 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << assembly << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody());
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(Assignment{
   MemberAccessor[not set]{
@@ -569,10 +569,10 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << assembly << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody());
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(Assignment{
   MemberAccessor[not set]{
@@ -615,10 +615,10 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << assembly << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody());
   EXPECT_THAT(p->error(), Eq("Access chain %2 index %10 is a non-constant "
                              "index into a structure %55"));
@@ -646,10 +646,10 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << assembly << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody());
   EXPECT_THAT(p->error(), Eq("Access chain %2 index value 99 is out of bounds "
                              "for structure %55 having 2 members"));
@@ -679,10 +679,10 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << assembly << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody());
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(Assignment{
   ArrayAccessor[not set]{
@@ -719,10 +719,10 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << assembly << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody());
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(Assignment{
   MemberAccessor[not set]{
@@ -754,10 +754,10 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << assembly << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_FALSE(fe.EmitBody());
   EXPECT_THAT(p->error(),
               HasSubstr("Access chain with unknown or invalid pointee type "
@@ -794,7 +794,7 @@
   // of the structure type, arrays of the structure, pointers to them, and
   // OpVariable of these.
   const auto assembly = OldStorageBufferPreamble();
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << assembly << p->error();
   const auto module_str = p->module().to_str();
@@ -828,9 +828,9 @@
   OpReturn
   OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModule()) << assembly << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(Assignment{
   MemberAccessor[not set]{
@@ -867,9 +867,9 @@
   OpReturn
   OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModule()) << assembly << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(Assignment{
   ArrayAccessor[not set]{
@@ -900,9 +900,9 @@
   OpReturn
   OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModule()) << assembly << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   VariableConst{
@@ -955,9 +955,9 @@
 
   OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModule()) << assembly << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(VariableDeclStatement{
   Variable{
diff --git a/src/reader/spirv/function_misc_test.cc b/src/reader/spirv/function_misc_test.cc
index 64207b6..f5d1bd9 100644
--- a/src/reader/spirv/function_misc_test.cc
+++ b/src/reader/spirv/function_misc_test.cc
@@ -63,9 +63,9 @@
      OpReturn
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   VariableConst{
@@ -123,9 +123,9 @@
      OpReturn
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   VariableConst{
@@ -183,9 +183,9 @@
      OpReturn
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   VariableConst{
@@ -224,9 +224,9 @@
      OpReturn
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   VariableConst{
@@ -256,9 +256,9 @@
      OpReturn
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
   VariableConst{
@@ -286,10 +286,10 @@
      OpReturn
      OpFunctionEnd
 )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << p->error() << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Return{}
 )")) << ToString(fe.ast_body());
diff --git a/src/reader/spirv/function_var_test.cc b/src/reader/spirv/function_var_test.cc
index 4c37108..b3e946d 100644
--- a/src/reader/spirv/function_var_test.cc
+++ b/src/reader/spirv/function_var_test.cc
@@ -78,7 +78,7 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctionVariables_AnonymousVars) {
-  auto* p = parser(test::Assemble(Preamble() + R"(
+  auto p = parser(test::Assemble(Preamble() + R"(
      %100 = OpFunction %void None %voidfn
      %entry = OpLabel
      %1 = OpVariable %ptr_uint Function
@@ -88,7 +88,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitFunctionVariables());
 
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
@@ -116,7 +116,7 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctionVariables_NamedVars) {
-  auto* p = parser(test::Assemble(Names({"a", "b", "c"}) + Preamble() + R"(
+  auto p = parser(test::Assemble(Names({"a", "b", "c"}) + Preamble() + R"(
      %100 = OpFunction %void None %voidfn
      %entry = OpLabel
      %a = OpVariable %ptr_uint Function
@@ -126,7 +126,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitFunctionVariables());
 
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
@@ -154,7 +154,7 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctionVariables_MixedTypes) {
-  auto* p = parser(test::Assemble(Names({"a", "b", "c"}) + Preamble() + R"(
+  auto p = parser(test::Assemble(Names({"a", "b", "c"}) + Preamble() + R"(
      %100 = OpFunction %void None %voidfn
      %entry = OpLabel
      %a = OpVariable %ptr_uint Function
@@ -164,7 +164,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitFunctionVariables());
 
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
@@ -192,7 +192,7 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctionVariables_ScalarInitializers) {
-  auto* p =
+  auto p =
       parser(test::Assemble(Names({"a", "b", "c", "d", "e"}) + Preamble() + R"(
      %100 = OpFunction %void None %voidfn
      %entry = OpLabel
@@ -205,7 +205,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitFunctionVariables());
 
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
@@ -262,7 +262,7 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctionVariables_ScalarNullInitializers) {
-  auto* p = parser(test::Assemble(Names({"a", "b", "c", "d"}) + Preamble() + R"(
+  auto p = parser(test::Assemble(Names({"a", "b", "c", "d"}) + Preamble() + R"(
      %null_bool = OpConstantNull %bool
      %null_int = OpConstantNull %int
      %null_uint = OpConstantNull %uint
@@ -278,7 +278,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitFunctionVariables());
 
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
@@ -325,7 +325,7 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctionVariables_VectorInitializer) {
-  auto* p = parser(test::Assemble(Preamble() + R"(
+  auto p = parser(test::Assemble(Preamble() + R"(
      %ptr = OpTypePointer Function %v2float
      %two = OpConstant %float 2.0
      %const = OpConstantComposite %v2float %float_1p5 %two
@@ -337,7 +337,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitFunctionVariables());
 
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
@@ -358,7 +358,7 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctionVariables_MatrixInitializer) {
-  auto* p = parser(test::Assemble(Preamble() + R"(
+  auto p = parser(test::Assemble(Preamble() + R"(
      %ptr = OpTypePointer Function %m3v2float
      %two = OpConstant %float 2.0
      %three = OpConstant %float 3.0
@@ -375,7 +375,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitFunctionVariables());
 
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
@@ -409,7 +409,7 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctionVariables_ArrayInitializer) {
-  auto* p = parser(test::Assemble(Preamble() + R"(
+  auto p = parser(test::Assemble(Preamble() + R"(
      %ptr = OpTypePointer Function %arr2uint
      %two = OpConstant %uint 2
      %const = OpConstantComposite %arr2uint %uint_1 %two
@@ -421,7 +421,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitFunctionVariables());
 
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
@@ -442,7 +442,7 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctionVariables_ArrayInitializer_AliasType) {
-  auto* p = parser(test::Assemble(
+  auto p = parser(test::Assemble(
       std::string("OpDecorate %arr2uint ArrayStride 16\n") + Preamble() + R"(
      %ptr = OpTypePointer Function %arr2uint
      %two = OpConstant %uint 2
@@ -455,7 +455,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitFunctionVariables());
 
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
@@ -476,7 +476,7 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctionVariables_ArrayInitializer_Null) {
-  auto* p = parser(test::Assemble(Preamble() + R"(
+  auto p = parser(test::Assemble(Preamble() + R"(
      %ptr = OpTypePointer Function %arr2uint
      %two = OpConstant %uint 2
      %const = OpConstantNull %arr2uint
@@ -488,7 +488,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitFunctionVariables());
 
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
@@ -509,7 +509,7 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctionVariables_ArrayInitializer_AliasType_Null) {
-  auto* p = parser(test::Assemble(
+  auto p = parser(test::Assemble(
       std::string("OpDecorate %arr2uint ArrayStride 16\n") + Preamble() + R"(
      %ptr = OpTypePointer Function %arr2uint
      %two = OpConstant %uint 2
@@ -522,7 +522,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitFunctionVariables());
 
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
@@ -543,7 +543,7 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctionVariables_StructInitializer) {
-  auto* p = parser(test::Assemble(Preamble() + R"(
+  auto p = parser(test::Assemble(Preamble() + R"(
      %ptr = OpTypePointer Function %strct
      %two = OpConstant %uint 2
      %arrconst = OpConstantComposite %arr2uint %uint_1 %two
@@ -556,7 +556,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitFunctionVariables());
 
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
@@ -582,7 +582,7 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctionVariables_StructInitializer_Null) {
-  auto* p = parser(test::Assemble(Preamble() + R"(
+  auto p = parser(test::Assemble(Preamble() + R"(
      %ptr = OpTypePointer Function %strct
      %two = OpConstant %uint 2
      %arrconst = OpConstantComposite %arr2uint %uint_1 %two
@@ -595,7 +595,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitFunctionVariables());
 
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(VariableDeclStatement{
@@ -637,9 +637,9 @@
 
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(VariableDeclStatement{
@@ -682,9 +682,9 @@
 
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(VariableDeclStatement{
@@ -752,9 +752,9 @@
 
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(VariableDeclStatement{
@@ -849,9 +849,9 @@
 
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Assignment{
@@ -963,9 +963,9 @@
 
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   // We don't hoist x_1 into its own mutable variable. It is emitted as
@@ -1048,9 +1048,9 @@
 
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(If{
@@ -1133,9 +1133,9 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(If{
@@ -1212,9 +1212,9 @@
 
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   // We don't hoist x_1 into its own mutable variable. It is emitted as
@@ -1286,9 +1286,9 @@
 
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Loop{
@@ -1428,9 +1428,9 @@
 
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(Loop{
@@ -1583,10 +1583,10 @@
 
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << assembly << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(VariableDeclStatement{
@@ -1752,9 +1752,9 @@
 
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(VariableDeclStatement{
@@ -1872,9 +1872,9 @@
 
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(VariableDeclStatement{
@@ -1978,9 +1978,9 @@
                OpFunctionEnd
 
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
 
   EXPECT_THAT(ToString(fe.ast_body()), Eq(R"(VariableDeclStatement{
diff --git a/src/reader/spirv/parser_impl_convert_member_decoration_test.cc b/src/reader/spirv/parser_impl_convert_member_decoration_test.cc
index aa75424..9f95d0a 100644
--- a/src/reader/spirv/parser_impl_convert_member_decoration_test.cc
+++ b/src/reader/spirv/parser_impl_convert_member_decoration_test.cc
@@ -32,7 +32,7 @@
 using ::testing::Eq;
 
 TEST_F(SpvParserTest, ConvertMemberDecoration_Empty) {
-  auto* p = parser(std::vector<uint32_t>{});
+  auto p = parser(std::vector<uint32_t>{});
 
   auto* result = p->ConvertMemberDecoration(1, 1, {});
   EXPECT_EQ(result, nullptr);
@@ -40,7 +40,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertMemberDecoration_OffsetWithoutOperand) {
-  auto* p = parser(std::vector<uint32_t>{});
+  auto p = parser(std::vector<uint32_t>{});
 
   auto* result = p->ConvertMemberDecoration(12, 13, {SpvDecorationOffset});
   EXPECT_EQ(result, nullptr);
@@ -49,7 +49,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertMemberDecoration_OffsetWithTooManyOperands) {
-  auto* p = parser(std::vector<uint32_t>{});
+  auto p = parser(std::vector<uint32_t>{});
 
   auto* result =
       p->ConvertMemberDecoration(12, 13, {SpvDecorationOffset, 3, 4});
@@ -59,7 +59,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertMemberDecoration_Offset) {
-  auto* p = parser(std::vector<uint32_t>{});
+  auto p = parser(std::vector<uint32_t>{});
 
   auto* result = p->ConvertMemberDecoration(1, 1, {SpvDecorationOffset, 8});
   ASSERT_NE(result, nullptr);
@@ -71,7 +71,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertMemberDecoration_UnhandledDecoration) {
-  auto* p = parser(std::vector<uint32_t>{});
+  auto p = parser(std::vector<uint32_t>{});
 
   auto* result = p->ConvertMemberDecoration(12, 13, {12345678});
   EXPECT_EQ(result, nullptr);
diff --git a/src/reader/spirv/parser_impl_convert_type_test.cc b/src/reader/spirv/parser_impl_convert_type_test.cc
index aaba532..5cbb1e0 100644
--- a/src/reader/spirv/parser_impl_convert_type_test.cc
+++ b/src/reader/spirv/parser_impl_convert_type_test.cc
@@ -37,7 +37,7 @@
 using ::testing::Eq;
 
 TEST_F(SpvParserTest, ConvertType_PreservesExistingFailure) {
-  auto* p = parser(std::vector<uint32_t>{});
+  auto p = parser(std::vector<uint32_t>{});
   p->Fail() << "boing";
   auto* type = p->ConvertType(10);
   EXPECT_EQ(type, nullptr);
@@ -45,7 +45,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_RequiresInternalRepresntation) {
-  auto* p = parser(std::vector<uint32_t>{});
+  auto p = parser(std::vector<uint32_t>{});
   auto* type = p->ConvertType(10);
   EXPECT_EQ(type, nullptr);
   EXPECT_THAT(
@@ -54,7 +54,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_NotAnId) {
-  auto* p = parser(test::Assemble("%1 = OpExtInstImport \"GLSL.std.450\""));
+  auto p = parser(test::Assemble("%1 = OpExtInstImport \"GLSL.std.450\""));
   EXPECT_TRUE(p->BuildInternalModule());
 
   auto* type = p->ConvertType(10);
@@ -64,7 +64,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_IdExistsButIsNotAType) {
-  auto* p = parser(test::Assemble("%1 = OpExtInstImport \"GLSL.std.450\""));
+  auto p = parser(test::Assemble("%1 = OpExtInstImport \"GLSL.std.450\""));
   EXPECT_TRUE(p->BuildInternalModule());
 
   auto* type = p->ConvertType(1);
@@ -74,7 +74,7 @@
 
 TEST_F(SpvParserTest, ConvertType_UnhandledType) {
   // Pipes are an OpenCL type. Tint doesn't support them.
-  auto* p = parser(test::Assemble("%70 = OpTypePipe WriteOnly"));
+  auto p = parser(test::Assemble("%70 = OpTypePipe WriteOnly"));
   EXPECT_TRUE(p->BuildInternalModule());
 
   auto* type = p->ConvertType(70);
@@ -84,7 +84,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_Void) {
-  auto* p = parser(test::Assemble("%1 = OpTypeVoid"));
+  auto p = parser(test::Assemble("%1 = OpTypeVoid"));
   EXPECT_TRUE(p->BuildInternalModule());
 
   auto* type = p->ConvertType(1);
@@ -93,7 +93,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_Bool) {
-  auto* p = parser(test::Assemble("%100 = OpTypeBool"));
+  auto p = parser(test::Assemble("%100 = OpTypeBool"));
   EXPECT_TRUE(p->BuildInternalModule());
 
   auto* type = p->ConvertType(100);
@@ -102,7 +102,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_I32) {
-  auto* p = parser(test::Assemble("%2 = OpTypeInt 32 1"));
+  auto p = parser(test::Assemble("%2 = OpTypeInt 32 1"));
   EXPECT_TRUE(p->BuildInternalModule());
 
   auto* type = p->ConvertType(2);
@@ -111,7 +111,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_U32) {
-  auto* p = parser(test::Assemble("%3 = OpTypeInt 32 0"));
+  auto p = parser(test::Assemble("%3 = OpTypeInt 32 0"));
   EXPECT_TRUE(p->BuildInternalModule());
 
   auto* type = p->ConvertType(3);
@@ -120,7 +120,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_F32) {
-  auto* p = parser(test::Assemble("%4 = OpTypeFloat 32"));
+  auto p = parser(test::Assemble("%4 = OpTypeFloat 32"));
   EXPECT_TRUE(p->BuildInternalModule());
 
   auto* type = p->ConvertType(4);
@@ -129,7 +129,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_BadIntWidth) {
-  auto* p = parser(test::Assemble("%5 = OpTypeInt 17 1"));
+  auto p = parser(test::Assemble("%5 = OpTypeInt 17 1"));
   EXPECT_TRUE(p->BuildInternalModule());
 
   auto* type = p->ConvertType(5);
@@ -138,7 +138,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_BadFloatWidth) {
-  auto* p = parser(test::Assemble("%6 = OpTypeFloat 19"));
+  auto p = parser(test::Assemble("%6 = OpTypeFloat 19"));
   EXPECT_TRUE(p->BuildInternalModule());
 
   auto* type = p->ConvertType(6);
@@ -147,7 +147,7 @@
 }
 
 TEST_F(SpvParserTest, DISABLED_ConvertType_InvalidVectorElement) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     %5 = OpTypePipe ReadOnly
     %20 = OpTypeVector %5 2
   )"));
@@ -159,7 +159,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_VecOverF32) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     %float = OpTypeFloat 32
     %20 = OpTypeVector %float 2
     %30 = OpTypeVector %float 3
@@ -186,7 +186,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_VecOverI32) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     %int = OpTypeInt 32 1
     %20 = OpTypeVector %int 2
     %30 = OpTypeVector %int 3
@@ -213,7 +213,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_VecOverU32) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     %uint = OpTypeInt 32 0
     %20 = OpTypeVector %uint 2
     %30 = OpTypeVector %uint 3
@@ -240,7 +240,7 @@
 }
 
 TEST_F(SpvParserTest, DISABLED_ConvertType_InvalidMatrixElement) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     %5 = OpTypePipe ReadOnly
     %10 = OpTypeVector %5 2
     %20 = OpTypeMatrix %10 2
@@ -254,7 +254,7 @@
 
 TEST_F(SpvParserTest, ConvertType_MatrixOverF32) {
   // Matrices are only defined over floats.
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     %float = OpTypeFloat 32
     %v2 = OpTypeVector %float 2
     %v3 = OpTypeVector %float 3
@@ -331,7 +331,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_RuntimeArray) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     %uint = OpTypeInt 32 0
     %10 = OpTypeRuntimeArray %uint
   )"));
@@ -353,7 +353,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_RuntimeArray_InvalidDecoration) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpDecorate %10 Block
     %uint = OpTypeInt 32 0
     %10 = OpTypeRuntimeArray %uint
@@ -367,7 +367,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_RuntimeArray_ArrayStride_Valid) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpDecorate %10 ArrayStride 64
     %uint = OpTypeInt 32 0
     %10 = OpTypeRuntimeArray %uint
@@ -384,7 +384,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_RuntimeArray_ArrayStride_ZeroIsError) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpDecorate %10 ArrayStride 0
     %uint = OpTypeInt 32 0
     %10 = OpTypeRuntimeArray %uint
@@ -398,7 +398,7 @@
 
 TEST_F(SpvParserTest,
        ConvertType_RuntimeArray_ArrayStride_SpecifiedTwiceIsError) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpDecorate %10 ArrayStride 64
     OpDecorate %10 ArrayStride 64
     %uint = OpTypeInt 32 0
@@ -412,7 +412,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_Array) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     %uint = OpTypeInt 32 0
     %uint_42 = OpConstant %uint 42
     %10 = OpTypeArray %uint %uint_42
@@ -435,7 +435,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_ArrayBadLengthIsSpecConstantValue) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpDecorate %uint_42 SpecId 12
     %uint = OpTypeInt 32 0
     %uint_42 = OpSpecConstant %uint 42
@@ -450,7 +450,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_ArrayBadLengthIsSpecConstantExpr) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     %uint = OpTypeInt 32 0
     %uint_42 = OpConstant %uint 42
     %sum = OpSpecConstantOp %uint IAdd %uint_42 %uint_42
@@ -469,7 +469,7 @@
 // optimizer representation doesn't handle it and asserts out instead.
 
 TEST_F(SpvParserTest, ConvertType_ArrayBadTooBig) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     %uint64 = OpTypeInt 64 0
     %uint64_big = OpConstant %uint64 5000000000
     %10 = OpTypeArray %uint64 %uint64_big
@@ -484,7 +484,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_Array_InvalidDecoration) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpDecorate %10 Block
     %uint = OpTypeInt 32 0
     %uint_5 = OpConstant %uint 5
@@ -499,7 +499,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_ArrayStride_Valid) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpDecorate %10 ArrayStride 8
     %uint = OpTypeInt 32 0
     %uint_5 = OpConstant %uint 5
@@ -518,7 +518,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_ArrayStride_ZeroIsError) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpDecorate %10 ArrayStride 0
     %uint = OpTypeInt 32 0
     %uint_5 = OpConstant %uint 5
@@ -533,7 +533,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_ArrayStride_SpecifiedTwiceIsError) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpDecorate %10 ArrayStride 4
     OpDecorate %10 ArrayStride 4
     %uint = OpTypeInt 32 0
@@ -549,7 +549,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_StructTwoMembers) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     %uint = OpTypeInt 32 0
     %float = OpTypeFloat 32
     %10 = OpTypeStruct %uint %float
@@ -570,7 +570,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_StructWithBlockDecoration) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpDecorate %10 Block
     %uint = OpTypeInt 32 0
     %10 = OpTypeStruct %uint
@@ -591,7 +591,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_StructWithMemberDecorations) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpMemberDecorate %10 0 Offset 0
     OpMemberDecorate %10 1 Offset 8
     OpMemberDecorate %10 2 Offset 16
@@ -623,7 +623,7 @@
 
 TEST_F(SpvParserTest, ConvertType_InvalidPointeetype) {
   // Disallow pointer-to-function
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
   %void = OpTypeVoid
   %42 = OpTypeFunction %void
   %3 = OpTypePointer Input %42
@@ -638,7 +638,7 @@
 
 TEST_F(SpvParserTest, DISABLED_ConvertType_InvalidStorageClass) {
   // Disallow invalid storage class
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
   %1 = OpTypeFloat 32
   %3 = OpTypePointer !999 %1   ; Special syntax to inject 999 as the storage class
   )"));
@@ -647,7 +647,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_PointerInput) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
   %float = OpTypeFloat 32
   %3 = OpTypePointer Input %float
   )"));
@@ -663,7 +663,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_PointerOutput) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
   %float = OpTypeFloat 32
   %3 = OpTypePointer Output %float
   )"));
@@ -679,7 +679,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_PointerUniform) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
   %float = OpTypeFloat 32
   %3 = OpTypePointer Uniform %float
   )"));
@@ -695,7 +695,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_PointerWorkgroup) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
   %float = OpTypeFloat 32
   %3 = OpTypePointer Workgroup %float
   )"));
@@ -711,7 +711,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_PointerUniformConstant) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
   %float = OpTypeFloat 32
   %3 = OpTypePointer UniformConstant %float
   )"));
@@ -727,7 +727,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_PointerStorageBuffer) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
   %float = OpTypeFloat 32
   %3 = OpTypePointer StorageBuffer %float
   )"));
@@ -743,7 +743,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_PointerImage) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
   %float = OpTypeFloat 32
   %3 = OpTypePointer Image %float
   )"));
@@ -759,7 +759,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_PointerPrivate) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
   %float = OpTypeFloat 32
   %3 = OpTypePointer Private %float
   )"));
@@ -775,7 +775,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_PointerFunction) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
   %float = OpTypeFloat 32
   %3 = OpTypePointer Function %float
   )"));
@@ -792,7 +792,7 @@
 
 TEST_F(SpvParserTest, ConvertType_PointerToPointer) {
   // FYI:  The reader suports pointer-to-pointer even while WebGPU does not.
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
   %float = OpTypeFloat 32
   %42 = OpTypePointer Output %float
   %3 = OpTypePointer Input %42
@@ -818,7 +818,7 @@
 
 TEST_F(SpvParserTest, ConvertType_Sampler_PretendVoid) {
   // We fake the type suport for samplers, images, and sampled images.
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
   %1 = OpTypeSampler
   )"));
   EXPECT_TRUE(p->BuildInternalModule());
@@ -830,7 +830,7 @@
 
 TEST_F(SpvParserTest, ConvertType_Image_PretendVoid) {
   // We fake the type suport for samplers, images, and sampled images.
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
   %float = OpTypeFloat 32
   %1 = OpTypeImage %float 2D 0 0 0 1 Unknown
   )"));
@@ -842,7 +842,7 @@
 }
 
 TEST_F(SpvParserTest, ConvertType_SampledImage_PretendVoid) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
   %float = OpTypeFloat 32
   %im = OpTypeImage %float 2D 0 0 0 1 Unknown
   %1 = OpTypeSampledImage %im
diff --git a/src/reader/spirv/parser_impl_function_decl_test.cc b/src/reader/spirv/parser_impl_function_decl_test.cc
index f03fd2b..f322de2 100644
--- a/src/reader/spirv/parser_impl_function_decl_test.cc
+++ b/src/reader/spirv/parser_impl_function_decl_test.cc
@@ -50,7 +50,7 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctions_NoFunctions) {
-  auto* p = parser(test::Assemble(CommonTypes()));
+  auto p = parser(test::Assemble(CommonTypes()));
   EXPECT_TRUE(p->BuildAndParseInternalModule());
   EXPECT_TRUE(p->error().empty());
   const auto module_ast = p->module().to_str();
@@ -58,7 +58,7 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctions_FunctionWithoutBody) {
-  auto* p = parser(test::Assemble(Names({"main"}) + CommonTypes() + R"(
+  auto p = parser(test::Assemble(Names({"main"}) + CommonTypes() + R"(
      %main = OpFunction %void None %voidfn
      OpFunctionEnd
   )"));
@@ -76,7 +76,7 @@
 OpReturn
 OpFunctionEnd)";
 
-  auto* p = parser(test::Assemble(input));
+  auto p = parser(test::Assemble(input));
   ASSERT_TRUE(p->BuildAndParseInternalModule());
   ASSERT_TRUE(p->error().empty()) << p->error();
   const auto module_ast = p->module().to_str();
@@ -95,7 +95,7 @@
 OpReturn
 OpFunctionEnd)";
 
-  auto* p = parser(test::Assemble(input));
+  auto p = parser(test::Assemble(input));
   ASSERT_TRUE(p->BuildAndParseInternalModule());
   ASSERT_TRUE(p->error().empty()) << p->error();
   const auto module_ast = p->module().to_str();
@@ -114,7 +114,7 @@
 OpReturn
 OpFunctionEnd)";
 
-  auto* p = parser(test::Assemble(input));
+  auto p = parser(test::Assemble(input));
   ASSERT_TRUE(p->BuildAndParseInternalModule());
   ASSERT_TRUE(p->error().empty()) << p->error();
   const auto module_ast = p->module().to_str();
@@ -135,7 +135,7 @@
 OpReturn
 OpFunctionEnd)";
 
-  auto* p = parser(test::Assemble(input));
+  auto p = parser(test::Assemble(input));
   ASSERT_TRUE(p->BuildAndParseInternalModule());
   ASSERT_TRUE(p->error().empty()) << p->error();
   const auto module_ast = p->module().to_str();
@@ -152,7 +152,7 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctions_VoidFunctionWithoutParams) {
-  auto* p = parser(test::Assemble(Names({"main"}) + CommonTypes() + R"(
+  auto p = parser(test::Assemble(Names({"main"}) + CommonTypes() + R"(
      %main = OpFunction %void None %voidfn
      %entry = OpLabel
      OpReturn
@@ -168,7 +168,7 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctions_CalleePrecedesCaller) {
-  auto* p = parser(test::Assemble(
+  auto p = parser(test::Assemble(
       Names({"root", "branch", "leaf", "leaf_result", "branch_result"}) +
       CommonTypes() + R"(
      %uintfn = OpTypeFunction %uint
@@ -250,7 +250,7 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctions_NonVoidResultType) {
-  auto* p = parser(test::Assemble(Names({"ret_float"}) + CommonTypes() + R"(
+  auto p = parser(test::Assemble(Names({"ret_float"}) + CommonTypes() + R"(
      %fn_ret_float = OpTypeFunction %float
 
      %ret_float = OpFunction %float None %fn_ret_float
@@ -275,8 +275,8 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctions_MixedParamTypes) {
-  auto* p = parser(test::Assemble(Names({"mixed_params", "a", "b", "c"}) +
-                                  CommonTypes() + R"(
+  auto p = parser(test::Assemble(Names({"mixed_params", "a", "b", "c"}) +
+                                 CommonTypes() + R"(
      %fn_mixed_params = OpTypeFunction %float %uint %float %int
 
      %mixed_params = OpFunction %void None %fn_mixed_params
@@ -315,7 +315,7 @@
 }
 
 TEST_F(SpvParserTest, EmitFunctions_GenerateParamNames) {
-  auto* p = parser(test::Assemble(Names({"mixed_params"}) + CommonTypes() + R"(
+  auto p = parser(test::Assemble(Names({"mixed_params"}) + CommonTypes() + R"(
      %fn_mixed_params = OpTypeFunction %float %uint %float %int
 
      %mixed_params = OpFunction %void None %fn_mixed_params
diff --git a/src/reader/spirv/parser_impl_get_decorations_test.cc b/src/reader/spirv/parser_impl_get_decorations_test.cc
index 542332c..113a7a7 100644
--- a/src/reader/spirv/parser_impl_get_decorations_test.cc
+++ b/src/reader/spirv/parser_impl_get_decorations_test.cc
@@ -27,7 +27,7 @@
 using ::testing::UnorderedElementsAre;
 
 TEST_F(SpvParserTest, GetDecorationsFor_NotAnId) {
-  auto* p = parser(test::Assemble(""));
+  auto p = parser(test::Assemble(""));
   EXPECT_TRUE(p->BuildAndParseInternalModule());
   auto decorations = p->GetDecorationsFor(42);
   EXPECT_TRUE(decorations.empty());
@@ -35,7 +35,7 @@
 }
 
 TEST_F(SpvParserTest, GetDecorationsFor_NoDecorations) {
-  auto* p = parser(test::Assemble("%1 = OpTypeVoid"));
+  auto p = parser(test::Assemble("%1 = OpTypeVoid"));
   EXPECT_TRUE(p->BuildAndParseInternalModule());
   auto decorations = p->GetDecorationsFor(1);
   EXPECT_TRUE(decorations.empty());
@@ -43,7 +43,7 @@
 }
 
 TEST_F(SpvParserTest, GetDecorationsFor_OneDecoration) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpDecorate %10 Block
     %float = OpTypeFloat 32
     %10 = OpTypeStruct %float
@@ -56,7 +56,7 @@
 }
 
 TEST_F(SpvParserTest, GetDecorationsFor_MultiDecoration) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpDecorate %5 RelaxedPrecision
     OpDecorate %5 Location 7      ; Invalid case made up for test
     %float = OpTypeFloat 32
@@ -71,7 +71,7 @@
 }
 
 TEST_F(SpvParserTest, GetDecorationsForMember_NotAnId) {
-  auto* p = parser(test::Assemble(""));
+  auto p = parser(test::Assemble(""));
   EXPECT_TRUE(p->BuildAndParseInternalModule());
   auto decorations = p->GetDecorationsForMember(42, 9);
   EXPECT_TRUE(decorations.empty());
@@ -79,7 +79,7 @@
 }
 
 TEST_F(SpvParserTest, GetDecorationsForMember_NotAStruct) {
-  auto* p = parser(test::Assemble("%1 = OpTypeVoid"));
+  auto p = parser(test::Assemble("%1 = OpTypeVoid"));
   EXPECT_TRUE(p->BuildAndParseInternalModule());
   auto decorations = p->GetDecorationsFor(1);
   EXPECT_TRUE(decorations.empty());
@@ -87,7 +87,7 @@
 }
 
 TEST_F(SpvParserTest, GetDecorationsForMember_MemberWithoutDecoration) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     %uint = OpTypeInt 32 0
     %10 = OpTypeStruct %uint
   )"));
@@ -99,7 +99,7 @@
 
 // TODO(dneto): Enable when ArrayStride is handled
 TEST_F(SpvParserTest, DISABLED_GetDecorationsForMember_OneDecoration) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpMemberDecorate %10 1 ArrayStride 12
     %uint = OpTypeInt 32 0
     %uint_2 = OpConstant %uint 2
@@ -117,7 +117,7 @@
 // crbug.com/tint/30 for ArrayStride
 // crbug.com/tint/31 for matrix layout
 TEST_F(SpvParserTest, DISABLED_GetDecorationsForMember_MultiDecoration) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpMemberDecorate %50 1 RelaxedPrecision
     OpMemberDecorate %50 2 ArrayStride 16
     OpMemberDecorate %50 2 MatrixStride 8
diff --git a/src/reader/spirv/parser_impl_handle_test.cc b/src/reader/spirv/parser_impl_handle_test.cc
index 8026e76..4a84da3 100644
--- a/src/reader/spirv/parser_impl_handle_test.cc
+++ b/src/reader/spirv/parser_impl_handle_test.cc
@@ -195,7 +195,7 @@
      %10 = OpConstantNull %ptr_sampler
      %20 = OpConstantNull %ptr_f_texture_1d
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildInternalModule());
   const auto* sampler = p->GetMemoryObjectDeclarationForHandle(10, false);
   const auto* image = p->GetMemoryObjectDeclarationForHandle(20, true);
@@ -210,7 +210,7 @@
      %10 = OpVariable %ptr_sampler UniformConstant
      %20 = OpVariable %ptr_f_texture_1d UniformConstant
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildInternalModule());
   EXPECT_TRUE(p->error().empty());
   const auto* sampler = p->GetMemoryObjectDeclarationForHandle(10, false);
@@ -247,7 +247,7 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildInternalModule());
   EXPECT_TRUE(p->error().empty());
   const auto* sampler = p->GetMemoryObjectDeclarationForHandle(110, false);
@@ -282,7 +282,7 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildInternalModule());
   EXPECT_TRUE(p->error().empty());
   const auto* sampler = p->GetMemoryObjectDeclarationForHandle(110, false);
@@ -319,7 +319,7 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildInternalModule());
   EXPECT_TRUE(p->error().empty());
   const auto* sampler = p->GetMemoryObjectDeclarationForHandle(110, false);
@@ -354,7 +354,7 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildInternalModule());
   EXPECT_TRUE(p->error().empty());
   const auto* sampler = p->GetMemoryObjectDeclarationForHandle(110, false);
@@ -382,7 +382,7 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildInternalModule());
   EXPECT_TRUE(p->error().empty());
   const auto* sampler = p->GetMemoryObjectDeclarationForHandle(110, false);
@@ -410,7 +410,7 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildInternalModule());
   EXPECT_TRUE(p->error().empty());
   const auto* sampler = p->GetMemoryObjectDeclarationForHandle(110, false);
@@ -443,7 +443,7 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildInternalModule());
   EXPECT_TRUE(p->error().empty());
   const auto* sampler = p->GetMemoryObjectDeclarationForHandle(100, false);
@@ -474,7 +474,7 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildInternalModule());
   EXPECT_TRUE(p->error().empty());
 
@@ -493,7 +493,7 @@
      %entry = OpLabel
      OpReturn
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildInternalModule());
   EXPECT_TRUE(p->error().empty());
   const auto* sampler = p->GetMemoryObjectDeclarationForHandle(10, false);
@@ -530,7 +530,7 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildInternalModule());
   EXPECT_TRUE(p->error().empty());
   const auto* sampler = p->GetMemoryObjectDeclarationForHandle(110, false);
@@ -565,7 +565,7 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildInternalModule());
   EXPECT_TRUE(p->error().empty());
   const auto* sampler = p->GetMemoryObjectDeclarationForHandle(110, false);
@@ -602,7 +602,7 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildInternalModule());
   EXPECT_TRUE(p->error().empty());
   const auto* sampler = p->GetMemoryObjectDeclarationForHandle(110, false);
@@ -637,7 +637,7 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildInternalModule());
   EXPECT_TRUE(p->error().empty());
   const auto* sampler = p->GetMemoryObjectDeclarationForHandle(110, false);
@@ -666,7 +666,7 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildInternalModule());
   EXPECT_TRUE(p->error().empty());
   const auto* sampler = p->GetMemoryObjectDeclarationForHandle(110, false);
@@ -694,7 +694,7 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildInternalModule());
   EXPECT_TRUE(p->error().empty());
   const auto* sampler = p->GetMemoryObjectDeclarationForHandle(110, false);
@@ -728,7 +728,7 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildInternalModule());
   EXPECT_TRUE(p->error().empty());
   const auto* sampler = p->GetMemoryObjectDeclarationForHandle(100, false);
@@ -760,7 +760,7 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildInternalModule());
   EXPECT_TRUE(p->error().empty());
 
@@ -804,7 +804,7 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildInternalModule());
   EXPECT_TRUE(p->RegisterHandleUsage());
   EXPECT_TRUE(p->error().empty());
@@ -844,7 +844,7 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildInternalModule()) << p->error() << assembly << std::endl;
   EXPECT_TRUE(p->RegisterHandleUsage()) << p->error() << assembly << std::endl;
   EXPECT_TRUE(p->error().empty()) << p->error() << assembly << std::endl;
@@ -953,7 +953,7 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildInternalModule());
   EXPECT_TRUE(p->RegisterHandleUsage());
   EXPECT_TRUE(p->error().empty());
@@ -990,7 +990,7 @@
      OpReturn
      OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   ASSERT_TRUE(p->BuildInternalModule());
   EXPECT_TRUE(p->RegisterHandleUsage());
   EXPECT_TRUE(p->error().empty());
diff --git a/src/reader/spirv/parser_impl_import_test.cc b/src/reader/spirv/parser_impl_import_test.cc
index b72445b..cb01dff 100644
--- a/src/reader/spirv/parser_impl_import_test.cc
+++ b/src/reader/spirv/parser_impl_import_test.cc
@@ -32,7 +32,7 @@
 using ::testing::UnorderedElementsAre;
 
 TEST_F(SpvParserTest, Import_NoImport) {
-  auto* p = parser(test::Assemble("%1 = OpTypeVoid"));
+  auto p = parser(test::Assemble("%1 = OpTypeVoid"));
   EXPECT_TRUE(p->BuildAndParseInternalModule());
   EXPECT_TRUE(p->error().empty());
   const auto module_ast = p->module().to_str();
@@ -40,7 +40,7 @@
 }
 
 TEST_F(SpvParserTest, Import_ImportGlslStd450) {
-  auto* p = parser(test::Assemble(R"(%1 = OpExtInstImport "GLSL.std.450")"));
+  auto p = parser(test::Assemble(R"(%1 = OpExtInstImport "GLSL.std.450")"));
   EXPECT_TRUE(p->BuildAndParseInternalModule());
   EXPECT_TRUE(p->error().empty());
   EXPECT_THAT(p->glsl_std_450_imports(), ElementsAre(1));
diff --git a/src/reader/spirv/parser_impl_module_var_test.cc b/src/reader/spirv/parser_impl_module_var_test.cc
index 4235412..b80dc15 100644
--- a/src/reader/spirv/parser_impl_module_var_test.cc
+++ b/src/reader/spirv/parser_impl_module_var_test.cc
@@ -64,7 +64,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_NoVar) {
-  auto* p = parser(test::Assemble(""));
+  auto p = parser(test::Assemble(""));
   EXPECT_TRUE(p->BuildAndParseInternalModule());
   EXPECT_TRUE(p->error().empty());
   const auto module_ast = p->module().to_str();
@@ -72,7 +72,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_BadStorageClass_NotAWebGPUStorageClass) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     %float = OpTypeFloat 32
     %ptr = OpTypePointer CrossWorkgroup %float
     %52 = OpVariable %ptr CrossWorkgroup
@@ -86,7 +86,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_BadStorageClass_Function) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     %float = OpTypeFloat 32
     %ptr = OpTypePointer Function %float
     %52 = OpVariable %ptr Function
@@ -102,7 +102,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_BadPointerType) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     %float = OpTypeFloat 32
     %fn_ty = OpTypeFunction %float
     %3 = OpTypePointer Private %fn_ty
@@ -118,7 +118,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_NonPointerType) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     %float = OpTypeFloat 32
     %5 = OpTypeFunction %float
     %3 = OpTypePointer Private %5
@@ -132,7 +132,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_AnonWorkgroupVar) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     %float = OpTypeFloat 32
     %ptr = OpTypePointer Workgroup %float
     %52 = OpVariable %ptr Workgroup
@@ -150,7 +150,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_NamedWorkgroupVar) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpName %52 "the_counter"
     %float = OpTypeFloat 32
     %ptr = OpTypePointer Workgroup %float
@@ -169,7 +169,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_PrivateVar) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpName %52 "my_own_private_idaho"
     %float = OpTypeFloat 32
     %ptr = OpTypePointer Private %float
@@ -188,7 +188,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_BuiltinVertexIndex) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpDecorate %52 BuiltIn VertexIndex
     %uint = OpTypeInt 32 0
     %ptr = OpTypePointer Input %uint
@@ -236,7 +236,7 @@
 TEST_F(SpvParserTest, ModuleScopeVar_BuiltinPosition_MapsToModuleScopeVec4Var) {
   // In Vulkan SPIR-V, Position is the first member of gl_PerVertex
   const std::string assembly = PerVertexPreamble();
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
 
   EXPECT_TRUE(p->BuildAndParseInternalModule()) << assembly;
   EXPECT_TRUE(p->error().empty()) << p->error();
@@ -272,7 +272,7 @@
   OpReturn
   OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   EXPECT_FALSE(p->BuildAndParseInternalModule()) << assembly;
   EXPECT_THAT(p->error(), Eq("storing to the whole per-vertex structure is not "
                              "supported: OpStore %1 %9"))
@@ -288,7 +288,7 @@
   OpReturn
   OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   EXPECT_FALSE(p->BuildAndParseInternalModule()) << assembly;
   EXPECT_THAT(p->error(), Eq("operations producing a per-vertex structure are "
                              "not supported: %1000 = OpUndef %10"))
@@ -304,7 +304,7 @@
   OpReturn
   OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   EXPECT_FALSE(p->BuildAndParseInternalModule());
   EXPECT_THAT(p->error(), Eq("operations producing a per-vertex structure are "
                              "not supported: %1000 = OpUndef %11"))
@@ -323,7 +323,7 @@
   OpReturn
   OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   EXPECT_TRUE(p->BuildAndParseInternalModule());
   EXPECT_TRUE(p->error().empty());
   const auto module_str = p->module().to_str();
@@ -354,7 +354,7 @@
   OpReturn
   OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   EXPECT_TRUE(p->BuildAndParseInternalModule());
   EXPECT_TRUE(p->error().empty());
   const auto module_str = p->module().to_str();
@@ -385,7 +385,7 @@
   OpReturn
   OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   EXPECT_TRUE(p->BuildAndParseInternalModule());
   EXPECT_TRUE(p->error().empty());
   const auto module_str = p->module().to_str();
@@ -415,7 +415,7 @@
   OpReturn
   OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   EXPECT_FALSE(p->BuildAndParseInternalModule());
   EXPECT_THAT(p->error(), Eq("accessing per-vertex member 1 is not supported. "
                              "Only Position is supported"));
@@ -435,7 +435,7 @@
   OpReturn
   OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   EXPECT_FALSE(p->BuildAndParseInternalModule());
   EXPECT_THAT(p->error(), Eq("accessing per-vertex member 2 is not supported. "
                              "Only Position is supported"));
@@ -455,7 +455,7 @@
   OpReturn
   OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   EXPECT_FALSE(p->BuildAndParseInternalModule());
   EXPECT_THAT(p->error(), Eq("accessing per-vertex member 3 is not supported. "
                              "Only Position is supported"));
@@ -474,7 +474,7 @@
   OpReturn
   OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   EXPECT_FALSE(p->BuildAndParseInternalModule());
   EXPECT_THAT(p->error(),
               Eq("first index of access chain into per-vertex structure is not "
@@ -495,7 +495,7 @@
   OpReturn
   OpFunctionEnd
   )";
-  auto* p = parser(test::Assemble(assembly));
+  auto p = parser(test::Assemble(assembly));
   EXPECT_FALSE(p->BuildAndParseInternalModule());
   EXPECT_THAT(p->error(),
               Eq("first index of access chain into per-vertex structure is not "
@@ -503,7 +503,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_ScalarInitializers) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %1 = OpVariable %ptr_bool Private %true
      %2 = OpVariable %ptr_bool Private %false
      %3 = OpVariable %ptr_int Private %int_m1
@@ -556,7 +556,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_ScalarNullInitializers) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %null_bool = OpConstantNull %bool
      %null_int = OpConstantNull %int
      %null_uint = OpConstantNull %uint
@@ -605,7 +605,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_ScalarUndefInitializers) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %undef_bool = OpUndef %bool
      %undef_int = OpUndef %int
      %undef_uint = OpUndef %uint
@@ -654,7 +654,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_VectorInitializer) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %ptr = OpTypePointer Private %v2float
      %two = OpConstant %float 2.0
      %const = OpConstantComposite %v2float %float_1p5 %two
@@ -678,7 +678,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_VectorBoolNullInitializer) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %ptr = OpTypePointer Private %v2bool
      %const = OpConstantNull %v2bool
      %200 = OpVariable %ptr Private %const
@@ -701,7 +701,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_VectorBoolUndefInitializer) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %ptr = OpTypePointer Private %v2bool
      %const = OpUndef %v2bool
      %200 = OpVariable %ptr Private %const
@@ -724,7 +724,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_VectorUintNullInitializer) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %ptr = OpTypePointer Private %v2uint
      %const = OpConstantNull %v2uint
      %200 = OpVariable %ptr Private %const
@@ -747,7 +747,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_VectorUintUndefInitializer) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %ptr = OpTypePointer Private %v2uint
      %const = OpUndef %v2uint
      %200 = OpVariable %ptr Private %const
@@ -770,7 +770,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_VectorIntNullInitializer) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %ptr = OpTypePointer Private %v2int
      %const = OpConstantNull %v2int
      %200 = OpVariable %ptr Private %const
@@ -793,7 +793,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_VectorIntUndefInitializer) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %ptr = OpTypePointer Private %v2int
      %const = OpUndef %v2int
      %200 = OpVariable %ptr Private %const
@@ -816,7 +816,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_VectorFloatNullInitializer) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %ptr = OpTypePointer Private %v2float
      %const = OpConstantNull %v2float
      %200 = OpVariable %ptr Private %const
@@ -839,7 +839,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_VectorFloatUndefInitializer) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %ptr = OpTypePointer Private %v2float
      %const = OpUndef %v2float
      %200 = OpVariable %ptr Private %const
@@ -862,7 +862,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_MatrixInitializer) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %ptr = OpTypePointer Private %m3v2float
      %two = OpConstant %float 2.0
      %three = OpConstant %float 3.0
@@ -904,7 +904,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_MatrixNullInitializer) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %ptr = OpTypePointer Private %m3v2float
      %const = OpConstantNull %m3v2float
      %200 = OpVariable %ptr Private %const
@@ -940,7 +940,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_MatrixUndefInitializer) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %ptr = OpTypePointer Private %m3v2float
      %const = OpUndef %m3v2float
      %200 = OpVariable %ptr Private %const
@@ -976,7 +976,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_ArrayInitializer) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %ptr = OpTypePointer Private %arr2uint
      %two = OpConstant %uint 2
      %const = OpConstantComposite %arr2uint %uint_1 %two
@@ -1000,7 +1000,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_ArrayNullInitializer) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %ptr = OpTypePointer Private %arr2uint
      %const = OpConstantNull %arr2uint
      %200 = OpVariable %ptr Private %const
@@ -1023,7 +1023,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_ArrayUndefInitializer) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %ptr = OpTypePointer Private %arr2uint
      %const = OpUndef %arr2uint
      %200 = OpVariable %ptr Private %const
@@ -1046,7 +1046,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_StructInitializer) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %ptr = OpTypePointer Private %strct
      %two = OpConstant %uint 2
      %arrconst = OpConstantComposite %arr2uint %uint_1 %two
@@ -1077,7 +1077,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_StructNullInitializer) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %ptr = OpTypePointer Private %strct
      %const = OpConstantNull %strct
      %200 = OpVariable %ptr Private %const
@@ -1106,7 +1106,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_StructUndefInitializer) {
-  auto* p = parser(test::Assemble(CommonTypes() + R"(
+  auto p = parser(test::Assemble(CommonTypes() + R"(
      %ptr = OpTypePointer Private %strct
      %const = OpUndef %strct
      %200 = OpVariable %ptr Private %const
@@ -1135,7 +1135,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_LocationDecoration_Valid) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      OpName %myvar "myvar"
      OpDecorate %myvar Location 3
 )" + CommonTypes() + R"(
@@ -1186,7 +1186,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_DescriptorSetDecoration_Valid) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      OpName %myvar "myvar"
      OpDecorate %myvar DescriptorSet 3
      OpDecorate %strct Block
@@ -1240,7 +1240,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_BindingDecoration_Valid) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      OpName %myvar "myvar"
      OpDecorate %myvar Binding 3
      OpDecorate %strct Block
@@ -1295,7 +1295,7 @@
 
 TEST_F(SpvParserTest,
        ModuleScopeVar_StructMember_NonReadableDecoration_Dropped) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      OpName %myvar "myvar"
      OpDecorate %strct Block
      OpMemberDecorate %strct 0 NonReadable
@@ -1322,7 +1322,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_ColMajorDecoration_Dropped) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      OpName %myvar "myvar"
      OpDecorate %s Block
      OpMemberDecorate %s 0 ColMajor
@@ -1351,7 +1351,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_MatrixStrideDecoration_Dropped) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      OpName %myvar "myvar"
      OpDecorate %s Block
      OpMemberDecorate %s 0 MatrixStride 8
@@ -1380,7 +1380,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_RowMajorDecoration_IsError) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      OpName %myvar "myvar"
      OpDecorate %s Block
      OpMemberDecorate %s 0 RowMajor
@@ -1401,7 +1401,7 @@
 
 TEST_F(SpvParserTest, ModuleScopeVar_StorageBuffer_NonWritable_AllMembers) {
   // Variable should have access(read)
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      OpName %myvar "myvar"
      OpDecorate %s Block
      OpMemberDecorate %s 0 NonWritable
@@ -1431,7 +1431,7 @@
 
 TEST_F(SpvParserTest, ModuleScopeVar_StorageBuffer_NonWritable_NotAllMembers) {
   // Variable should have access(read_write)
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      OpName %myvar "myvar"
      OpDecorate %s Block
      OpMemberDecorate %s 0 NonWritable
@@ -1462,7 +1462,7 @@
     SpvParserTest,
     ModuleScopeVar_StorageBuffer_NonWritable_NotAllMembers_DuplicatedOnSameMember) {  // NOLINT
   // Variable should have access(read_write)
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      OpName %myvar "myvar"
      OpDecorate %s Block
      OpMemberDecorate %s 0 NonWritable
@@ -1491,7 +1491,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_ScalarSpecConstant_DeclareConst_True) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      OpName %c "myconst"
      OpDecorate %c SpecId 12
      %bool = OpTypeBool
@@ -1516,7 +1516,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_ScalarSpecConstant_DeclareConst_False) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      OpName %c "myconst"
      OpDecorate %c SpecId 12
      %bool = OpTypeBool
@@ -1541,7 +1541,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_ScalarSpecConstant_DeclareConst_U32) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      OpName %c "myconst"
      OpDecorate %c SpecId 12
      %uint = OpTypeInt 32 0
@@ -1566,7 +1566,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_ScalarSpecConstant_DeclareConst_I32) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      OpName %c "myconst"
      OpDecorate %c SpecId 12
      %int = OpTypeInt 32 1
@@ -1591,7 +1591,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_ScalarSpecConstant_DeclareConst_F32) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      OpName %c "myconst"
      OpDecorate %c SpecId 12
      %float = OpTypeFloat 32
@@ -1618,7 +1618,7 @@
 TEST_F(SpvParserTest,
        ModuleScopeVar_ScalarSpecConstant_DeclareConst_F32_WithoutSpecId) {
   // When we don't have a spec ID, declare an undecorated module-scope constant.
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      OpName %c "myconst"
      %float = OpTypeFloat 32
      %c = OpSpecConstant %float 2.5
@@ -1639,7 +1639,7 @@
 }
 
 TEST_F(SpvParserTest, ModuleScopeVar_ScalarSpecConstant_UsedInFunction) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      OpName %c "myconst"
      %float = OpTypeFloat 32
      %c = OpSpecConstant %float 2.5
@@ -1651,7 +1651,7 @@
      OpFunctionEnd
   )"));
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
-  FunctionEmitter fe(p, *spirv_function(100));
+  FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100));
   EXPECT_TRUE(fe.EmitBody()) << p->error();
   EXPECT_TRUE(p->error().empty());
   EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"(
diff --git a/src/reader/spirv/parser_impl_named_types_test.cc b/src/reader/spirv/parser_impl_named_types_test.cc
index d726260..3b7e933 100644
--- a/src/reader/spirv/parser_impl_named_types_test.cc
+++ b/src/reader/spirv/parser_impl_named_types_test.cc
@@ -35,7 +35,7 @@
 using ::testing::HasSubstr;
 
 TEST_F(SpvParserTest, NamedTypes_AnonStruct) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     %uint = OpTypeInt 32 0
     %s = OpTypeStruct %uint %uint
   )"));
@@ -44,7 +44,7 @@
 }
 
 TEST_F(SpvParserTest, NamedTypes_NamedStruct) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpName %s "mystruct"
     %uint = OpTypeInt 32 0
     %s = OpTypeStruct %uint %uint
@@ -54,7 +54,7 @@
 }
 
 TEST_F(SpvParserTest, NamedTypes_Dup_EmitBoth) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     %uint = OpTypeInt 32 0
     %s = OpTypeStruct %uint %uint
     %s2 = OpTypeStruct %uint %uint
@@ -75,7 +75,7 @@
 
 TEST_F(SpvParserTest, NamedTypes_AnonRTArrayWithDecoration) {
   // Runtime arrays are always in SSBO, and those are always laid out.
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpDecorate %arr ArrayStride 8
     %uint = OpTypeInt 32 0
     %arr = OpTypeRuntimeArray %uint
@@ -86,7 +86,7 @@
 }
 
 TEST_F(SpvParserTest, NamedTypes_AnonRTArray_Dup_EmitBoth) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpDecorate %arr ArrayStride 8
     OpDecorate %arr2 ArrayStride 8
     %uint = OpTypeInt 32 0
@@ -100,7 +100,7 @@
 }
 
 TEST_F(SpvParserTest, NamedTypes_NamedRTArray) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpName %arr "myrtarr"
     OpDecorate %arr ArrayStride 8
     %uint = OpTypeInt 32 0
@@ -112,7 +112,7 @@
 }
 
 TEST_F(SpvParserTest, NamedTypes_NamedArray) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpName %arr "myarr"
     OpDecorate %arr ArrayStride 8
     %uint = OpTypeInt 32 0
@@ -126,7 +126,7 @@
 }
 
 TEST_F(SpvParserTest, NamedTypes_AnonArray_Dup_EmitBoth) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
     OpDecorate %arr ArrayStride 8
     OpDecorate %arr2 ArrayStride 8
     %uint = OpTypeInt 32 0
diff --git a/src/reader/spirv/parser_impl_test.cc b/src/reader/spirv/parser_impl_test.cc
index cee5eb2..29e5e3c 100644
--- a/src/reader/spirv/parser_impl_test.cc
+++ b/src/reader/spirv/parser_impl_test.cc
@@ -30,14 +30,14 @@
 
 TEST_F(SpvParserTest, Impl_Uint32VecEmpty) {
   std::vector<uint32_t> data;
-  auto* p = parser(data);
+  auto p = parser(data);
   EXPECT_FALSE(p->Parse());
   // TODO(dneto): What message?
 }
 
 TEST_F(SpvParserTest, Impl_InvalidModuleFails) {
   auto invalid_spv = test::Assemble("%ty = OpTypeInt 3 0");
-  auto* p = parser(invalid_spv);
+  auto p = parser(invalid_spv);
   EXPECT_FALSE(p->Parse());
   EXPECT_THAT(
       p->error(),
@@ -58,7 +58,7 @@
   OpReturn
   OpFunctionEnd
 )");
-  auto* p = parser(spv);
+  auto p = parser(spv);
   EXPECT_TRUE(p->Parse());
   EXPECT_TRUE(p->error().empty());
 }
@@ -76,7 +76,7 @@
   OpReturn
   OpFunctionEnd
 )");
-  auto* p = parser(spv);
+  auto p = parser(spv);
   EXPECT_TRUE(p->Parse());
   EXPECT_TRUE(p->error().empty());
 }
@@ -96,7 +96,7 @@
   OpReturn
   OpFunctionEnd
 )");
-  auto* p = parser(spv);
+  auto p = parser(spv);
   EXPECT_TRUE(p->Parse());
   EXPECT_TRUE(p->error().empty());
 }
@@ -114,7 +114,7 @@
   OpReturn
   OpFunctionEnd
 )");
-  auto* p = parser(spv);
+  auto p = parser(spv);
   EXPECT_FALSE(p->Parse());
   EXPECT_THAT(p->error(), HasSubstr("Capability Kernel is not allowed"));
 }
@@ -134,7 +134,7 @@
   OpReturn
   OpFunctionEnd
 )");
-  auto* p = parser(spv);
+  auto p = parser(spv);
   EXPECT_TRUE(p->Parse());
   EXPECT_TRUE(p->error().empty());
   // Use instruction counting.
@@ -167,7 +167,7 @@
   OpReturn
   OpFunctionEnd
 )");
-  auto* p = parser(spv);
+  auto p = parser(spv);
   EXPECT_TRUE(p->Parse());
   EXPECT_TRUE(p->error().empty());
   // Use the information from the OpLine that is still in scope.
@@ -197,7 +197,7 @@
   OpReturn
   OpFunctionEnd
 )");
-  auto* p = parser(spv);
+  auto p = parser(spv);
   EXPECT_TRUE(p->Parse());
   EXPECT_TRUE(p->error().empty());
   auto s99 = p->GetSourceForResultIdForTest(99);
diff --git a/src/reader/spirv/parser_impl_test_helper.h b/src/reader/spirv/parser_impl_test_helper.h
index 025471b..164bfaa 100644
--- a/src/reader/spirv/parser_impl_test_helper.h
+++ b/src/reader/spirv/parser_impl_test_helper.h
@@ -36,31 +36,24 @@
   SpvParserTestBase() = default;
   ~SpvParserTestBase() override = default;
 
-  /// Sets up the test helper
-  void SetUp() override { ctx_.Reset(); }
-
-  /// Tears down the test helper
-  void TearDown() override { impl_ = nullptr; }
-
   /// Retrieves the parser from the helper
   /// @param input the SPIR-V binary to parse
   /// @returns a parser for the given binary
-  ParserImpl* parser(const std::vector<uint32_t>& input) {
-    impl_ = std::make_unique<ParserImpl>(&ctx_, input);
-    return impl_.get();
+  std::unique_ptr<ParserImpl> parser(const std::vector<uint32_t>& input) {
+    return std::make_unique<ParserImpl>(&ctx_, input);
   }
 
   /// Gets the internal representation of the function with the given ID.
   /// Assumes ParserImpl::BuildInternalRepresentation has been run and
   /// succeeded.
+  /// @param parser the parser
   /// @param id the SPIR-V ID of the function
   /// @returns the internal representation of the function
-  spvtools::opt::Function* spirv_function(uint32_t id) {
-    return impl_->ir_context()->GetFunction(id);
+  spvtools::opt::Function* spirv_function(ParserImpl* parser, uint32_t id) {
+    return parser->ir_context()->GetFunction(id);
   }
 
  private:
-  std::unique_ptr<ParserImpl> impl_;
   Context ctx_;
 };
 
diff --git a/src/reader/spirv/parser_impl_user_name_test.cc b/src/reader/spirv/parser_impl_user_name_test.cc
index 1afcdc1..a7f50da 100644
--- a/src/reader/spirv/parser_impl_user_name_test.cc
+++ b/src/reader/spirv/parser_impl_user_name_test.cc
@@ -28,7 +28,7 @@
 using ::testing::Eq;
 
 TEST_F(SpvParserTest, UserName_RespectOpName) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      OpName %1 "the_void_type"
      %1 = OpTypeVoid
   )"));
@@ -37,7 +37,7 @@
 }
 
 TEST_F(SpvParserTest, UserName_IgnoreEmptyName) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      OpName %1 ""
      %1 = OpTypeVoid
   )"));
@@ -46,7 +46,7 @@
 }
 
 TEST_F(SpvParserTest, UserName_DistinguishDuplicateSuggestion) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      OpName %1 "vanilla"
      OpName %2 "vanilla"
      %1 = OpTypeVoid
@@ -58,7 +58,7 @@
 }
 
 TEST_F(SpvParserTest, UserName_RespectOpMemberName) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      OpMemberName %3 0 "strawberry"
      OpMemberName %3 1 "vanilla"
      OpMemberName %3 2 "chocolate"
@@ -72,7 +72,7 @@
 }
 
 TEST_F(SpvParserTest, UserName_IgnoreEmptyMemberName) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      OpMemberName %3 0 ""
      %2 = OpTypeInt 32 0
      %3 = OpTypeStruct %2
@@ -82,7 +82,7 @@
 }
 
 TEST_F(SpvParserTest, UserName_SynthesizeMemberNames) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      %2 = OpTypeInt 32 0
      %3 = OpTypeStruct %2 %2 %2
   )"));
@@ -93,7 +93,7 @@
 }
 
 TEST_F(SpvParserTest, UserName_MemberNamesMixUserAndSynthesized) {
-  auto* p = parser(test::Assemble(R"(
+  auto p = parser(test::Assemble(R"(
      OpMemberName %3 1 "vanilla"
      %2 = OpTypeInt 32 0
      %3 = OpTypeStruct %2 %2 %2
diff --git a/src/reader/wgsl/parser_impl_additive_expression_test.cc b/src/reader/wgsl/parser_impl_additive_expression_test.cc
index e77c670..09948cd 100644
--- a/src/reader/wgsl/parser_impl_additive_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_additive_expression_test.cc
@@ -26,7 +26,7 @@
 namespace {
 
 TEST_F(ParserImplTest, AdditiveExpression_Parses_Plus) {
-  auto* p = parser("a + true");
+  auto p = parser("a + true");
   auto e = p->additive_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -49,7 +49,7 @@
 }
 
 TEST_F(ParserImplTest, AdditiveExpression_Parses_Minus) {
-  auto* p = parser("a - true");
+  auto p = parser("a - true");
   auto e = p->additive_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -72,7 +72,7 @@
 }
 
 TEST_F(ParserImplTest, AdditiveExpression_InvalidLHS) {
-  auto* p = parser("if (a) {} + true");
+  auto p = parser("if (a) {} + true");
   auto e = p->additive_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -81,7 +81,7 @@
 }
 
 TEST_F(ParserImplTest, AdditiveExpression_InvalidRHS) {
-  auto* p = parser("true + if (a) {}");
+  auto p = parser("true + if (a) {}");
   auto e = p->additive_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -91,7 +91,7 @@
 }
 
 TEST_F(ParserImplTest, AdditiveExpression_NoOr_ReturnsLHS) {
-  auto* p = parser("a true");
+  auto p = parser("a true");
   auto e = p->additive_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_and_expression_test.cc b/src/reader/wgsl/parser_impl_and_expression_test.cc
index 990e149..2131620 100644
--- a/src/reader/wgsl/parser_impl_and_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_and_expression_test.cc
@@ -26,7 +26,7 @@
 namespace {
 
 TEST_F(ParserImplTest, AndExpression_Parses) {
-  auto* p = parser("a & true");
+  auto p = parser("a & true");
   auto e = p->and_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -49,7 +49,7 @@
 }
 
 TEST_F(ParserImplTest, AndExpression_InvalidLHS) {
-  auto* p = parser("if (a) {} & true");
+  auto p = parser("if (a) {} & true");
   auto e = p->and_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -58,7 +58,7 @@
 }
 
 TEST_F(ParserImplTest, AndExpression_InvalidRHS) {
-  auto* p = parser("true & if (a) {}");
+  auto p = parser("true & if (a) {}");
   auto e = p->and_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -68,7 +68,7 @@
 }
 
 TEST_F(ParserImplTest, AndExpression_NoOr_ReturnsLHS) {
-  auto* p = parser("a true");
+  auto p = parser("a true");
   auto e = p->and_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_argument_expression_list_test.cc b/src/reader/wgsl/parser_impl_argument_expression_list_test.cc
index 6302c8e..d1ea588 100644
--- a/src/reader/wgsl/parser_impl_argument_expression_list_test.cc
+++ b/src/reader/wgsl/parser_impl_argument_expression_list_test.cc
@@ -27,7 +27,7 @@
 namespace {
 
 TEST_F(ParserImplTest, ArgumentExpressionList_Parses) {
-  auto* p = parser("a");
+  auto p = parser("a");
   auto e = p->expect_argument_expression_list();
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_FALSE(e.errored);
@@ -37,7 +37,7 @@
 }
 
 TEST_F(ParserImplTest, ArgumentExpressionList_ParsesMultiple) {
-  auto* p = parser("a, -33, 1+2");
+  auto p = parser("a, -33, 1+2");
   auto e = p->expect_argument_expression_list();
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_FALSE(e.errored);
@@ -49,7 +49,7 @@
 }
 
 TEST_F(ParserImplTest, ArgumentExpressionList_HandlesMissingExpression) {
-  auto* p = parser("a, ");
+  auto p = parser("a, ");
   auto e = p->expect_argument_expression_list();
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(e.errored);
@@ -57,7 +57,7 @@
 }
 
 TEST_F(ParserImplTest, ArgumentExpressionList_HandlesInvalidExpression) {
-  auto* p = parser("if(a) {}");
+  auto p = parser("if(a) {}");
   auto e = p->expect_argument_expression_list();
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_assignment_stmt_test.cc b/src/reader/wgsl/parser_impl_assignment_stmt_test.cc
index 89ab5e4..b641ced 100644
--- a/src/reader/wgsl/parser_impl_assignment_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_assignment_stmt_test.cc
@@ -29,7 +29,7 @@
 namespace {
 
 TEST_F(ParserImplTest, AssignmentStmt_Parses_ToVariable) {
-  auto* p = parser("a = 123");
+  auto p = parser("a = 123");
   auto e = p->assignment_stmt();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -54,7 +54,7 @@
 }
 
 TEST_F(ParserImplTest, AssignmentStmt_Parses_ToMember) {
-  auto* p = parser("a.b.c[2].d = 123");
+  auto p = parser("a.b.c[2].d = 123");
   auto e = p->assignment_stmt();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -108,7 +108,7 @@
 }
 
 TEST_F(ParserImplTest, AssignmentStmt_MissingEqual) {
-  auto* p = parser("a.b.c[2].d 123");
+  auto p = parser("a.b.c[2].d 123");
   auto e = p->assignment_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -118,7 +118,7 @@
 }
 
 TEST_F(ParserImplTest, AssignmentStmt_InvalidLHS) {
-  auto* p = parser("if (true) {} = 123");
+  auto p = parser("if (true) {} = 123");
   auto e = p->assignment_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -127,7 +127,7 @@
 }
 
 TEST_F(ParserImplTest, AssignmentStmt_InvalidRHS) {
-  auto* p = parser("a.b.c[2].d = if (true) {}");
+  auto p = parser("a.b.c[2].d = if (true) {}");
   auto e = p->assignment_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_body_stmt_test.cc b/src/reader/wgsl/parser_impl_body_stmt_test.cc
index d0474eb..e4e21ee 100644
--- a/src/reader/wgsl/parser_impl_body_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_body_stmt_test.cc
@@ -22,7 +22,7 @@
 namespace {
 
 TEST_F(ParserImplTest, BodyStmt) {
-  auto* p = parser(R"({
+  auto p = parser(R"({
   discard;
   return 1 + b / 2;
 })");
@@ -35,7 +35,7 @@
 }
 
 TEST_F(ParserImplTest, BodyStmt_Empty) {
-  auto* p = parser("{}");
+  auto p = parser("{}");
   auto e = p->expect_body_stmt();
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_FALSE(e.errored);
@@ -43,7 +43,7 @@
 }
 
 TEST_F(ParserImplTest, BodyStmt_InvalidStmt) {
-  auto* p = parser("{fn main() -> void {}}");
+  auto p = parser("{fn main() -> void {}}");
   auto e = p->expect_body_stmt();
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(e.errored);
@@ -51,7 +51,7 @@
 }
 
 TEST_F(ParserImplTest, BodyStmt_MissingRightParen) {
-  auto* p = parser("{return;");
+  auto p = parser("{return;");
   auto e = p->expect_body_stmt();
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_break_stmt_test.cc b/src/reader/wgsl/parser_impl_break_stmt_test.cc
index a45f719..fdd7438 100644
--- a/src/reader/wgsl/parser_impl_break_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_break_stmt_test.cc
@@ -23,7 +23,7 @@
 namespace {
 
 TEST_F(ParserImplTest, BreakStmt) {
-  auto* p = parser("break");
+  auto p = parser("break");
   auto e = p->break_stmt();
   EXPECT_FALSE(e.errored);
   EXPECT_FALSE(p->has_error()) << p->error();
diff --git a/src/reader/wgsl/parser_impl_call_stmt_test.cc b/src/reader/wgsl/parser_impl_call_stmt_test.cc
index 875805d..cfacc7b 100644
--- a/src/reader/wgsl/parser_impl_call_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_call_stmt_test.cc
@@ -25,7 +25,7 @@
 namespace {
 
 TEST_F(ParserImplTest, Statement_Call) {
-  auto* p = parser("a();");
+  auto p = parser("a();");
   auto e = p->statement();
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e.value, nullptr);
@@ -43,7 +43,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Call_WithParams) {
-  auto* p = parser("a(1, b, 2 + 3 / b);");
+  auto p = parser("a(1, b, 2 + 3 / b);");
   auto e = p->statement();
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e.value, nullptr);
@@ -64,7 +64,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Call_Missing_RightParen) {
-  auto* p = parser("a(");
+  auto p = parser("a(");
   auto e = p->statement();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -73,7 +73,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Call_Missing_Semi) {
-  auto* p = parser("a()");
+  auto p = parser("a()");
   auto e = p->statement();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -82,7 +82,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Call_Bad_ArgList) {
-  auto* p = parser("a(b c);");
+  auto p = parser("a(b c);");
   auto e = p->statement();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_case_body_test.cc b/src/reader/wgsl/parser_impl_case_body_test.cc
index 17e55da..4abb8a9 100644
--- a/src/reader/wgsl/parser_impl_case_body_test.cc
+++ b/src/reader/wgsl/parser_impl_case_body_test.cc
@@ -22,7 +22,7 @@
 namespace {
 
 TEST_F(ParserImplTest, CaseBody_Empty) {
-  auto* p = parser("");
+  auto p = parser("");
   auto e = p->case_body();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_FALSE(e.errored);
@@ -31,7 +31,7 @@
 }
 
 TEST_F(ParserImplTest, CaseBody_Statements) {
-  auto* p = parser(R"(
+  auto p = parser(R"(
   var a: i32;
   a = 2;)");
 
@@ -45,7 +45,7 @@
 }
 
 TEST_F(ParserImplTest, CaseBody_InvalidStatement) {
-  auto* p = parser("a =");
+  auto p = parser("a =");
   auto e = p->case_body();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -54,7 +54,7 @@
 }
 
 TEST_F(ParserImplTest, CaseBody_Fallthrough) {
-  auto* p = parser("fallthrough;");
+  auto p = parser("fallthrough;");
   auto e = p->case_body();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_FALSE(e.errored);
@@ -64,7 +64,7 @@
 }
 
 TEST_F(ParserImplTest, CaseBody_Fallthrough_MissingSemicolon) {
-  auto* p = parser("fallthrough");
+  auto p = parser("fallthrough");
   auto e = p->case_body();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_const_expr_test.cc b/src/reader/wgsl/parser_impl_const_expr_test.cc
index f07fbc2..0635a72 100644
--- a/src/reader/wgsl/parser_impl_const_expr_test.cc
+++ b/src/reader/wgsl/parser_impl_const_expr_test.cc
@@ -27,7 +27,7 @@
 namespace {
 
 TEST_F(ParserImplTest, ConstExpr_TypeDecl) {
-  auto* p = parser("vec2<f32>(1., 2.)");
+  auto p = parser("vec2<f32>(1., 2.)");
   auto e = p->expect_const_expr();
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_FALSE(e.errored);
@@ -55,7 +55,7 @@
 }
 
 TEST_F(ParserImplTest, ConstExpr_TypeDecl_MissingRightParen) {
-  auto* p = parser("vec2<f32>(1., 2.");
+  auto p = parser("vec2<f32>(1., 2.");
   auto e = p->expect_const_expr();
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(e.errored);
@@ -64,7 +64,7 @@
 }
 
 TEST_F(ParserImplTest, ConstExpr_TypeDecl_MissingLeftParen) {
-  auto* p = parser("vec2<f32> 1., 2.)");
+  auto p = parser("vec2<f32> 1., 2.)");
   auto e = p->expect_const_expr();
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(e.errored);
@@ -73,7 +73,7 @@
 }
 
 TEST_F(ParserImplTest, ConstExpr_TypeDecl_HangingComma) {
-  auto* p = parser("vec2<f32>(1.,)");
+  auto p = parser("vec2<f32>(1.,)");
   auto e = p->expect_const_expr();
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(e.errored);
@@ -82,7 +82,7 @@
 }
 
 TEST_F(ParserImplTest, ConstExpr_TypeDecl_MissingComma) {
-  auto* p = parser("vec2<f32>(1. 2.");
+  auto p = parser("vec2<f32>(1. 2.");
   auto e = p->expect_const_expr();
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(e.errored);
@@ -91,7 +91,7 @@
 }
 
 TEST_F(ParserImplTest, ConstExpr_MissingExpr) {
-  auto* p = parser("vec2<f32>()");
+  auto p = parser("vec2<f32>()");
   auto e = p->expect_const_expr();
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(e.errored);
@@ -100,7 +100,7 @@
 }
 
 TEST_F(ParserImplTest, ConstExpr_InvalidExpr) {
-  auto* p = parser("vec2<f32>(1., if(a) {})");
+  auto p = parser("vec2<f32>(1., if(a) {})");
   auto e = p->expect_const_expr();
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(e.errored);
@@ -109,7 +109,7 @@
 }
 
 TEST_F(ParserImplTest, ConstExpr_ConstLiteral) {
-  auto* p = parser("true");
+  auto p = parser("true");
   auto e = p->expect_const_expr();
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_FALSE(e.errored);
@@ -122,7 +122,7 @@
 }
 
 TEST_F(ParserImplTest, ConstExpr_ConstLiteral_Invalid) {
-  auto* p = parser("invalid");
+  auto p = parser("invalid");
   auto e = p->expect_const_expr();
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(e.errored);
@@ -139,7 +139,7 @@
   for (size_t i = 0; i < 200; i++) {
     out << ")";
   }
-  auto* p = parser(out.str());
+  auto p = parser(out.str());
   auto e = p->expect_const_expr();
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_const_literal_test.cc b/src/reader/wgsl/parser_impl_const_literal_test.cc
index acb7637..fb99a27 100644
--- a/src/reader/wgsl/parser_impl_const_literal_test.cc
+++ b/src/reader/wgsl/parser_impl_const_literal_test.cc
@@ -26,7 +26,7 @@
 namespace {
 
 TEST_F(ParserImplTest, ConstLiteral_Int) {
-  auto* p = parser("-234");
+  auto p = parser("-234");
   auto c = p->const_literal();
   EXPECT_TRUE(c.matched);
   EXPECT_FALSE(c.errored);
@@ -37,7 +37,7 @@
 }
 
 TEST_F(ParserImplTest, ConstLiteral_Uint) {
-  auto* p = parser("234u");
+  auto p = parser("234u");
   auto c = p->const_literal();
   EXPECT_TRUE(c.matched);
   EXPECT_FALSE(c.errored);
@@ -48,7 +48,7 @@
 }
 
 TEST_F(ParserImplTest, ConstLiteral_Float) {
-  auto* p = parser("234.e12");
+  auto p = parser("234.e12");
   auto c = p->const_literal();
   EXPECT_TRUE(c.matched);
   EXPECT_FALSE(c.errored);
@@ -59,7 +59,7 @@
 }
 
 TEST_F(ParserImplTest, ConstLiteral_InvalidFloat) {
-  auto* p = parser("1.2e+256");
+  auto p = parser("1.2e+256");
   auto c = p->const_literal();
   EXPECT_FALSE(c.matched);
   EXPECT_FALSE(c.errored);
@@ -67,7 +67,7 @@
 }
 
 TEST_F(ParserImplTest, ConstLiteral_True) {
-  auto* p = parser("true");
+  auto p = parser("true");
   auto c = p->const_literal();
   EXPECT_TRUE(c.matched);
   EXPECT_FALSE(c.errored);
@@ -78,7 +78,7 @@
 }
 
 TEST_F(ParserImplTest, ConstLiteral_False) {
-  auto* p = parser("false");
+  auto p = parser("false");
   auto c = p->const_literal();
   EXPECT_TRUE(c.matched);
   EXPECT_FALSE(c.errored);
@@ -89,7 +89,7 @@
 }
 
 TEST_F(ParserImplTest, ConstLiteral_NoMatch) {
-  auto* p = parser("another-token");
+  auto p = parser("another-token");
   auto c = p->const_literal();
   EXPECT_FALSE(c.matched);
   EXPECT_FALSE(c.errored);
diff --git a/src/reader/wgsl/parser_impl_continue_stmt_test.cc b/src/reader/wgsl/parser_impl_continue_stmt_test.cc
index b2003ce..e2e6e01 100644
--- a/src/reader/wgsl/parser_impl_continue_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_continue_stmt_test.cc
@@ -23,7 +23,7 @@
 namespace {
 
 TEST_F(ParserImplTest, ContinueStmt) {
-  auto* p = parser("continue");
+  auto p = parser("continue");
   auto e = p->continue_stmt();
   EXPECT_FALSE(e.errored);
   EXPECT_FALSE(p->has_error()) << p->error();
diff --git a/src/reader/wgsl/parser_impl_continuing_stmt_test.cc b/src/reader/wgsl/parser_impl_continuing_stmt_test.cc
index 68c9ec6..4e4a7d1 100644
--- a/src/reader/wgsl/parser_impl_continuing_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_continuing_stmt_test.cc
@@ -22,7 +22,7 @@
 namespace {
 
 TEST_F(ParserImplTest, ContinuingStmt) {
-  auto* p = parser("continuing { discard; }");
+  auto p = parser("continuing { discard; }");
   auto e = p->continuing_stmt();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -32,7 +32,7 @@
 }
 
 TEST_F(ParserImplTest, ContinuingStmt_InvalidBody) {
-  auto* p = parser("continuing { discard }");
+  auto p = parser("continuing { discard }");
   auto e = p->continuing_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_depth_texture_type_test.cc b/src/reader/wgsl/parser_impl_depth_texture_type_test.cc
index 5125c06..c7faf99 100644
--- a/src/reader/wgsl/parser_impl_depth_texture_type_test.cc
+++ b/src/reader/wgsl/parser_impl_depth_texture_type_test.cc
@@ -23,7 +23,7 @@
 namespace {
 
 TEST_F(ParserImplTest, DepthTextureType_Invalid) {
-  auto* p = parser("1234");
+  auto p = parser("1234");
   auto t = p->depth_texture_type();
   EXPECT_FALSE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -31,7 +31,7 @@
 }
 
 TEST_F(ParserImplTest, DepthTextureType_2d) {
-  auto* p = parser("texture_depth_2d");
+  auto p = parser("texture_depth_2d");
   auto t = p->depth_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -43,7 +43,7 @@
 }
 
 TEST_F(ParserImplTest, DepthTextureType_2dArray) {
-  auto* p = parser("texture_depth_2d_array");
+  auto p = parser("texture_depth_2d_array");
   auto t = p->depth_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -55,7 +55,7 @@
 }
 
 TEST_F(ParserImplTest, DepthTextureType_Cube) {
-  auto* p = parser("texture_depth_cube");
+  auto p = parser("texture_depth_cube");
   auto t = p->depth_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -67,7 +67,7 @@
 }
 
 TEST_F(ParserImplTest, DepthTextureType_CubeArray) {
-  auto* p = parser("texture_depth_cube_array");
+  auto p = parser("texture_depth_cube_array");
   auto t = p->depth_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
diff --git a/src/reader/wgsl/parser_impl_else_stmt_test.cc b/src/reader/wgsl/parser_impl_else_stmt_test.cc
index 89632e3..98ad2b0 100644
--- a/src/reader/wgsl/parser_impl_else_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_else_stmt_test.cc
@@ -23,7 +23,7 @@
 namespace {
 
 TEST_F(ParserImplTest, ElseStmt) {
-  auto* p = parser("else { a = b; c = d; }");
+  auto p = parser("else { a = b; c = d; }");
   auto e = p->else_stmt();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -35,7 +35,7 @@
 }
 
 TEST_F(ParserImplTest, ElseStmt_InvalidBody) {
-  auto* p = parser("else { fn main() -> void {}}");
+  auto p = parser("else { fn main() -> void {}}");
   auto e = p->else_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -45,7 +45,7 @@
 }
 
 TEST_F(ParserImplTest, ElseStmt_MissingBody) {
-  auto* p = parser("else");
+  auto p = parser("else");
   auto e = p->else_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_elseif_stmt_test.cc b/src/reader/wgsl/parser_impl_elseif_stmt_test.cc
index dd1ae17..22ebd97 100644
--- a/src/reader/wgsl/parser_impl_elseif_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_elseif_stmt_test.cc
@@ -23,7 +23,7 @@
 namespace {
 
 TEST_F(ParserImplTest, ElseIfStmt) {
-  auto* p = parser("elseif (a == 4) { a = b; c = d; }");
+  auto p = parser("elseif (a == 4) { a = b; c = d; }");
   auto e = p->elseif_stmt();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -37,7 +37,7 @@
 }
 
 TEST_F(ParserImplTest, ElseIfStmt_Multiple) {
-  auto* p = parser("elseif (a == 4) { a = b; c = d; } elseif(c) { d = 2; }");
+  auto p = parser("elseif (a == 4) { a = b; c = d; } elseif(c) { d = 2; }");
   auto e = p->elseif_stmt();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -56,7 +56,7 @@
 }
 
 TEST_F(ParserImplTest, ElseIfStmt_InvalidBody) {
-  auto* p = parser("elseif (true) { fn main() -> void {}}");
+  auto p = parser("elseif (true) { fn main() -> void {}}");
   auto e = p->elseif_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -65,7 +65,7 @@
 }
 
 TEST_F(ParserImplTest, ElseIfStmt_MissingBody) {
-  auto* p = parser("elseif (true)");
+  auto p = parser("elseif (true)");
   auto e = p->elseif_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_equality_expression_test.cc b/src/reader/wgsl/parser_impl_equality_expression_test.cc
index f160075..36cbcef 100644
--- a/src/reader/wgsl/parser_impl_equality_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_equality_expression_test.cc
@@ -26,7 +26,7 @@
 namespace {
 
 TEST_F(ParserImplTest, EqualityExpression_Parses_Equal) {
-  auto* p = parser("a == true");
+  auto p = parser("a == true");
   auto e = p->equality_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -49,7 +49,7 @@
 }
 
 TEST_F(ParserImplTest, EqualityExpression_Parses_NotEqual) {
-  auto* p = parser("a != true");
+  auto p = parser("a != true");
   auto e = p->equality_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -72,7 +72,7 @@
 }
 
 TEST_F(ParserImplTest, EqualityExpression_InvalidLHS) {
-  auto* p = parser("if (a) {} == true");
+  auto p = parser("if (a) {} == true");
   auto e = p->equality_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -81,7 +81,7 @@
 }
 
 TEST_F(ParserImplTest, EqualityExpression_InvalidRHS) {
-  auto* p = parser("true == if (a) {}");
+  auto p = parser("true == if (a) {}");
   auto e = p->equality_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -91,7 +91,7 @@
 }
 
 TEST_F(ParserImplTest, EqualityExpression_NoOr_ReturnsLHS) {
-  auto* p = parser("a true");
+  auto p = parser("a true");
   auto e = p->equality_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_error_msg_test.cc b/src/reader/wgsl/parser_impl_error_msg_test.cc
index 3d70cd9..7e075a5 100644
--- a/src/reader/wgsl/parser_impl_error_msg_test.cc
+++ b/src/reader/wgsl/parser_impl_error_msg_test.cc
@@ -27,7 +27,7 @@
   do {                                                               \
     std::string source = SOURCE;                                     \
     std::string expected = EXPECTED;                                 \
-    auto* p = parser(source);                                        \
+    auto p = parser(source);                                         \
     EXPECT_EQ(false, p->Parse());                                    \
     EXPECT_EQ(true, p->diagnostics().contains_errors());             \
     EXPECT_EQ(expected, diag::Formatter().format(p->diagnostics())); \
diff --git a/src/reader/wgsl/parser_impl_error_resync_test.cc b/src/reader/wgsl/parser_impl_error_resync_test.cc
index 3427a59..e420bcd 100644
--- a/src/reader/wgsl/parser_impl_error_resync_test.cc
+++ b/src/reader/wgsl/parser_impl_error_resync_test.cc
@@ -27,7 +27,7 @@
   do {                                                               \
     std::string source = SOURCE;                                     \
     std::string expected = EXPECTED;                                 \
-    auto* p = parser(source);                                        \
+    auto p = parser(source);                                         \
     EXPECT_EQ(false, p->Parse());                                    \
     EXPECT_EQ(true, p->diagnostics().contains_errors());             \
     EXPECT_EQ(expected, diag::Formatter().format(p->diagnostics())); \
diff --git a/src/reader/wgsl/parser_impl_exclusive_or_expression_test.cc b/src/reader/wgsl/parser_impl_exclusive_or_expression_test.cc
index c3a3139..1338dfa 100644
--- a/src/reader/wgsl/parser_impl_exclusive_or_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_exclusive_or_expression_test.cc
@@ -26,7 +26,7 @@
 namespace {
 
 TEST_F(ParserImplTest, ExclusiveOrExpression_Parses) {
-  auto* p = parser("a ^ true");
+  auto p = parser("a ^ true");
   auto e = p->exclusive_or_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -49,7 +49,7 @@
 }
 
 TEST_F(ParserImplTest, ExclusiveOrExpression_InvalidLHS) {
-  auto* p = parser("if (a) {} ^ true");
+  auto p = parser("if (a) {} ^ true");
   auto e = p->exclusive_or_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -58,7 +58,7 @@
 }
 
 TEST_F(ParserImplTest, ExclusiveOrExpression_InvalidRHS) {
-  auto* p = parser("true ^ if (a) {}");
+  auto p = parser("true ^ if (a) {}");
   auto e = p->exclusive_or_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -68,7 +68,7 @@
 }
 
 TEST_F(ParserImplTest, ExclusiveOrExpression_NoOr_ReturnsLHS) {
-  auto* p = parser("a true");
+  auto p = parser("a true");
   auto e = p->exclusive_or_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_for_stmt_test.cc b/src/reader/wgsl/parser_impl_for_stmt_test.cc
index 27c7def..2172e21 100644
--- a/src/reader/wgsl/parser_impl_for_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_for_stmt_test.cc
@@ -26,13 +26,13 @@
 class ForStmtTest : public ParserImplTest {
  public:
   void TestForLoop(std::string loop_str, std::string for_str) {
-    auto* p_loop = parser(loop_str);
+    auto p_loop = parser(loop_str);
     auto e_loop = p_loop->expect_statements();
     EXPECT_FALSE(e_loop.errored);
     EXPECT_FALSE(p_loop->has_error()) << p_loop->error();
     ASSERT_NE(e_loop.value, nullptr);
 
-    auto* p_for = parser(for_str);
+    auto p_for = parser(for_str);
     auto e_for = p_for->expect_statements();
     EXPECT_FALSE(e_for.errored);
     EXPECT_FALSE(p_for->has_error()) << p_for->error();
@@ -158,7 +158,7 @@
 class ForStmtErrorTest : public ParserImplTest {
  public:
   void TestForWithError(std::string for_str, std::string error_str) {
-    auto* p_for = parser(for_str);
+    auto p_for = parser(for_str);
     auto e_for = p_for->for_stmt();
 
     EXPECT_FALSE(e_for.matched);
diff --git a/src/reader/wgsl/parser_impl_function_decl_test.cc b/src/reader/wgsl/parser_impl_function_decl_test.cc
index 03dc6cb..8f829ac 100644
--- a/src/reader/wgsl/parser_impl_function_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_function_decl_test.cc
@@ -25,7 +25,7 @@
 namespace {
 
 TEST_F(ParserImplTest, FunctionDecl) {
-  auto* p = parser("fn main(a : i32, b : f32) -> void { return; }");
+  auto p = parser("fn main(a : i32, b : f32) -> void { return; }");
   auto decos = p->decoration_list();
   EXPECT_FALSE(p->has_error()) << p->error();
   ASSERT_FALSE(decos.errored);
@@ -53,7 +53,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecl_DecorationList) {
-  auto* p = parser("[[workgroup_size(2, 3, 4)]] fn main() -> void { return; }");
+  auto p = parser("[[workgroup_size(2, 3, 4)]] fn main() -> void { return; }");
   auto decos = p->decoration_list();
   EXPECT_FALSE(p->has_error()) << p->error();
   ASSERT_FALSE(decos.errored);
@@ -89,7 +89,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecl_DecorationList_MultipleEntries) {
-  auto* p = parser(R"(
+  auto p = parser(R"(
 [[workgroup_size(2, 3, 4), workgroup_size(5, 6, 7)]]
 fn main() -> void { return; })");
   auto decos = p->decoration_list();
@@ -133,7 +133,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecl_DecorationList_MultipleLists) {
-  auto* p = parser(R"(
+  auto p = parser(R"(
 [[workgroup_size(2, 3, 4)]]
 [[workgroup_size(5, 6, 7)]]
 fn main() -> void { return; })");
@@ -178,7 +178,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecl_InvalidHeader) {
-  auto* p = parser("fn main() -> { }");
+  auto p = parser("fn main() -> { }");
   auto decos = p->decoration_list();
   EXPECT_FALSE(p->has_error()) << p->error();
   ASSERT_FALSE(decos.errored);
@@ -192,7 +192,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecl_InvalidBody) {
-  auto* p = parser("fn main() -> void { return }");
+  auto p = parser("fn main() -> void { return }");
   auto decos = p->decoration_list();
   EXPECT_FALSE(p->has_error()) << p->error();
   ASSERT_FALSE(decos.errored);
@@ -206,7 +206,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecl_MissingLeftBrace) {
-  auto* p = parser("fn main() -> void return; }");
+  auto p = parser("fn main() -> void return; }");
   auto decos = p->decoration_list();
   EXPECT_FALSE(p->has_error()) << p->error();
   ASSERT_FALSE(decos.errored);
diff --git a/src/reader/wgsl/parser_impl_function_decoration_list_test.cc b/src/reader/wgsl/parser_impl_function_decoration_list_test.cc
index 53dad7f..9a7da60 100644
--- a/src/reader/wgsl/parser_impl_function_decoration_list_test.cc
+++ b/src/reader/wgsl/parser_impl_function_decoration_list_test.cc
@@ -23,7 +23,7 @@
 namespace {
 
 TEST_F(ParserImplTest, FunctionDecorationList_Parses) {
-  auto* p = parser("[[workgroup_size(2), workgroup_size(3, 4, 5)]]");
+  auto p = parser("[[workgroup_size(2), workgroup_size(3, 4, 5)]]");
   auto decos = p->decoration_list();
   EXPECT_FALSE(p->has_error()) << p->error();
   EXPECT_FALSE(decos.errored);
@@ -50,7 +50,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecorationList_Empty) {
-  auto* p = parser("[[]]");
+  auto p = parser("[[]]");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
@@ -59,7 +59,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecorationList_Invalid) {
-  auto* p = parser("[[invalid]]");
+  auto p = parser("[[invalid]]");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
@@ -69,7 +69,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecorationList_ExtraComma) {
-  auto* p = parser("[[workgroup_size(2), ]]");
+  auto p = parser("[[workgroup_size(2), ]]");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
@@ -78,7 +78,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecorationList_MissingComma) {
-  auto* p = parser("[[workgroup_size(2) workgroup_size(2)]]");
+  auto p = parser("[[workgroup_size(2) workgroup_size(2)]]");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
@@ -87,7 +87,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecorationList_BadDecoration) {
-  auto* p = parser("[[workgroup_size()]]");
+  auto p = parser("[[workgroup_size()]]");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
@@ -98,7 +98,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecorationList_MissingRightAttr) {
-  auto* p = parser("[[workgroup_size(2), workgroup_size(3, 4, 5)");
+  auto p = parser("[[workgroup_size(2), workgroup_size(3, 4, 5)");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
diff --git a/src/reader/wgsl/parser_impl_function_decoration_test.cc b/src/reader/wgsl/parser_impl_function_decoration_test.cc
index 583a5bb..3877cbc 100644
--- a/src/reader/wgsl/parser_impl_function_decoration_test.cc
+++ b/src/reader/wgsl/parser_impl_function_decoration_test.cc
@@ -24,7 +24,7 @@
 namespace {
 
 TEST_F(ParserImplTest, FunctionDecoration_Workgroup) {
-  auto* p = parser("workgroup_size(4)");
+  auto p = parser("workgroup_size(4)");
   auto deco = p->decoration();
   EXPECT_TRUE(deco.matched);
   EXPECT_FALSE(deco.errored);
@@ -44,7 +44,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecoration_Workgroup_2Param) {
-  auto* p = parser("workgroup_size(4, 5)");
+  auto p = parser("workgroup_size(4, 5)");
   auto deco = p->decoration();
   EXPECT_TRUE(deco.matched);
   EXPECT_FALSE(deco.errored);
@@ -64,7 +64,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecoration_Workgroup_3Param) {
-  auto* p = parser("workgroup_size(4, 5, 6)");
+  auto p = parser("workgroup_size(4, 5, 6)");
   auto deco = p->decoration();
   EXPECT_TRUE(deco.matched);
   EXPECT_FALSE(deco.errored);
@@ -84,7 +84,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecoration_Workgroup_TooManyValues) {
-  auto* p = parser("workgroup_size(1, 2, 3, 4)");
+  auto p = parser("workgroup_size(1, 2, 3, 4)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -94,7 +94,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecoration_Workgroup_Invalid_X_Value) {
-  auto* p = parser("workgroup_size(-2, 5, 6)");
+  auto p = parser("workgroup_size(-2, 5, 6)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -105,7 +105,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecoration_Workgroup_Invalid_Y_Value) {
-  auto* p = parser("workgroup_size(4, 0, 6)");
+  auto p = parser("workgroup_size(4, 0, 6)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -116,7 +116,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecoration_Workgroup_Invalid_Z_Value) {
-  auto* p = parser("workgroup_size(4, 5, -3)");
+  auto p = parser("workgroup_size(4, 5, -3)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -127,7 +127,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecoration_Workgroup_MissingLeftParam) {
-  auto* p = parser("workgroup_size 4, 5, 6)");
+  auto p = parser("workgroup_size 4, 5, 6)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -137,7 +137,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecoration_Workgroup_MissingRightParam) {
-  auto* p = parser("workgroup_size(4, 5, 6");
+  auto p = parser("workgroup_size(4, 5, 6");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -147,7 +147,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecoration_Workgroup_MissingValues) {
-  auto* p = parser("workgroup_size()");
+  auto p = parser("workgroup_size()");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -159,7 +159,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecoration_Workgroup_Missing_X_Value) {
-  auto* p = parser("workgroup_size(, 2, 3)");
+  auto p = parser("workgroup_size(, 2, 3)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -171,7 +171,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecoration_Workgroup_Missing_Y_Comma) {
-  auto* p = parser("workgroup_size(1 2, 3)");
+  auto p = parser("workgroup_size(1 2, 3)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -181,7 +181,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecoration_Workgroup_Missing_Y_Value) {
-  auto* p = parser("workgroup_size(1, , 3)");
+  auto p = parser("workgroup_size(1, , 3)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -193,7 +193,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecoration_Workgroup_Missing_Z_Comma) {
-  auto* p = parser("workgroup_size(1, 2 3)");
+  auto p = parser("workgroup_size(1, 2 3)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -203,7 +203,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecoration_Workgroup_Missing_Z_Value) {
-  auto* p = parser("workgroup_size(1, 2, )");
+  auto p = parser("workgroup_size(1, 2, )");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -215,7 +215,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecoration_Workgroup_Missing_X_Invalid) {
-  auto* p = parser("workgroup_size(nan)");
+  auto p = parser("workgroup_size(nan)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -227,7 +227,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecoration_Workgroup_Missing_Y_Invalid) {
-  auto* p = parser("workgroup_size(2, nan)");
+  auto p = parser("workgroup_size(2, nan)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -239,7 +239,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecoration_Workgroup_Missing_Z_Invalid) {
-  auto* p = parser("workgroup_size(2, 3, nan)");
+  auto p = parser("workgroup_size(2, 3, nan)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -251,7 +251,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecoration_Stage) {
-  auto* p = parser("stage(compute)");
+  auto p = parser("stage(compute)");
   auto deco = p->decoration();
   EXPECT_TRUE(deco.matched);
   EXPECT_FALSE(deco.errored);
@@ -264,7 +264,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecoration_Stage_MissingValue) {
-  auto* p = parser("stage()");
+  auto p = parser("stage()");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -274,7 +274,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecoration_Stage_MissingInvalid) {
-  auto* p = parser("stage(nan)");
+  auto p = parser("stage(nan)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -284,7 +284,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecoration_Stage_MissingLeftParen) {
-  auto* p = parser("stage compute)");
+  auto p = parser("stage compute)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -294,7 +294,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecoration_Stage_MissingRightParen) {
-  auto* p = parser("stage(compute");
+  auto p = parser("stage(compute");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
diff --git a/src/reader/wgsl/parser_impl_function_header_test.cc b/src/reader/wgsl/parser_impl_function_header_test.cc
index cc4d257..f657a80 100644
--- a/src/reader/wgsl/parser_impl_function_header_test.cc
+++ b/src/reader/wgsl/parser_impl_function_header_test.cc
@@ -24,7 +24,7 @@
 namespace {
 
 TEST_F(ParserImplTest, FunctionHeader) {
-  auto* p = parser("fn main(a : i32, b: f32) -> void");
+  auto p = parser("fn main(a : i32, b: f32) -> void");
   auto f = p->function_header();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(f.matched);
@@ -39,7 +39,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionHeader_MissingIdent) {
-  auto* p = parser("fn () -> void");
+  auto p = parser("fn () -> void");
   auto f = p->function_header();
   EXPECT_FALSE(f.matched);
   EXPECT_TRUE(f.errored);
@@ -49,7 +49,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionHeader_InvalidIdent) {
-  auto* p = parser("fn 133main() -> i32");
+  auto p = parser("fn 133main() -> i32");
   auto f = p->function_header();
   EXPECT_FALSE(f.matched);
   EXPECT_TRUE(f.errored);
@@ -59,7 +59,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionHeader_MissingParenLeft) {
-  auto* p = parser("fn main) -> i32");
+  auto p = parser("fn main) -> i32");
   auto f = p->function_header();
   EXPECT_FALSE(f.matched);
   EXPECT_TRUE(f.errored);
@@ -69,7 +69,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionHeader_InvalidParamList) {
-  auto* p = parser("fn main(a :i32,) -> i32");
+  auto p = parser("fn main(a :i32,) -> i32");
   auto f = p->function_header();
   EXPECT_FALSE(f.matched);
   EXPECT_TRUE(f.errored);
@@ -79,7 +79,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionHeader_MissingParenRight) {
-  auto* p = parser("fn main( -> i32");
+  auto p = parser("fn main( -> i32");
   auto f = p->function_header();
   EXPECT_FALSE(f.matched);
   EXPECT_TRUE(f.errored);
@@ -89,7 +89,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionHeader_MissingArrow) {
-  auto* p = parser("fn main() i32");
+  auto p = parser("fn main() i32");
   auto f = p->function_header();
   EXPECT_FALSE(f.matched);
   EXPECT_TRUE(f.errored);
@@ -99,7 +99,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionHeader_InvalidReturnType) {
-  auto* p = parser("fn main() -> invalid");
+  auto p = parser("fn main() -> invalid");
   auto f = p->function_header();
   EXPECT_FALSE(f.matched);
   EXPECT_TRUE(f.errored);
@@ -109,7 +109,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionHeader_MissingReturnType) {
-  auto* p = parser("fn main() ->");
+  auto p = parser("fn main() ->");
   auto f = p->function_header();
   EXPECT_FALSE(f.matched);
   EXPECT_TRUE(f.errored);
diff --git a/src/reader/wgsl/parser_impl_function_type_decl_test.cc b/src/reader/wgsl/parser_impl_function_type_decl_test.cc
index 14bf09d..9fb2711 100644
--- a/src/reader/wgsl/parser_impl_function_type_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_function_type_decl_test.cc
@@ -30,7 +30,7 @@
 TEST_F(ParserImplTest, FunctionTypeDecl_Void) {
   auto* v = tm()->Get(std::make_unique<ast::type::VoidType>());
 
-  auto* p = parser("void");
+  auto p = parser("void");
   auto e = p->function_type_decl();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -42,7 +42,7 @@
   auto* f32 = tm()->Get(std::make_unique<ast::type::F32Type>());
   auto* vec2 = tm()->Get(std::make_unique<ast::type::VectorType>(f32, 2));
 
-  auto* p = parser("vec2<f32>");
+  auto p = parser("vec2<f32>");
   auto e = p->function_type_decl();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -51,7 +51,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionTypeDecl_InvalidType) {
-  auto* p = parser("vec2<invalid>");
+  auto p = parser("vec2<invalid>");
   auto e = p->function_type_decl();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_global_constant_decl_test.cc b/src/reader/wgsl/parser_impl_global_constant_decl_test.cc
index 5888ee9..3f4aaed 100644
--- a/src/reader/wgsl/parser_impl_global_constant_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_global_constant_decl_test.cc
@@ -24,7 +24,7 @@
 namespace {
 
 TEST_F(ParserImplTest, GlobalConstantDecl) {
-  auto* p = parser("const a : f32 = 1.");
+  auto p = parser("const a : f32 = 1.");
   auto e = p->global_constant_decl();
   EXPECT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(e.matched);
@@ -46,7 +46,7 @@
 }
 
 TEST_F(ParserImplTest, GlobalConstantDecl_MissingEqual) {
-  auto* p = parser("const a: f32 1.");
+  auto p = parser("const a: f32 1.");
   auto e = p->global_constant_decl();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -56,7 +56,7 @@
 }
 
 TEST_F(ParserImplTest, GlobalConstantDecl_InvalidVariable) {
-  auto* p = parser("const a: invalid = 1.");
+  auto p = parser("const a: invalid = 1.");
   auto e = p->global_constant_decl();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -66,7 +66,7 @@
 }
 
 TEST_F(ParserImplTest, GlobalConstantDecl_InvalidExpression) {
-  auto* p = parser("const a: f32 = if (a) {}");
+  auto p = parser("const a: f32 = if (a) {}");
   auto e = p->global_constant_decl();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -76,7 +76,7 @@
 }
 
 TEST_F(ParserImplTest, GlobalConstantDecl_MissingExpression) {
-  auto* p = parser("const a: f32 =");
+  auto p = parser("const a: f32 =");
   auto e = p->global_constant_decl();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_global_decl_test.cc b/src/reader/wgsl/parser_impl_global_decl_test.cc
index ddd0f1d..906efe5 100644
--- a/src/reader/wgsl/parser_impl_global_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_global_decl_test.cc
@@ -24,13 +24,13 @@
 namespace {
 
 TEST_F(ParserImplTest, GlobalDecl_Semicolon) {
-  auto* p = parser(";");
+  auto p = parser(";");
   p->expect_global_decl();
   ASSERT_FALSE(p->has_error()) << p->error();
 }
 
 TEST_F(ParserImplTest, GlobalDecl_GlobalVariable) {
-  auto* p = parser("var<out> a : vec2<i32> = vec2<i32>(1, 2);");
+  auto p = parser("var<out> a : vec2<i32> = vec2<i32>(1, 2);");
   p->expect_global_decl();
   ASSERT_FALSE(p->has_error()) << p->error();
 
@@ -42,21 +42,21 @@
 }
 
 TEST_F(ParserImplTest, GlobalDecl_GlobalVariable_Invalid) {
-  auto* p = parser("var<out> a : vec2<invalid>;");
+  auto p = parser("var<out> a : vec2<invalid>;");
   p->expect_global_decl();
   ASSERT_TRUE(p->has_error());
   EXPECT_EQ(p->error(), "1:19: unknown constructed type 'invalid'");
 }
 
 TEST_F(ParserImplTest, GlobalDecl_GlobalVariable_MissingSemicolon) {
-  auto* p = parser("var<out> a : vec2<i32>");
+  auto p = parser("var<out> a : vec2<i32>");
   p->expect_global_decl();
   ASSERT_TRUE(p->has_error());
   EXPECT_EQ(p->error(), "1:23: expected ';' for variable declaration");
 }
 
 TEST_F(ParserImplTest, GlobalDecl_GlobalConstant) {
-  auto* p = parser("const a : i32 = 2;");
+  auto p = parser("const a : i32 = 2;");
   p->expect_global_decl();
   ASSERT_FALSE(p->has_error()) << p->error();
 
@@ -68,21 +68,21 @@
 }
 
 TEST_F(ParserImplTest, GlobalDecl_GlobalConstant_Invalid) {
-  auto* p = parser("const a : vec2<i32>;");
+  auto p = parser("const a : vec2<i32>;");
   p->expect_global_decl();
   ASSERT_TRUE(p->has_error());
   EXPECT_EQ(p->error(), "1:20: expected '=' for constant declaration");
 }
 
 TEST_F(ParserImplTest, GlobalDecl_GlobalConstant_MissingSemicolon) {
-  auto* p = parser("const a : vec2<i32> = vec2<i32>(1, 2)");
+  auto p = parser("const a : vec2<i32> = vec2<i32>(1, 2)");
   p->expect_global_decl();
   ASSERT_TRUE(p->has_error());
   EXPECT_EQ(p->error(), "1:38: expected ';' for constant declaration");
 }
 
 TEST_F(ParserImplTest, GlobalDecl_TypeAlias) {
-  auto* p = parser("type A = i32;");
+  auto p = parser("type A = i32;");
   p->expect_global_decl();
   ASSERT_FALSE(p->has_error()) << p->error();
 
@@ -93,7 +93,7 @@
 }
 
 TEST_F(ParserImplTest, GlobalDecl_TypeAlias_StructIdent) {
-  auto* p = parser(R"(struct A {
+  auto p = parser(R"(struct A {
   a : f32;
 };
 type B = A;)");
@@ -114,21 +114,21 @@
 }
 
 TEST_F(ParserImplTest, GlobalDecl_TypeAlias_Invalid) {
-  auto* p = parser("type A = invalid;");
+  auto p = parser("type A = invalid;");
   p->expect_global_decl();
   ASSERT_TRUE(p->has_error());
   EXPECT_EQ(p->error(), "1:10: unknown constructed type 'invalid'");
 }
 
 TEST_F(ParserImplTest, GlobalDecl_TypeAlias_MissingSemicolon) {
-  auto* p = parser("type A = i32");
+  auto p = parser("type A = i32");
   p->expect_global_decl();
   ASSERT_TRUE(p->has_error());
   EXPECT_EQ(p->error(), "1:13: expected ';' for type alias");
 }
 
 TEST_F(ParserImplTest, GlobalDecl_Function) {
-  auto* p = parser("fn main() -> void { return; }");
+  auto p = parser("fn main() -> void { return; }");
   p->expect_global_decl();
   ASSERT_FALSE(p->has_error()) << p->error();
 
@@ -138,7 +138,7 @@
 }
 
 TEST_F(ParserImplTest, GlobalDecl_Function_WithDecoration) {
-  auto* p = parser("[[workgroup_size(2)]] fn main() -> void { return; }");
+  auto p = parser("[[workgroup_size(2)]] fn main() -> void { return; }");
   p->expect_global_decl();
   ASSERT_FALSE(p->has_error()) << p->error();
 
@@ -148,14 +148,14 @@
 }
 
 TEST_F(ParserImplTest, GlobalDecl_Function_Invalid) {
-  auto* p = parser("fn main() -> { return; }");
+  auto p = parser("fn main() -> { return; }");
   p->expect_global_decl();
   ASSERT_TRUE(p->has_error());
   EXPECT_EQ(p->error(), "1:14: unable to determine function return type");
 }
 
 TEST_F(ParserImplTest, GlobalDecl_ParsesStruct) {
-  auto* p = parser("struct A { b: i32; c: f32;};");
+  auto p = parser("struct A { b: i32; c: f32;};");
   p->expect_global_decl();
   ASSERT_FALSE(p->has_error()) << p->error();
 
@@ -172,7 +172,7 @@
 }
 
 TEST_F(ParserImplTest, GlobalDecl_Struct_WithStride) {
-  auto* p =
+  auto p =
       parser("struct A { [[offset(0)]] data: [[stride(4)]] array<f32>; };");
   p->expect_global_decl();
   ASSERT_FALSE(p->has_error()) << p->error();
@@ -197,7 +197,7 @@
 }
 
 TEST_F(ParserImplTest, GlobalDecl_Struct_WithDecoration) {
-  auto* p = parser("[[block]] struct A { [[offset(0)]] data: f32; };");
+  auto p = parser("[[block]] struct A { [[offset(0)]] data: f32; };");
   p->expect_global_decl();
   ASSERT_FALSE(p->has_error()) << p->error();
 
@@ -215,14 +215,14 @@
 }
 
 TEST_F(ParserImplTest, GlobalDecl_Struct_Invalid) {
-  auto* p = parser("[[block]] A {};");
+  auto p = parser("[[block]] A {};");
   p->expect_global_decl();
   ASSERT_TRUE(p->has_error());
   EXPECT_EQ(p->error(), "1:11: expected declaration after decorations");
 }
 
 TEST_F(ParserImplTest, GlobalDecl_StructMissing_Semi) {
-  auto* p = parser("[[block]] struct A {}");
+  auto p = parser("[[block]] struct A {}");
   p->expect_global_decl();
   ASSERT_TRUE(p->has_error());
   EXPECT_EQ(p->error(), "1:22: expected ';' for struct declaration");
diff --git a/src/reader/wgsl/parser_impl_global_variable_decl_test.cc b/src/reader/wgsl/parser_impl_global_variable_decl_test.cc
index d714e96..65913b3 100644
--- a/src/reader/wgsl/parser_impl_global_variable_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_global_variable_decl_test.cc
@@ -24,7 +24,7 @@
 namespace {
 
 TEST_F(ParserImplTest, GlobalVariableDecl_WithoutConstructor) {
-  auto* p = parser("var<out> a : f32");
+  auto p = parser("var<out> a : f32");
   auto decos = p->decoration_list();
   EXPECT_FALSE(decos.errored);
   EXPECT_FALSE(decos.matched);
@@ -48,7 +48,7 @@
 }
 
 TEST_F(ParserImplTest, GlobalVariableDecl_WithConstructor) {
-  auto* p = parser("var<out> a : f32 = 1.");
+  auto p = parser("var<out> a : f32 = 1.");
   auto decos = p->decoration_list();
   EXPECT_FALSE(decos.errored);
   EXPECT_FALSE(decos.matched);
@@ -75,7 +75,7 @@
 }
 
 TEST_F(ParserImplTest, GlobalVariableDecl_WithDecoration) {
-  auto* p = parser("[[binding(2), set(1)]] var<out> a : f32");
+  auto p = parser("[[binding(2), set(1)]] var<out> a : f32");
   auto decos = p->decoration_list();
   EXPECT_FALSE(decos.errored);
   EXPECT_TRUE(decos.matched);
@@ -108,7 +108,7 @@
 }
 
 TEST_F(ParserImplTest, GlobalVariableDecl_WithDecoration_MulitpleGroups) {
-  auto* p = parser("[[binding(2)]] [[set(1)]] var<out> a : f32");
+  auto p = parser("[[binding(2)]] [[set(1)]] var<out> a : f32");
   auto decos = p->decoration_list();
   EXPECT_FALSE(decos.errored);
   EXPECT_TRUE(decos.matched);
@@ -142,7 +142,7 @@
 }
 
 TEST_F(ParserImplTest, GlobalVariableDecl_InvalidDecoration) {
-  auto* p = parser("[[binding()]] var<out> a : f32");
+  auto p = parser("[[binding()]] var<out> a : f32");
   auto decos = p->decoration_list();
   EXPECT_TRUE(decos.errored);
   EXPECT_FALSE(decos.matched);
@@ -158,7 +158,7 @@
 }
 
 TEST_F(ParserImplTest, GlobalVariableDecl_InvalidConstExpr) {
-  auto* p = parser("var<out> a : f32 = if (a) {}");
+  auto p = parser("var<out> a : f32 = if (a) {}");
   auto decos = p->decoration_list();
   EXPECT_FALSE(decos.errored);
   EXPECT_FALSE(decos.matched);
@@ -171,7 +171,7 @@
 }
 
 TEST_F(ParserImplTest, GlobalVariableDecl_InvalidVariableDecl) {
-  auto* p = parser("var<invalid> a : f32;");
+  auto p = parser("var<invalid> a : f32;");
   auto decos = p->decoration_list();
   EXPECT_FALSE(decos.errored);
   EXPECT_FALSE(decos.matched);
diff --git a/src/reader/wgsl/parser_impl_if_stmt_test.cc b/src/reader/wgsl/parser_impl_if_stmt_test.cc
index 0297559..4fd989e 100644
--- a/src/reader/wgsl/parser_impl_if_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_if_stmt_test.cc
@@ -24,7 +24,7 @@
 namespace {
 
 TEST_F(ParserImplTest, IfStmt) {
-  auto* p = parser("if (a == 4) { a = b; c = d; }");
+  auto p = parser("if (a == 4) { a = b; c = d; }");
   auto e = p->if_stmt();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -39,8 +39,7 @@
 }
 
 TEST_F(ParserImplTest, IfStmt_WithElse) {
-  auto* p =
-      parser("if (a == 4) { a = b; c = d; } elseif(c) { d = 2; } else {}");
+  auto p = parser("if (a == 4) { a = b; c = d; } elseif(c) { d = 2; } else {}");
   auto e = p->if_stmt();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -62,7 +61,7 @@
 }
 
 TEST_F(ParserImplTest, IfStmt_InvalidCondition) {
-  auto* p = parser("if (a = 3) {}");
+  auto p = parser("if (a = 3) {}");
   auto e = p->if_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -72,7 +71,7 @@
 }
 
 TEST_F(ParserImplTest, IfStmt_MissingCondition) {
-  auto* p = parser("if {}");
+  auto p = parser("if {}");
   auto e = p->if_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -82,7 +81,7 @@
 }
 
 TEST_F(ParserImplTest, IfStmt_InvalidBody) {
-  auto* p = parser("if (a) { fn main() -> void {}}");
+  auto p = parser("if (a) { fn main() -> void {}}");
   auto e = p->if_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -92,7 +91,7 @@
 }
 
 TEST_F(ParserImplTest, IfStmt_MissingBody) {
-  auto* p = parser("if (a)");
+  auto p = parser("if (a)");
   auto e = p->if_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -102,7 +101,7 @@
 }
 
 TEST_F(ParserImplTest, IfStmt_InvalidElseif) {
-  auto* p = parser("if (a) {} elseif (a) { fn main() -> a{}}");
+  auto p = parser("if (a) {} elseif (a) { fn main() -> a{}}");
   auto e = p->if_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -112,7 +111,7 @@
 }
 
 TEST_F(ParserImplTest, IfStmt_InvalidElse) {
-  auto* p = parser("if (a) {} else { fn main() -> a{}}");
+  auto p = parser("if (a) {} else { fn main() -> a{}}");
   auto e = p->if_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_image_storage_type_test.cc b/src/reader/wgsl/parser_impl_image_storage_type_test.cc
index f454a3b..64462f7 100644
--- a/src/reader/wgsl/parser_impl_image_storage_type_test.cc
+++ b/src/reader/wgsl/parser_impl_image_storage_type_test.cc
@@ -23,7 +23,7 @@
 namespace {
 
 TEST_F(ParserImplTest, ImageStorageType_Invalid) {
-  auto* p = parser("1234");
+  auto p = parser("1234");
   auto t = p->expect_image_storage_type("test");
   EXPECT_TRUE(t.errored);
   EXPECT_TRUE(p->has_error());
@@ -31,7 +31,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_R8Unorm) {
-  auto* p = parser("r8unorm");
+  auto p = parser("r8unorm");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kR8Unorm);
@@ -39,7 +39,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_R8Snorm) {
-  auto* p = parser("r8snorm");
+  auto p = parser("r8snorm");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kR8Snorm);
@@ -47,7 +47,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_R8Uint) {
-  auto* p = parser("r8uint");
+  auto p = parser("r8uint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kR8Uint);
@@ -55,7 +55,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_R8Sint) {
-  auto* p = parser("r8sint");
+  auto p = parser("r8sint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kR8Sint);
@@ -63,7 +63,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_R16Uint) {
-  auto* p = parser("r16uint");
+  auto p = parser("r16uint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kR16Uint);
@@ -71,7 +71,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_R16Sint) {
-  auto* p = parser("r16sint");
+  auto p = parser("r16sint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kR16Sint);
@@ -79,7 +79,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_R16Float) {
-  auto* p = parser("r16float");
+  auto p = parser("r16float");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kR16Float);
@@ -87,7 +87,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Rg8Unorm) {
-  auto* p = parser("rg8unorm");
+  auto p = parser("rg8unorm");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kRg8Unorm);
@@ -95,7 +95,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Rg8Snorm) {
-  auto* p = parser("rg8snorm");
+  auto p = parser("rg8snorm");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kRg8Snorm);
@@ -103,7 +103,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Rg8Uint) {
-  auto* p = parser("rg8uint");
+  auto p = parser("rg8uint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kRg8Uint);
@@ -111,7 +111,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Rg8Sint) {
-  auto* p = parser("rg8sint");
+  auto p = parser("rg8sint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kRg8Sint);
@@ -119,7 +119,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_R32Uint) {
-  auto* p = parser("r32uint");
+  auto p = parser("r32uint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kR32Uint);
@@ -127,7 +127,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_R32Sint) {
-  auto* p = parser("r32sint");
+  auto p = parser("r32sint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kR32Sint);
@@ -135,7 +135,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_R32Float) {
-  auto* p = parser("r32float");
+  auto p = parser("r32float");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kR32Float);
@@ -143,7 +143,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Rg16Uint) {
-  auto* p = parser("rg16uint");
+  auto p = parser("rg16uint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kRg16Uint);
@@ -151,7 +151,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Rg16Sint) {
-  auto* p = parser("rg16sint");
+  auto p = parser("rg16sint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kRg16Sint);
@@ -159,7 +159,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Rg16Float) {
-  auto* p = parser("rg16float");
+  auto p = parser("rg16float");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kRg16Float);
@@ -167,7 +167,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Rgba8Unorm) {
-  auto* p = parser("rgba8unorm");
+  auto p = parser("rgba8unorm");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kRgba8Unorm);
@@ -175,7 +175,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Rgba8UnormSrgb) {
-  auto* p = parser("rgba8unorm_srgb");
+  auto p = parser("rgba8unorm_srgb");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kRgba8UnormSrgb);
@@ -183,7 +183,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Rgba8Snorm) {
-  auto* p = parser("rgba8snorm");
+  auto p = parser("rgba8snorm");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kRgba8Snorm);
@@ -191,7 +191,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Rgba8Uint) {
-  auto* p = parser("rgba8uint");
+  auto p = parser("rgba8uint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kRgba8Uint);
@@ -199,7 +199,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Rgba8Sint) {
-  auto* p = parser("rgba8sint");
+  auto p = parser("rgba8sint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kRgba8Sint);
@@ -207,7 +207,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Bgra8Unorm) {
-  auto* p = parser("bgra8unorm");
+  auto p = parser("bgra8unorm");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kBgra8Unorm);
@@ -215,7 +215,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Bgra8UnormSrgb) {
-  auto* p = parser("bgra8unorm_srgb");
+  auto p = parser("bgra8unorm_srgb");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kBgra8UnormSrgb);
@@ -223,7 +223,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Rgb10A2Unorm) {
-  auto* p = parser("rgb10a2unorm");
+  auto p = parser("rgb10a2unorm");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kRgb10A2Unorm);
@@ -231,7 +231,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Rg11B10Float) {
-  auto* p = parser("rg11b10float");
+  auto p = parser("rg11b10float");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kRg11B10Float);
@@ -239,7 +239,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Rg32Uint) {
-  auto* p = parser("rg32uint");
+  auto p = parser("rg32uint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kRg32Uint);
@@ -247,7 +247,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Rg32Sint) {
-  auto* p = parser("rg32sint");
+  auto p = parser("rg32sint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kRg32Sint);
@@ -255,7 +255,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Rg32Float) {
-  auto* p = parser("rg32float");
+  auto p = parser("rg32float");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kRg32Float);
@@ -263,7 +263,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Rgba16Uint) {
-  auto* p = parser("rgba16uint");
+  auto p = parser("rgba16uint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kRgba16Uint);
@@ -271,7 +271,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Rgba16Sint) {
-  auto* p = parser("rgba16sint");
+  auto p = parser("rgba16sint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kRgba16Sint);
@@ -279,7 +279,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Rgba16Float) {
-  auto* p = parser("rgba16float");
+  auto p = parser("rgba16float");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kRgba16Float);
@@ -287,7 +287,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Rgba32Uint) {
-  auto* p = parser("rgba32uint");
+  auto p = parser("rgba32uint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kRgba32Uint);
@@ -295,7 +295,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Rgba32Sint) {
-  auto* p = parser("rgba32sint");
+  auto p = parser("rgba32sint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kRgba32Sint);
@@ -303,7 +303,7 @@
 }
 
 TEST_F(ParserImplTest, ImageStorageType_Rgba32Float) {
-  auto* p = parser("rgba32float");
+  auto p = parser("rgba32float");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
   EXPECT_EQ(t.value, ast::type::ImageFormat::kRgba32Float);
diff --git a/src/reader/wgsl/parser_impl_inclusive_or_expression_test.cc b/src/reader/wgsl/parser_impl_inclusive_or_expression_test.cc
index e010429..e1bf011 100644
--- a/src/reader/wgsl/parser_impl_inclusive_or_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_inclusive_or_expression_test.cc
@@ -26,7 +26,7 @@
 namespace {
 
 TEST_F(ParserImplTest, InclusiveOrExpression_Parses) {
-  auto* p = parser("a | true");
+  auto p = parser("a | true");
   auto e = p->inclusive_or_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -49,7 +49,7 @@
 }
 
 TEST_F(ParserImplTest, InclusiveOrExpression_InvalidLHS) {
-  auto* p = parser("if (a) {} | true");
+  auto p = parser("if (a) {} | true");
   auto e = p->inclusive_or_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -58,7 +58,7 @@
 }
 
 TEST_F(ParserImplTest, InclusiveOrExpression_InvalidRHS) {
-  auto* p = parser("true | if (a) {}");
+  auto p = parser("true | if (a) {}");
   auto e = p->inclusive_or_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -68,7 +68,7 @@
 }
 
 TEST_F(ParserImplTest, InclusiveOrExpression_NoOr_ReturnsLHS) {
-  auto* p = parser("a true");
+  auto p = parser("a true");
   auto e = p->inclusive_or_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_logical_and_expression_test.cc b/src/reader/wgsl/parser_impl_logical_and_expression_test.cc
index 0235cad..e291ce9 100644
--- a/src/reader/wgsl/parser_impl_logical_and_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_logical_and_expression_test.cc
@@ -26,7 +26,7 @@
 namespace {
 
 TEST_F(ParserImplTest, LogicalAndExpression_Parses) {
-  auto* p = parser("a && true");
+  auto p = parser("a && true");
   auto e = p->logical_and_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -49,7 +49,7 @@
 }
 
 TEST_F(ParserImplTest, LogicalAndExpression_InvalidLHS) {
-  auto* p = parser("if (a) {} && true");
+  auto p = parser("if (a) {} && true");
   auto e = p->logical_and_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -58,7 +58,7 @@
 }
 
 TEST_F(ParserImplTest, LogicalAndExpression_InvalidRHS) {
-  auto* p = parser("true && if (a) {}");
+  auto p = parser("true && if (a) {}");
   auto e = p->logical_and_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -68,7 +68,7 @@
 }
 
 TEST_F(ParserImplTest, LogicalAndExpression_NoOr_ReturnsLHS) {
-  auto* p = parser("a true");
+  auto p = parser("a true");
   auto e = p->logical_and_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_logical_or_expression_test.cc b/src/reader/wgsl/parser_impl_logical_or_expression_test.cc
index fd8c934..006f06f 100644
--- a/src/reader/wgsl/parser_impl_logical_or_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_logical_or_expression_test.cc
@@ -26,7 +26,7 @@
 namespace {
 
 TEST_F(ParserImplTest, LogicalOrExpression_Parses) {
-  auto* p = parser("a || true");
+  auto p = parser("a || true");
   auto e = p->logical_or_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -49,7 +49,7 @@
 }
 
 TEST_F(ParserImplTest, LogicalOrExpression_InvalidLHS) {
-  auto* p = parser("if (a) {} || true");
+  auto p = parser("if (a) {} || true");
   auto e = p->logical_or_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -58,7 +58,7 @@
 }
 
 TEST_F(ParserImplTest, LogicalOrExpression_InvalidRHS) {
-  auto* p = parser("true || if (a) {}");
+  auto p = parser("true || if (a) {}");
   auto e = p->logical_or_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -68,7 +68,7 @@
 }
 
 TEST_F(ParserImplTest, LogicalOrExpression_NoOr_ReturnsLHS) {
-  auto* p = parser("a true");
+  auto p = parser("a true");
   auto e = p->logical_or_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_loop_stmt_test.cc b/src/reader/wgsl/parser_impl_loop_stmt_test.cc
index f9198a0..043afca 100644
--- a/src/reader/wgsl/parser_impl_loop_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_loop_stmt_test.cc
@@ -22,7 +22,7 @@
 namespace {
 
 TEST_F(ParserImplTest, LoopStmt_BodyNoContinuing) {
-  auto* p = parser("loop { discard; }");
+  auto p = parser("loop { discard; }");
   auto e = p->loop_stmt();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -36,7 +36,7 @@
 }
 
 TEST_F(ParserImplTest, LoopStmt_BodyWithContinuing) {
-  auto* p = parser("loop { discard; continuing { discard; }}");
+  auto p = parser("loop { discard; continuing { discard; }}");
   auto e = p->loop_stmt();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -51,7 +51,7 @@
 }
 
 TEST_F(ParserImplTest, LoopStmt_NoBodyNoContinuing) {
-  auto* p = parser("loop { }");
+  auto p = parser("loop { }");
   auto e = p->loop_stmt();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -62,7 +62,7 @@
 }
 
 TEST_F(ParserImplTest, LoopStmt_NoBodyWithContinuing) {
-  auto* p = parser("loop { continuing { discard; }}");
+  auto p = parser("loop { continuing { discard; }}");
   auto e = p->loop_stmt();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -74,7 +74,7 @@
 }
 
 TEST_F(ParserImplTest, LoopStmt_MissingBracketLeft) {
-  auto* p = parser("loop discard; }");
+  auto p = parser("loop discard; }");
   auto e = p->loop_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -84,7 +84,7 @@
 }
 
 TEST_F(ParserImplTest, LoopStmt_MissingBracketRight) {
-  auto* p = parser("loop { discard; ");
+  auto p = parser("loop { discard; ");
   auto e = p->loop_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -94,7 +94,7 @@
 }
 
 TEST_F(ParserImplTest, LoopStmt_InvalidStatements) {
-  auto* p = parser("loop { discard }");
+  auto p = parser("loop { discard }");
   auto e = p->loop_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -104,7 +104,7 @@
 }
 
 TEST_F(ParserImplTest, LoopStmt_InvalidContinuing) {
-  auto* p = parser("loop { continuing { discard }}");
+  auto p = parser("loop { continuing { discard }}");
   auto e = p->loop_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_multiplicative_expression_test.cc b/src/reader/wgsl/parser_impl_multiplicative_expression_test.cc
index 19936e9..38f4dac 100644
--- a/src/reader/wgsl/parser_impl_multiplicative_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_multiplicative_expression_test.cc
@@ -26,7 +26,7 @@
 namespace {
 
 TEST_F(ParserImplTest, MultiplicativeExpression_Parses_Multiply) {
-  auto* p = parser("a * true");
+  auto p = parser("a * true");
   auto e = p->multiplicative_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -49,7 +49,7 @@
 }
 
 TEST_F(ParserImplTest, MultiplicativeExpression_Parses_Divide) {
-  auto* p = parser("a / true");
+  auto p = parser("a / true");
   auto e = p->multiplicative_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -72,7 +72,7 @@
 }
 
 TEST_F(ParserImplTest, MultiplicativeExpression_Parses_Modulo) {
-  auto* p = parser("a % true");
+  auto p = parser("a % true");
   auto e = p->multiplicative_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -95,7 +95,7 @@
 }
 
 TEST_F(ParserImplTest, MultiplicativeExpression_InvalidLHS) {
-  auto* p = parser("if (a) {} * true");
+  auto p = parser("if (a) {} * true");
   auto e = p->multiplicative_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -104,7 +104,7 @@
 }
 
 TEST_F(ParserImplTest, MultiplicativeExpression_InvalidRHS) {
-  auto* p = parser("true * if (a) {}");
+  auto p = parser("true * if (a) {}");
   auto e = p->multiplicative_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -114,7 +114,7 @@
 }
 
 TEST_F(ParserImplTest, MultiplicativeExpression_NoOr_ReturnsLHS) {
-  auto* p = parser("a true");
+  auto p = parser("a true");
   auto e = p->multiplicative_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_param_list_test.cc b/src/reader/wgsl/parser_impl_param_list_test.cc
index 03eea45..a969b90 100644
--- a/src/reader/wgsl/parser_impl_param_list_test.cc
+++ b/src/reader/wgsl/parser_impl_param_list_test.cc
@@ -31,7 +31,7 @@
 TEST_F(ParserImplTest, ParamList_Single) {
   auto* i32 = tm()->Get(std::make_unique<ast::type::I32Type>());
 
-  auto* p = parser("a : i32");
+  auto p = parser("a : i32");
   auto e = p->expect_param_list();
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_FALSE(e.errored);
@@ -52,7 +52,7 @@
   auto* f32 = tm()->Get(std::make_unique<ast::type::F32Type>());
   auto* vec2 = tm()->Get(std::make_unique<ast::type::VectorType>(f32, 2));
 
-  auto* p = parser("a : i32, b: f32, c: vec2<f32>");
+  auto p = parser("a : i32, b: f32, c: vec2<f32>");
   auto e = p->expect_param_list();
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_FALSE(e.errored);
@@ -87,7 +87,7 @@
 }
 
 TEST_F(ParserImplTest, ParamList_Empty) {
-  auto* p = parser("");
+  auto p = parser("");
   auto e = p->expect_param_list();
   ASSERT_FALSE(p->has_error());
   ASSERT_FALSE(e.errored);
@@ -95,7 +95,7 @@
 }
 
 TEST_F(ParserImplTest, ParamList_HangingComma) {
-  auto* p = parser("a : i32,");
+  auto p = parser("a : i32,");
   auto e = p->expect_param_list();
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_paren_rhs_stmt_test.cc b/src/reader/wgsl/parser_impl_paren_rhs_stmt_test.cc
index 9cdcf4f..85b7d3c 100644
--- a/src/reader/wgsl/parser_impl_paren_rhs_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_paren_rhs_stmt_test.cc
@@ -22,7 +22,7 @@
 namespace {
 
 TEST_F(ParserImplTest, ParenRhsStmt) {
-  auto* p = parser("(a + b)");
+  auto p = parser("(a + b)");
   auto e = p->expect_paren_rhs_stmt();
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_FALSE(e.errored);
@@ -31,7 +31,7 @@
 }
 
 TEST_F(ParserImplTest, ParenRhsStmt_MissingLeftParen) {
-  auto* p = parser("true)");
+  auto p = parser("true)");
   auto e = p->expect_paren_rhs_stmt();
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(e.errored);
@@ -40,7 +40,7 @@
 }
 
 TEST_F(ParserImplTest, ParenRhsStmt_MissingRightParen) {
-  auto* p = parser("(true");
+  auto p = parser("(true");
   auto e = p->expect_paren_rhs_stmt();
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(e.errored);
@@ -49,7 +49,7 @@
 }
 
 TEST_F(ParserImplTest, ParenRhsStmt_InvalidExpression) {
-  auto* p = parser("(if (a() {})");
+  auto p = parser("(if (a() {})");
   auto e = p->expect_paren_rhs_stmt();
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(e.errored);
@@ -58,7 +58,7 @@
 }
 
 TEST_F(ParserImplTest, ParenRhsStmt_MissingExpression) {
-  auto* p = parser("()");
+  auto p = parser("()");
   auto e = p->expect_paren_rhs_stmt();
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_pipeline_stage_test.cc b/src/reader/wgsl/parser_impl_pipeline_stage_test.cc
index 4cae54e..009d24c 100644
--- a/src/reader/wgsl/parser_impl_pipeline_stage_test.cc
+++ b/src/reader/wgsl/parser_impl_pipeline_stage_test.cc
@@ -34,7 +34,7 @@
 
 TEST_P(PipelineStageTest, Parses) {
   auto params = GetParam();
-  auto* p = parser(params.input);
+  auto p = parser(params.input);
 
   auto stage = p->expect_pipeline_stage();
   ASSERT_FALSE(p->has_error()) << p->error();
@@ -57,7 +57,7 @@
         PipelineStageData{"compute", ast::PipelineStage::kCompute}));
 
 TEST_F(ParserImplTest, PipelineStage_NoMatch) {
-  auto* p = parser("not-a-stage");
+  auto p = parser("not-a-stage");
   auto stage = p->expect_pipeline_stage();
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(stage.errored);
diff --git a/src/reader/wgsl/parser_impl_postfix_expression_test.cc b/src/reader/wgsl/parser_impl_postfix_expression_test.cc
index 90b5cfe..10730da 100644
--- a/src/reader/wgsl/parser_impl_postfix_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_postfix_expression_test.cc
@@ -29,7 +29,7 @@
 namespace {
 
 TEST_F(ParserImplTest, PostfixExpression_Array_ConstantIndex) {
-  auto* p = parser("a[1]");
+  auto p = parser("a[1]");
   auto e = p->postfix_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -51,7 +51,7 @@
 }
 
 TEST_F(ParserImplTest, PostfixExpression_Array_ExpressionIndex) {
-  auto* p = parser("a[1 + b / 4]");
+  auto p = parser("a[1 + b / 4]");
   auto e = p->postfix_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -69,7 +69,7 @@
 }
 
 TEST_F(ParserImplTest, PostfixExpression_Array_MissingIndex) {
-  auto* p = parser("a[]");
+  auto p = parser("a[]");
   auto e = p->postfix_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -79,7 +79,7 @@
 }
 
 TEST_F(ParserImplTest, PostfixExpression_Array_MissingRightBrace) {
-  auto* p = parser("a[1");
+  auto p = parser("a[1");
   auto e = p->postfix_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -89,7 +89,7 @@
 }
 
 TEST_F(ParserImplTest, PostfixExpression_Array_InvalidIndex) {
-  auto* p = parser("a[if(a() {})]");
+  auto p = parser("a[if(a() {})]");
   auto e = p->postfix_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -99,7 +99,7 @@
 }
 
 TEST_F(ParserImplTest, PostfixExpression_Call_Empty) {
-  auto* p = parser("a()");
+  auto p = parser("a()");
   auto e = p->postfix_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -117,7 +117,7 @@
 }
 
 TEST_F(ParserImplTest, PostfixExpression_Call_WithArgs) {
-  auto* p = parser("test(1, b, 2 + 3 / b)");
+  auto p = parser("test(1, b, 2 + 3 / b)");
   auto e = p->postfix_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -138,7 +138,7 @@
 }
 
 TEST_F(ParserImplTest, PostfixExpression_Call_InvalidArg) {
-  auto* p = parser("a(if(a) {})");
+  auto p = parser("a(if(a) {})");
   auto e = p->postfix_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -148,7 +148,7 @@
 }
 
 TEST_F(ParserImplTest, PostfixExpression_Call_HangingComma) {
-  auto* p = parser("a(b, )");
+  auto p = parser("a(b, )");
   auto e = p->postfix_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -158,7 +158,7 @@
 }
 
 TEST_F(ParserImplTest, PostfixExpression_Call_MissingRightParen) {
-  auto* p = parser("a(");
+  auto p = parser("a(");
   auto e = p->postfix_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -168,7 +168,7 @@
 }
 
 TEST_F(ParserImplTest, PostfixExpression_MemberAccessor) {
-  auto* p = parser("a.b");
+  auto p = parser("a.b");
   auto e = p->postfix_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -185,7 +185,7 @@
 }
 
 TEST_F(ParserImplTest, PostfixExpression_MemberAccesssor_InvalidIdent) {
-  auto* p = parser("a.if");
+  auto p = parser("a.if");
   auto e = p->postfix_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -195,7 +195,7 @@
 }
 
 TEST_F(ParserImplTest, PostfixExpression_MemberAccessor_MissingIdent) {
-  auto* p = parser("a.");
+  auto p = parser("a.");
   auto e = p->postfix_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -205,7 +205,7 @@
 }
 
 TEST_F(ParserImplTest, PostfixExpression_NonMatch_returnLHS) {
-  auto* p = parser("a b");
+  auto p = parser("a b");
   auto e = p->postfix_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_primary_expression_test.cc b/src/reader/wgsl/parser_impl_primary_expression_test.cc
index ab77de9..4d1cc5e 100644
--- a/src/reader/wgsl/parser_impl_primary_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_primary_expression_test.cc
@@ -33,7 +33,7 @@
 namespace {
 
 TEST_F(ParserImplTest, PrimaryExpression_Ident) {
-  auto* p = parser("a");
+  auto p = parser("a");
   auto e = p->primary_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -45,7 +45,7 @@
 }
 
 TEST_F(ParserImplTest, PrimaryExpression_TypeDecl) {
-  auto* p = parser("vec4<i32>(1, 2, 3, 4))");
+  auto p = parser("vec4<i32>(1, 2, 3, 4))");
   auto e = p->primary_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -83,7 +83,7 @@
 }
 
 TEST_F(ParserImplTest, PrimaryExpression_TypeDecl_ZeroConstructor) {
-  auto* p = parser("vec4<i32>()");
+  auto p = parser("vec4<i32>()");
   auto e = p->primary_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -97,7 +97,7 @@
 }
 
 TEST_F(ParserImplTest, PrimaryExpression_TypeDecl_InvalidTypeDecl) {
-  auto* p = parser("vec4<if>(2., 3., 4., 5.)");
+  auto p = parser("vec4<if>(2., 3., 4., 5.)");
   auto e = p->primary_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -107,7 +107,7 @@
 }
 
 TEST_F(ParserImplTest, PrimaryExpression_TypeDecl_MissingLeftParen) {
-  auto* p = parser("vec4<f32> 2., 3., 4., 5.)");
+  auto p = parser("vec4<f32> 2., 3., 4., 5.)");
   auto e = p->primary_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -117,7 +117,7 @@
 }
 
 TEST_F(ParserImplTest, PrimaryExpression_TypeDecl_MissingRightParen) {
-  auto* p = parser("vec4<f32>(2., 3., 4., 5.");
+  auto p = parser("vec4<f32>(2., 3., 4., 5.");
   auto e = p->primary_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -127,7 +127,7 @@
 }
 
 TEST_F(ParserImplTest, PrimaryExpression_TypeDecl_InvalidValue) {
-  auto* p = parser("i32(if(a) {})");
+  auto p = parser("i32(if(a) {})");
   auto e = p->primary_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -137,7 +137,7 @@
 }
 
 TEST_F(ParserImplTest, PrimaryExpression_ConstLiteral_True) {
-  auto* p = parser("true");
+  auto p = parser("true");
   auto e = p->primary_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -151,7 +151,7 @@
 }
 
 TEST_F(ParserImplTest, PrimaryExpression_ParenExpr) {
-  auto* p = parser("(a == b)");
+  auto p = parser("(a == b)");
   auto e = p->primary_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -161,7 +161,7 @@
 }
 
 TEST_F(ParserImplTest, PrimaryExpression_ParenExpr_MissingRightParen) {
-  auto* p = parser("(a == b");
+  auto p = parser("(a == b");
   auto e = p->primary_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -171,7 +171,7 @@
 }
 
 TEST_F(ParserImplTest, PrimaryExpression_ParenExpr_MissingExpr) {
-  auto* p = parser("()");
+  auto p = parser("()");
   auto e = p->primary_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -181,7 +181,7 @@
 }
 
 TEST_F(ParserImplTest, PrimaryExpression_ParenExpr_InvalidExpr) {
-  auto* p = parser("(if (a) {})");
+  auto p = parser("(if (a) {})");
   auto e = p->primary_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -193,7 +193,7 @@
 TEST_F(ParserImplTest, PrimaryExpression_Cast) {
   auto* f32_type = tm()->Get(std::make_unique<ast::type::F32Type>());
 
-  auto* p = parser("f32(1)");
+  auto p = parser("f32(1)");
   auto e = p->primary_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -213,7 +213,7 @@
 TEST_F(ParserImplTest, PrimaryExpression_Bitcast) {
   auto* f32_type = tm()->Get(std::make_unique<ast::type::F32Type>());
 
-  auto* p = parser("bitcast<f32>(1)");
+  auto p = parser("bitcast<f32>(1)");
   auto e = p->primary_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -229,7 +229,7 @@
 }
 
 TEST_F(ParserImplTest, PrimaryExpression_Bitcast_MissingGreaterThan) {
-  auto* p = parser("bitcast<f32(1)");
+  auto p = parser("bitcast<f32(1)");
   auto e = p->primary_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -239,7 +239,7 @@
 }
 
 TEST_F(ParserImplTest, PrimaryExpression_Bitcast_MissingType) {
-  auto* p = parser("bitcast<>(1)");
+  auto p = parser("bitcast<>(1)");
   auto e = p->primary_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -249,7 +249,7 @@
 }
 
 TEST_F(ParserImplTest, PrimaryExpression_Bitcast_InvalidType) {
-  auto* p = parser("bitcast<invalid>(1)");
+  auto p = parser("bitcast<invalid>(1)");
   auto e = p->primary_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -259,7 +259,7 @@
 }
 
 TEST_F(ParserImplTest, PrimaryExpression_Bitcast_MissingLeftParen) {
-  auto* p = parser("bitcast<f32>1)");
+  auto p = parser("bitcast<f32>1)");
   auto e = p->primary_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -269,7 +269,7 @@
 }
 
 TEST_F(ParserImplTest, PrimaryExpression_Bitcast_MissingRightParen) {
-  auto* p = parser("bitcast<f32>(1");
+  auto p = parser("bitcast<f32>(1");
   auto e = p->primary_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -279,7 +279,7 @@
 }
 
 TEST_F(ParserImplTest, PrimaryExpression_Bitcast_MissingExpression) {
-  auto* p = parser("bitcast<f32>()");
+  auto p = parser("bitcast<f32>()");
   auto e = p->primary_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -289,7 +289,7 @@
 }
 
 TEST_F(ParserImplTest, PrimaryExpression_bitcast_InvalidExpression) {
-  auto* p = parser("bitcast<f32>(if (a) {})");
+  auto p = parser("bitcast<f32>(if (a) {})");
   auto e = p->primary_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_relational_expression_test.cc b/src/reader/wgsl/parser_impl_relational_expression_test.cc
index f679dd8..70f9a70 100644
--- a/src/reader/wgsl/parser_impl_relational_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_relational_expression_test.cc
@@ -26,7 +26,7 @@
 namespace {
 
 TEST_F(ParserImplTest, RelationalExpression_Parses_LessThan) {
-  auto* p = parser("a < true");
+  auto p = parser("a < true");
   auto e = p->relational_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -49,7 +49,7 @@
 }
 
 TEST_F(ParserImplTest, RelationalExpression_Parses_GreaterThan) {
-  auto* p = parser("a > true");
+  auto p = parser("a > true");
   auto e = p->relational_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -72,7 +72,7 @@
 }
 
 TEST_F(ParserImplTest, RelationalExpression_Parses_LessThanEqual) {
-  auto* p = parser("a <= true");
+  auto p = parser("a <= true");
   auto e = p->relational_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -95,7 +95,7 @@
 }
 
 TEST_F(ParserImplTest, RelationalExpression_Parses_GreaterThanEqual) {
-  auto* p = parser("a >= true");
+  auto p = parser("a >= true");
   auto e = p->relational_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -118,7 +118,7 @@
 }
 
 TEST_F(ParserImplTest, RelationalExpression_InvalidLHS) {
-  auto* p = parser("if (a) {} < true");
+  auto p = parser("if (a) {} < true");
   auto e = p->relational_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -127,7 +127,7 @@
 }
 
 TEST_F(ParserImplTest, RelationalExpression_InvalidRHS) {
-  auto* p = parser("true < if (a) {}");
+  auto p = parser("true < if (a) {}");
   auto e = p->relational_expression();
   ASSERT_TRUE(p->has_error());
   EXPECT_EQ(e.value, nullptr);
@@ -135,7 +135,7 @@
 }
 
 TEST_F(ParserImplTest, RelationalExpression_NoOr_ReturnsLHS) {
-  auto* p = parser("a true");
+  auto p = parser("a true");
   auto e = p->relational_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_sampled_texture_type_test.cc b/src/reader/wgsl/parser_impl_sampled_texture_type_test.cc
index 9406bdc..deda8b7 100644
--- a/src/reader/wgsl/parser_impl_sampled_texture_type_test.cc
+++ b/src/reader/wgsl/parser_impl_sampled_texture_type_test.cc
@@ -23,7 +23,7 @@
 namespace {
 
 TEST_F(ParserImplTest, SampledTextureType_Invalid) {
-  auto* p = parser("1234");
+  auto p = parser("1234");
   auto t = p->sampled_texture_type();
   EXPECT_FALSE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -31,7 +31,7 @@
 }
 
 TEST_F(ParserImplTest, SampledTextureType_1d_Old) {
-  auto* p = parser("texture_sampled_1d");
+  auto p = parser("texture_sampled_1d");
   auto t = p->sampled_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -40,7 +40,7 @@
 }
 
 TEST_F(ParserImplTest, SampledTextureType_1dArray_Old) {
-  auto* p = parser("texture_sampled_1d_array");
+  auto p = parser("texture_sampled_1d_array");
   auto t = p->sampled_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -49,7 +49,7 @@
 }
 
 TEST_F(ParserImplTest, SampledTextureType_2d_Old) {
-  auto* p = parser("texture_sampled_2d");
+  auto p = parser("texture_sampled_2d");
   auto t = p->sampled_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -58,7 +58,7 @@
 }
 
 TEST_F(ParserImplTest, SampledTextureType_2dArray_Old) {
-  auto* p = parser("texture_sampled_2d_array");
+  auto p = parser("texture_sampled_2d_array");
   auto t = p->sampled_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -67,7 +67,7 @@
 }
 
 TEST_F(ParserImplTest, SampledTextureType_3d_Old) {
-  auto* p = parser("texture_sampled_3d");
+  auto p = parser("texture_sampled_3d");
   auto t = p->sampled_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -76,7 +76,7 @@
 }
 
 TEST_F(ParserImplTest, SampledTextureType_Cube_Old) {
-  auto* p = parser("texture_sampled_cube");
+  auto p = parser("texture_sampled_cube");
   auto t = p->sampled_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -85,7 +85,7 @@
 }
 
 TEST_F(ParserImplTest, SampledTextureType_kCubeArray_Old) {
-  auto* p = parser("texture_sampled_cube_array");
+  auto p = parser("texture_sampled_cube_array");
   auto t = p->sampled_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -94,7 +94,7 @@
 }
 
 TEST_F(ParserImplTest, SampledTextureType_1d) {
-  auto* p = parser("texture_1d");
+  auto p = parser("texture_1d");
   auto t = p->sampled_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -103,7 +103,7 @@
 }
 
 TEST_F(ParserImplTest, SampledTextureType_1dArray) {
-  auto* p = parser("texture_1d_array");
+  auto p = parser("texture_1d_array");
   auto t = p->sampled_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -112,7 +112,7 @@
 }
 
 TEST_F(ParserImplTest, SampledTextureType_2d) {
-  auto* p = parser("texture_2d");
+  auto p = parser("texture_2d");
   auto t = p->sampled_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -121,7 +121,7 @@
 }
 
 TEST_F(ParserImplTest, SampledTextureType_2dArray) {
-  auto* p = parser("texture_2d_array");
+  auto p = parser("texture_2d_array");
   auto t = p->sampled_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -130,7 +130,7 @@
 }
 
 TEST_F(ParserImplTest, SampledTextureType_3d) {
-  auto* p = parser("texture_3d");
+  auto p = parser("texture_3d");
   auto t = p->sampled_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -139,7 +139,7 @@
 }
 
 TEST_F(ParserImplTest, SampledTextureType_Cube) {
-  auto* p = parser("texture_cube");
+  auto p = parser("texture_cube");
   auto t = p->sampled_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -148,7 +148,7 @@
 }
 
 TEST_F(ParserImplTest, SampledTextureType_kCubeArray) {
-  auto* p = parser("texture_cube_array");
+  auto p = parser("texture_cube_array");
   auto t = p->sampled_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
diff --git a/src/reader/wgsl/parser_impl_sampler_type_test.cc b/src/reader/wgsl/parser_impl_sampler_type_test.cc
index d1c69ed..76e376a 100644
--- a/src/reader/wgsl/parser_impl_sampler_type_test.cc
+++ b/src/reader/wgsl/parser_impl_sampler_type_test.cc
@@ -23,7 +23,7 @@
 namespace {
 
 TEST_F(ParserImplTest, SamplerType_Invalid) {
-  auto* p = parser("1234");
+  auto p = parser("1234");
   auto t = p->sampler_type();
   EXPECT_FALSE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -32,7 +32,7 @@
 }
 
 TEST_F(ParserImplTest, SamplerType_Sampler) {
-  auto* p = parser("sampler");
+  auto p = parser("sampler");
   auto t = p->sampler_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -43,7 +43,7 @@
 }
 
 TEST_F(ParserImplTest, SamplerType_ComparisonSampler) {
-  auto* p = parser("sampler_comparison");
+  auto p = parser("sampler_comparison");
   auto t = p->sampler_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
diff --git a/src/reader/wgsl/parser_impl_shift_expression_test.cc b/src/reader/wgsl/parser_impl_shift_expression_test.cc
index 9118cfd..4bda7f4 100644
--- a/src/reader/wgsl/parser_impl_shift_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_shift_expression_test.cc
@@ -26,7 +26,7 @@
 namespace {
 
 TEST_F(ParserImplTest, ShiftExpression_Parses_ShiftLeft) {
-  auto* p = parser("a << true");
+  auto p = parser("a << true");
   auto e = p->shift_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -49,7 +49,7 @@
 }
 
 TEST_F(ParserImplTest, ShiftExpression_Parses_ShiftRight) {
-  auto* p = parser("a >> true");
+  auto p = parser("a >> true");
   auto e = p->shift_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -72,7 +72,7 @@
 }
 
 TEST_F(ParserImplTest, ShiftExpression_InvalidLHS) {
-  auto* p = parser("if (a) {} << true");
+  auto p = parser("if (a) {} << true");
   auto e = p->shift_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -81,7 +81,7 @@
 }
 
 TEST_F(ParserImplTest, ShiftExpression_InvalidRHS) {
-  auto* p = parser("true << if (a) {}");
+  auto p = parser("true << if (a) {}");
   auto e = p->shift_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -91,7 +91,7 @@
 }
 
 TEST_F(ParserImplTest, ShiftExpression_NoOr_ReturnsLHS) {
-  auto* p = parser("a true");
+  auto p = parser("a true");
   auto e = p->shift_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_statement_test.cc b/src/reader/wgsl/parser_impl_statement_test.cc
index 166a949..85489de 100644
--- a/src/reader/wgsl/parser_impl_statement_test.cc
+++ b/src/reader/wgsl/parser_impl_statement_test.cc
@@ -24,7 +24,7 @@
 namespace {
 
 TEST_F(ParserImplTest, Statement) {
-  auto* p = parser("return;");
+  auto p = parser("return;");
   auto e = p->statement();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(e.matched);
@@ -33,13 +33,13 @@
 }
 
 TEST_F(ParserImplTest, Statement_Semicolon) {
-  auto* p = parser(";");
+  auto p = parser(";");
   p->statement();
   ASSERT_FALSE(p->has_error()) << p->error();
 }
 
 TEST_F(ParserImplTest, Statement_Return_NoValue) {
-  auto* p = parser("return;");
+  auto p = parser("return;");
   auto e = p->statement();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(e.matched);
@@ -50,7 +50,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Return_Value) {
-  auto* p = parser("return a + b * (.1 - .2);");
+  auto p = parser("return a + b * (.1 - .2);");
   auto e = p->statement();
   ASSERT_FALSE(p->has_error()) << p->error();
 
@@ -63,7 +63,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Return_MissingSemi) {
-  auto* p = parser("return");
+  auto p = parser("return");
   auto e = p->statement();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -73,7 +73,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Return_Invalid) {
-  auto* p = parser("return if(a) {};");
+  auto p = parser("return if(a) {};");
   auto e = p->statement();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -83,7 +83,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_If) {
-  auto* p = parser("if (a) {}");
+  auto p = parser("if (a) {}");
   auto e = p->statement();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(e.matched);
@@ -92,7 +92,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_If_Invalid) {
-  auto* p = parser("if (a) { fn main() -> {}}");
+  auto p = parser("if (a) { fn main() -> {}}");
   auto e = p->statement();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -102,7 +102,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Variable) {
-  auto* p = parser("var a : i32 = 1;");
+  auto p = parser("var a : i32 = 1;");
   auto e = p->statement();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(e.matched);
@@ -111,7 +111,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Variable_Invalid) {
-  auto* p = parser("var a : i32 =;");
+  auto p = parser("var a : i32 =;");
   auto e = p->statement();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -121,7 +121,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Variable_MissingSemicolon) {
-  auto* p = parser("var a : i32");
+  auto p = parser("var a : i32");
   auto e = p->statement();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -131,7 +131,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Switch) {
-  auto* p = parser("switch (a) {}");
+  auto p = parser("switch (a) {}");
   auto e = p->statement();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(e.matched);
@@ -140,7 +140,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Switch_Invalid) {
-  auto* p = parser("switch (a) { case: {}}");
+  auto p = parser("switch (a) { case: {}}");
   auto e = p->statement();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -150,7 +150,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Loop) {
-  auto* p = parser("loop {}");
+  auto p = parser("loop {}");
   auto e = p->statement();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(e.matched);
@@ -159,7 +159,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Loop_Invalid) {
-  auto* p = parser("loop discard; }");
+  auto p = parser("loop discard; }");
   auto e = p->statement();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -169,7 +169,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Assignment) {
-  auto* p = parser("a = b;");
+  auto p = parser("a = b;");
   auto e = p->statement();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(e.matched);
@@ -178,7 +178,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Assignment_Invalid) {
-  auto* p = parser("a = if(b) {};");
+  auto p = parser("a = if(b) {};");
   auto e = p->statement();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -188,7 +188,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Assignment_MissingSemicolon) {
-  auto* p = parser("a = b");
+  auto p = parser("a = b");
   auto e = p->statement();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -198,7 +198,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Break) {
-  auto* p = parser("break;");
+  auto p = parser("break;");
   auto e = p->statement();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(e.matched);
@@ -207,7 +207,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Break_MissingSemicolon) {
-  auto* p = parser("break");
+  auto p = parser("break");
   auto e = p->statement();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -217,7 +217,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Continue) {
-  auto* p = parser("continue;");
+  auto p = parser("continue;");
   auto e = p->statement();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(e.matched);
@@ -226,7 +226,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Continue_MissingSemicolon) {
-  auto* p = parser("continue");
+  auto p = parser("continue");
   auto e = p->statement();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -236,7 +236,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Discard) {
-  auto* p = parser("discard;");
+  auto p = parser("discard;");
   auto e = p->statement();
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_NE(e.value, nullptr);
@@ -246,7 +246,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Discard_MissingSemicolon) {
-  auto* p = parser("discard");
+  auto p = parser("discard");
   auto e = p->statement();
   EXPECT_TRUE(p->has_error());
   EXPECT_EQ(e.value, nullptr);
@@ -256,7 +256,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Body) {
-  auto* p = parser("{ var i: i32; }");
+  auto p = parser("{ var i: i32; }");
   auto e = p->statement();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(e.matched);
@@ -266,7 +266,7 @@
 }
 
 TEST_F(ParserImplTest, Statement_Body_Invalid) {
-  auto* p = parser("{ fn main() -> {}}");
+  auto p = parser("{ fn main() -> {}}");
   auto e = p->statement();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_statements_test.cc b/src/reader/wgsl/parser_impl_statements_test.cc
index 58cdc21..55bd919 100644
--- a/src/reader/wgsl/parser_impl_statements_test.cc
+++ b/src/reader/wgsl/parser_impl_statements_test.cc
@@ -23,7 +23,7 @@
 namespace {
 
 TEST_F(ParserImplTest, Statements) {
-  auto* p = parser("discard; return;");
+  auto p = parser("discard; return;");
   auto e = p->expect_statements();
   EXPECT_FALSE(e.errored);
   EXPECT_FALSE(p->has_error()) << p->error();
@@ -33,7 +33,7 @@
 }
 
 TEST_F(ParserImplTest, Statements_Empty) {
-  auto* p = parser("");
+  auto p = parser("");
   auto e = p->expect_statements();
   EXPECT_FALSE(e.errored);
   EXPECT_FALSE(p->has_error()) << p->error();
diff --git a/src/reader/wgsl/parser_impl_storage_class_test.cc b/src/reader/wgsl/parser_impl_storage_class_test.cc
index 2945512..5e0f0cc 100644
--- a/src/reader/wgsl/parser_impl_storage_class_test.cc
+++ b/src/reader/wgsl/parser_impl_storage_class_test.cc
@@ -35,7 +35,7 @@
 
 TEST_P(StorageClassTest, Parses) {
   auto params = GetParam();
-  auto* p = parser(params.input);
+  auto p = parser(params.input);
 
   auto sc = p->expect_storage_class("test");
   EXPECT_FALSE(sc.errored);
@@ -61,7 +61,7 @@
         StorageClassData{"function", ast::StorageClass::kFunction}));
 
 TEST_F(ParserImplTest, StorageClass_NoMatch) {
-  auto* p = parser("not-a-storage-class");
+  auto p = parser("not-a-storage-class");
   auto sc = p->expect_storage_class("test");
   EXPECT_EQ(sc.errored, true);
   EXPECT_TRUE(p->has_error());
diff --git a/src/reader/wgsl/parser_impl_storage_texture_type_test.cc b/src/reader/wgsl/parser_impl_storage_texture_type_test.cc
index 2f6df88..ea6744d 100644
--- a/src/reader/wgsl/parser_impl_storage_texture_type_test.cc
+++ b/src/reader/wgsl/parser_impl_storage_texture_type_test.cc
@@ -23,7 +23,7 @@
 namespace {
 
 TEST_F(ParserImplTest, StorageTextureType_Invalid) {
-  auto* p = parser("abc");
+  auto p = parser("abc");
   auto t = p->storage_texture_type();
   EXPECT_FALSE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -31,7 +31,7 @@
 }
 
 TEST_F(ParserImplTest, StorageTextureType_Readonly1d_Old) {
-  auto* p = parser("texture_ro_1d");
+  auto p = parser("texture_ro_1d");
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -41,7 +41,7 @@
 }
 
 TEST_F(ParserImplTest, StorageTextureType_Readonly1dArray_Old) {
-  auto* p = parser("texture_ro_1d_array");
+  auto p = parser("texture_ro_1d_array");
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -51,7 +51,7 @@
 }
 
 TEST_F(ParserImplTest, StorageTextureType_Readonly2d_Old) {
-  auto* p = parser("texture_ro_2d");
+  auto p = parser("texture_ro_2d");
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -61,7 +61,7 @@
 }
 
 TEST_F(ParserImplTest, StorageTextureType_Readonly2dArray_Old) {
-  auto* p = parser("texture_ro_2d_array");
+  auto p = parser("texture_ro_2d_array");
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -71,7 +71,7 @@
 }
 
 TEST_F(ParserImplTest, StorageTextureType_Readonly3d_Old) {
-  auto* p = parser("texture_ro_3d");
+  auto p = parser("texture_ro_3d");
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -81,7 +81,7 @@
 }
 
 TEST_F(ParserImplTest, StorageTextureType_Writeonly1d_Old) {
-  auto* p = parser("texture_wo_1d");
+  auto p = parser("texture_wo_1d");
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -91,7 +91,7 @@
 }
 
 TEST_F(ParserImplTest, StorageTextureType_Writeonly1dArray_Old) {
-  auto* p = parser("texture_wo_1d_array");
+  auto p = parser("texture_wo_1d_array");
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -101,7 +101,7 @@
 }
 
 TEST_F(ParserImplTest, StorageTextureType_Writeonly2d_Old) {
-  auto* p = parser("texture_wo_2d");
+  auto p = parser("texture_wo_2d");
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -111,7 +111,7 @@
 }
 
 TEST_F(ParserImplTest, StorageTextureType_Writeonly2dArray_Old) {
-  auto* p = parser("texture_wo_2d_array");
+  auto p = parser("texture_wo_2d_array");
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -121,7 +121,7 @@
 }
 
 TEST_F(ParserImplTest, StorageTextureType_Writeonly3d_Old) {
-  auto* p = parser("texture_wo_3d");
+  auto p = parser("texture_wo_3d");
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -131,7 +131,7 @@
 }
 
 TEST_F(ParserImplTest, StorageTextureType_ro_1d) {
-  auto* p = parser("texture_storage_ro_1d");
+  auto p = parser("texture_storage_ro_1d");
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -141,7 +141,7 @@
 }
 
 TEST_F(ParserImplTest, StorageTextureType_ro_1dArray) {
-  auto* p = parser("texture_storage_ro_1d_array");
+  auto p = parser("texture_storage_ro_1d_array");
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -151,7 +151,7 @@
 }
 
 TEST_F(ParserImplTest, StorageTextureType_ro_2d) {
-  auto* p = parser("texture_storage_ro_2d");
+  auto p = parser("texture_storage_ro_2d");
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -161,7 +161,7 @@
 }
 
 TEST_F(ParserImplTest, StorageTextureType_ro_2dArray) {
-  auto* p = parser("texture_storage_ro_2d_array");
+  auto p = parser("texture_storage_ro_2d_array");
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -171,7 +171,7 @@
 }
 
 TEST_F(ParserImplTest, StorageTextureType_ro_3d) {
-  auto* p = parser("texture_storage_ro_3d");
+  auto p = parser("texture_storage_ro_3d");
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -181,7 +181,7 @@
 }
 
 TEST_F(ParserImplTest, StorageTextureType_wo_1d) {
-  auto* p = parser("texture_storage_wo_1d");
+  auto p = parser("texture_storage_wo_1d");
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -191,7 +191,7 @@
 }
 
 TEST_F(ParserImplTest, StorageTextureType_wo_1dArray) {
-  auto* p = parser("texture_storage_wo_1d_array");
+  auto p = parser("texture_storage_wo_1d_array");
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -201,7 +201,7 @@
 }
 
 TEST_F(ParserImplTest, StorageTextureType_wo_2d) {
-  auto* p = parser("texture_storage_wo_2d");
+  auto p = parser("texture_storage_wo_2d");
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -211,7 +211,7 @@
 }
 
 TEST_F(ParserImplTest, StorageTextureType_wo_2dArray) {
-  auto* p = parser("texture_storage_wo_2d_array");
+  auto p = parser("texture_storage_wo_2d_array");
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -221,7 +221,7 @@
 }
 
 TEST_F(ParserImplTest, StorageTextureType_wo_3d) {
-  auto* p = parser("texture_storage_wo_3d");
+  auto p = parser("texture_storage_wo_3d");
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
diff --git a/src/reader/wgsl/parser_impl_struct_body_decl_test.cc b/src/reader/wgsl/parser_impl_struct_body_decl_test.cc
index a125074..767273b 100644
--- a/src/reader/wgsl/parser_impl_struct_body_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_struct_body_decl_test.cc
@@ -26,7 +26,7 @@
 TEST_F(ParserImplTest, StructBodyDecl_Parses) {
   auto* i32 = tm()->Get(std::make_unique<ast::type::I32Type>());
 
-  auto* p = parser("{a : i32;}");
+  auto p = parser("{a : i32;}");
   auto m = p->expect_struct_body_decl();
   ASSERT_FALSE(p->has_error());
   ASSERT_FALSE(m.errored);
@@ -39,7 +39,7 @@
 }
 
 TEST_F(ParserImplTest, StructBodyDecl_ParsesEmpty) {
-  auto* p = parser("{}");
+  auto p = parser("{}");
   auto m = p->expect_struct_body_decl();
   ASSERT_FALSE(p->has_error());
   ASSERT_FALSE(m.errored);
@@ -47,7 +47,7 @@
 }
 
 TEST_F(ParserImplTest, StructBodyDecl_InvalidMember) {
-  auto* p = parser(R"(
+  auto p = parser(R"(
 {
   [[offset(nan)]] a : i32;
 })");
@@ -59,7 +59,7 @@
 }
 
 TEST_F(ParserImplTest, StructBodyDecl_MissingClosingBracket) {
-  auto* p = parser("{a : i32;");
+  auto p = parser("{a : i32;");
   auto m = p->expect_struct_body_decl();
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(m.errored);
@@ -67,7 +67,7 @@
 }
 
 TEST_F(ParserImplTest, StructBodyDecl_InvalidToken) {
-  auto* p = parser(R"(
+  auto p = parser(R"(
 {
   a : i32;
   1.23
diff --git a/src/reader/wgsl/parser_impl_struct_decl_test.cc b/src/reader/wgsl/parser_impl_struct_decl_test.cc
index 59a91eb..87e40e5 100644
--- a/src/reader/wgsl/parser_impl_struct_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_struct_decl_test.cc
@@ -23,7 +23,7 @@
 namespace {
 
 TEST_F(ParserImplTest, StructDecl_Parses) {
-  auto* p = parser(R"(
+  auto p = parser(R"(
 struct S {
   a : i32;
   [[offset(4)]] b : f32;
@@ -45,7 +45,7 @@
 }
 
 TEST_F(ParserImplTest, StructDecl_ParsesWithDecoration) {
-  auto* p = parser(R"(
+  auto p = parser(R"(
 [[block]] struct B {
   a : f32;
   b : f32;
@@ -69,7 +69,7 @@
 }
 
 TEST_F(ParserImplTest, StructDecl_ParsesWithMultipleDecoration) {
-  auto* p = parser(R"(
+  auto p = parser(R"(
 [[block]]
 [[block]] struct S {
   a : f32;
@@ -95,7 +95,7 @@
 }
 
 TEST_F(ParserImplTest, StructDecl_EmptyMembers) {
-  auto* p = parser("struct S {}");
+  auto p = parser("struct S {}");
   auto decos = p->decoration_list();
   EXPECT_FALSE(decos.errored);
   EXPECT_FALSE(decos.matched);
@@ -110,7 +110,7 @@
 }
 
 TEST_F(ParserImplTest, StructDecl_MissingIdent) {
-  auto* p = parser("struct {}");
+  auto p = parser("struct {}");
   auto decos = p->decoration_list();
   EXPECT_FALSE(decos.errored);
   EXPECT_FALSE(decos.matched);
@@ -126,7 +126,7 @@
 }
 
 TEST_F(ParserImplTest, StructDecl_MissingBracketLeft) {
-  auto* p = parser("struct S }");
+  auto p = parser("struct S }");
   auto decos = p->decoration_list();
   EXPECT_FALSE(decos.errored);
   EXPECT_FALSE(decos.matched);
@@ -142,7 +142,7 @@
 }
 
 TEST_F(ParserImplTest, StructDecl_InvalidStructBody) {
-  auto* p = parser("struct S { a : B; }");
+  auto p = parser("struct S { a : B; }");
   auto decos = p->decoration_list();
   EXPECT_FALSE(decos.errored);
   EXPECT_FALSE(decos.matched);
@@ -158,7 +158,7 @@
 }
 
 TEST_F(ParserImplTest, StructDecl_InvalidStructDecorationDecl) {
-  auto* p = parser("[[block struct S { a : i32; }");
+  auto p = parser("[[block struct S { a : i32; }");
   auto decos = p->decoration_list();
   EXPECT_TRUE(decos.errored);
   EXPECT_FALSE(decos.matched);
@@ -173,7 +173,7 @@
 }
 
 TEST_F(ParserImplTest, StructDecl_MissingStruct) {
-  auto* p = parser("[[block]] S {}");
+  auto p = parser("[[block]] S {}");
   auto decos = p->decoration_list();
   EXPECT_FALSE(decos.errored);
   EXPECT_TRUE(decos.matched);
diff --git a/src/reader/wgsl/parser_impl_struct_decoration_decl_test.cc b/src/reader/wgsl/parser_impl_struct_decoration_decl_test.cc
index 08358f2..a7f320d 100644
--- a/src/reader/wgsl/parser_impl_struct_decoration_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_struct_decoration_decl_test.cc
@@ -22,7 +22,7 @@
 namespace {
 
 TEST_F(ParserImplTest, StructDecorationDecl_Parses) {
-  auto* p = parser("[[block]]");
+  auto p = parser("[[block]]");
   auto decos = p->decoration_list();
   EXPECT_FALSE(p->has_error());
   EXPECT_FALSE(decos.errored);
@@ -33,7 +33,7 @@
 }
 
 TEST_F(ParserImplTest, StructDecorationDecl_MissingAttrRight) {
-  auto* p = parser("[[block");
+  auto p = parser("[[block");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
@@ -43,7 +43,7 @@
 }
 
 TEST_F(ParserImplTest, StructDecorationDecl_InvalidDecoration) {
-  auto* p = parser("[[invalid]]");
+  auto p = parser("[[invalid]]");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
diff --git a/src/reader/wgsl/parser_impl_struct_decoration_test.cc b/src/reader/wgsl/parser_impl_struct_decoration_test.cc
index b18f486..9e5f09a 100644
--- a/src/reader/wgsl/parser_impl_struct_decoration_test.cc
+++ b/src/reader/wgsl/parser_impl_struct_decoration_test.cc
@@ -36,7 +36,7 @@
 
 TEST_P(StructDecorationTest, Parses) {
   auto params = GetParam();
-  auto* p = parser(params.input);
+  auto p = parser(params.input);
 
   auto deco = p->decoration();
   ASSERT_FALSE(p->has_error());
@@ -52,7 +52,7 @@
                          testing::Values(StructDecorationData{"block", true}));
 
 TEST_F(ParserImplTest, StructDecoration_NoMatch) {
-  auto* p = parser("not-a-stage");
+  auto p = parser("not-a-stage");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_FALSE(deco.errored);
diff --git a/src/reader/wgsl/parser_impl_struct_member_decoration_decl_test.cc b/src/reader/wgsl/parser_impl_struct_member_decoration_decl_test.cc
index 0ef8b44..d158cec 100644
--- a/src/reader/wgsl/parser_impl_struct_member_decoration_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_struct_member_decoration_decl_test.cc
@@ -23,7 +23,7 @@
 namespace {
 
 TEST_F(ParserImplTest, StructMemberDecorationDecl_EmptyStr) {
-  auto* p = parser("");
+  auto p = parser("");
   auto decos = p->decoration_list();
   EXPECT_FALSE(p->has_error());
   EXPECT_FALSE(decos.errored);
@@ -32,7 +32,7 @@
 }
 
 TEST_F(ParserImplTest, StructMemberDecorationDecl_EmptyBlock) {
-  auto* p = parser("[[]]");
+  auto p = parser("[[]]");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
@@ -42,7 +42,7 @@
 }
 
 TEST_F(ParserImplTest, StructMemberDecorationDecl_Single) {
-  auto* p = parser("[[offset(4)]]");
+  auto p = parser("[[offset(4)]]");
   auto decos = p->decoration_list();
   EXPECT_FALSE(p->has_error());
   EXPECT_FALSE(decos.errored);
@@ -54,7 +54,7 @@
 }
 
 TEST_F(ParserImplTest, StructMemberDecorationDecl_InvalidDecoration) {
-  auto* p = parser("[[offset(nan)]]");
+  auto p = parser("[[offset(nan)]]");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error()) << p->error();
   EXPECT_TRUE(decos.errored);
@@ -64,7 +64,7 @@
 }
 
 TEST_F(ParserImplTest, StructMemberDecorationDecl_MissingClose) {
-  auto* p = parser("[[offset(4)");
+  auto p = parser("[[offset(4)");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error()) << p->error();
   EXPECT_TRUE(decos.errored);
diff --git a/src/reader/wgsl/parser_impl_struct_member_decoration_test.cc b/src/reader/wgsl/parser_impl_struct_member_decoration_test.cc
index 963d32a..76da67a 100644
--- a/src/reader/wgsl/parser_impl_struct_member_decoration_test.cc
+++ b/src/reader/wgsl/parser_impl_struct_member_decoration_test.cc
@@ -23,7 +23,7 @@
 namespace {
 
 TEST_F(ParserImplTest, StructMemberDecoration_Offset) {
-  auto* p = parser("offset(4)");
+  auto p = parser("offset(4)");
   auto deco = p->decoration();
   EXPECT_TRUE(deco.matched);
   EXPECT_FALSE(deco.errored);
@@ -39,7 +39,7 @@
 }
 
 TEST_F(ParserImplTest, StructMemberDecoration_Offset_MissingLeftParen) {
-  auto* p = parser("offset 4)");
+  auto p = parser("offset 4)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -49,7 +49,7 @@
 }
 
 TEST_F(ParserImplTest, StructMemberDecoration_Offset_MissingRightParen) {
-  auto* p = parser("offset(4");
+  auto p = parser("offset(4");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -59,7 +59,7 @@
 }
 
 TEST_F(ParserImplTest, StructMemberDecoration_Offset_MissingValue) {
-  auto* p = parser("offset()");
+  auto p = parser("offset()");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -70,7 +70,7 @@
 }
 
 TEST_F(ParserImplTest, StructMemberDecoration_Offset_MissingInvalid) {
-  auto* p = parser("offset(nan)");
+  auto p = parser("offset(nan)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
diff --git a/src/reader/wgsl/parser_impl_struct_member_test.cc b/src/reader/wgsl/parser_impl_struct_member_test.cc
index 2ae818a..867f53c 100644
--- a/src/reader/wgsl/parser_impl_struct_member_test.cc
+++ b/src/reader/wgsl/parser_impl_struct_member_test.cc
@@ -27,7 +27,7 @@
 TEST_F(ParserImplTest, StructMember_Parses) {
   auto* i32 = tm()->Get(std::make_unique<ast::type::I32Type>());
 
-  auto* p = parser("a : i32;");
+  auto p = parser("a : i32;");
   auto decos = p->decoration_list();
   EXPECT_FALSE(decos.errored);
   EXPECT_FALSE(decos.matched);
@@ -51,7 +51,7 @@
 TEST_F(ParserImplTest, StructMember_ParsesWithDecoration) {
   auto* i32 = tm()->Get(std::make_unique<ast::type::I32Type>());
 
-  auto* p = parser("[[offset(2)]] a : i32;");
+  auto p = parser("[[offset(2)]] a : i32;");
   auto decos = p->decoration_list();
   EXPECT_FALSE(decos.errored);
   EXPECT_TRUE(decos.matched);
@@ -77,7 +77,7 @@
 TEST_F(ParserImplTest, StructMember_ParsesWithMultipleDecorations) {
   auto* i32 = tm()->Get(std::make_unique<ast::type::I32Type>());
 
-  auto* p = parser(R"([[offset(2)]]
+  auto p = parser(R"([[offset(2)]]
 [[offset(4)]] a : i32;)");
   auto decos = p->decoration_list();
   EXPECT_FALSE(decos.errored);
@@ -104,7 +104,7 @@
 }
 
 TEST_F(ParserImplTest, StructMember_InvalidDecoration) {
-  auto* p = parser("[[offset(nan)]] a : i32;");
+  auto p = parser("[[offset(nan)]] a : i32;");
   auto decos = p->decoration_list();
   EXPECT_TRUE(decos.errored);
   EXPECT_FALSE(decos.matched);
@@ -119,7 +119,7 @@
 }
 
 TEST_F(ParserImplTest, StructMember_InvalidVariable) {
-  auto* p = parser("[[offset(4)]] a : B;");
+  auto p = parser("[[offset(4)]] a : B;");
   auto decos = p->decoration_list();
   EXPECT_FALSE(decos.errored);
   EXPECT_TRUE(decos.matched);
@@ -132,7 +132,7 @@
 }
 
 TEST_F(ParserImplTest, StructMember_MissingSemicolon) {
-  auto* p = parser("a : i32");
+  auto p = parser("a : i32");
   auto decos = p->decoration_list();
   EXPECT_FALSE(decos.errored);
   EXPECT_FALSE(decos.matched);
diff --git a/src/reader/wgsl/parser_impl_switch_body_test.cc b/src/reader/wgsl/parser_impl_switch_body_test.cc
index ae2f1b7..74ac8a3 100644
--- a/src/reader/wgsl/parser_impl_switch_body_test.cc
+++ b/src/reader/wgsl/parser_impl_switch_body_test.cc
@@ -23,7 +23,7 @@
 namespace {
 
 TEST_F(ParserImplTest, SwitchBody_Case) {
-  auto* p = parser("case 1: { a = 4; }");
+  auto p = parser("case 1: { a = 4; }");
   auto e = p->switch_body();
   EXPECT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(e.matched);
@@ -36,7 +36,7 @@
 }
 
 TEST_F(ParserImplTest, SwitchBody_Case_InvalidConstLiteral) {
-  auto* p = parser("case a == 4: { a = 4; }");
+  auto p = parser("case a == 4: { a = 4; }");
   auto e = p->switch_body();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -46,7 +46,7 @@
 }
 
 TEST_F(ParserImplTest, SwitchBody_Case_InvalidSelector_bool) {
-  auto* p = parser("case true: { a = 4; }");
+  auto p = parser("case true: { a = 4; }");
   auto e = p->switch_body();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -56,7 +56,7 @@
 }
 
 TEST_F(ParserImplTest, SwitchBody_Case_MissingConstLiteral) {
-  auto* p = parser("case: { a = 4; }");
+  auto p = parser("case: { a = 4; }");
   auto e = p->switch_body();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -66,7 +66,7 @@
 }
 
 TEST_F(ParserImplTest, SwitchBody_Case_MissingColon) {
-  auto* p = parser("case 1 { a = 4; }");
+  auto p = parser("case 1 { a = 4; }");
   auto e = p->switch_body();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -76,7 +76,7 @@
 }
 
 TEST_F(ParserImplTest, SwitchBody_Case_MissingBracketLeft) {
-  auto* p = parser("case 1: a = 4; }");
+  auto p = parser("case 1: a = 4; }");
   auto e = p->switch_body();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -86,7 +86,7 @@
 }
 
 TEST_F(ParserImplTest, SwitchBody_Case_MissingBracketRight) {
-  auto* p = parser("case 1: { a = 4; ");
+  auto p = parser("case 1: { a = 4; ");
   auto e = p->switch_body();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -96,7 +96,7 @@
 }
 
 TEST_F(ParserImplTest, SwitchBody_Case_InvalidCaseBody) {
-  auto* p = parser("case 1: { fn main() -> void {} }");
+  auto p = parser("case 1: { fn main() -> void {} }");
   auto e = p->switch_body();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -106,7 +106,7 @@
 }
 
 TEST_F(ParserImplTest, SwitchBody_Default) {
-  auto* p = parser("default: { a = 4; }");
+  auto p = parser("default: { a = 4; }");
   auto e = p->switch_body();
   EXPECT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(e.matched);
@@ -119,7 +119,7 @@
 }
 
 TEST_F(ParserImplTest, SwitchBody_Default_MissingColon) {
-  auto* p = parser("default { a = 4; }");
+  auto p = parser("default { a = 4; }");
   auto e = p->switch_body();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -129,7 +129,7 @@
 }
 
 TEST_F(ParserImplTest, SwitchBody_Default_MissingBracketLeft) {
-  auto* p = parser("default: a = 4; }");
+  auto p = parser("default: a = 4; }");
   auto e = p->switch_body();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -139,7 +139,7 @@
 }
 
 TEST_F(ParserImplTest, SwitchBody_Default_MissingBracketRight) {
-  auto* p = parser("default: { a = 4; ");
+  auto p = parser("default: { a = 4; ");
   auto e = p->switch_body();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
@@ -149,7 +149,7 @@
 }
 
 TEST_F(ParserImplTest, SwitchBody_Default_InvalidCaseBody) {
-  auto* p = parser("default: { fn main() -> void {} }");
+  auto p = parser("default: { fn main() -> void {} }");
   auto e = p->switch_body();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_switch_stmt_test.cc b/src/reader/wgsl/parser_impl_switch_stmt_test.cc
index 85a5a97..b4d3394 100644
--- a/src/reader/wgsl/parser_impl_switch_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_switch_stmt_test.cc
@@ -24,7 +24,7 @@
 namespace {
 
 TEST_F(ParserImplTest, SwitchStmt_WithoutDefault) {
-  auto* p = parser(R"(switch(a) {
+  auto p = parser(R"(switch(a) {
   case 1: {}
   case 2: {}
 })");
@@ -40,7 +40,7 @@
 }
 
 TEST_F(ParserImplTest, SwitchStmt_Empty) {
-  auto* p = parser("switch(a) { }");
+  auto p = parser("switch(a) { }");
   auto e = p->switch_stmt();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -51,7 +51,7 @@
 }
 
 TEST_F(ParserImplTest, SwitchStmt_DefaultInMiddle) {
-  auto* p = parser(R"(switch(a) {
+  auto p = parser(R"(switch(a) {
   case 1: {}
   default: {}
   case 2: {}
@@ -70,7 +70,7 @@
 }
 
 TEST_F(ParserImplTest, SwitchStmt_InvalidExpression) {
-  auto* p = parser("switch(a=b) {}");
+  auto p = parser("switch(a=b) {}");
   auto e = p->switch_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -80,7 +80,7 @@
 }
 
 TEST_F(ParserImplTest, SwitchStmt_MissingExpression) {
-  auto* p = parser("switch {}");
+  auto p = parser("switch {}");
   auto e = p->switch_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -90,7 +90,7 @@
 }
 
 TEST_F(ParserImplTest, SwitchStmt_MissingBracketLeft) {
-  auto* p = parser("switch(a) }");
+  auto p = parser("switch(a) }");
   auto e = p->switch_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -100,7 +100,7 @@
 }
 
 TEST_F(ParserImplTest, SwitchStmt_MissingBracketRight) {
-  auto* p = parser("switch(a) {");
+  auto p = parser("switch(a) {");
   auto e = p->switch_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -110,7 +110,7 @@
 }
 
 TEST_F(ParserImplTest, SwitchStmt_InvalidBody) {
-  auto* p = parser(R"(switch(a) {
+  auto p = parser(R"(switch(a) {
   case: {}
 })");
   auto e = p->switch_stmt();
diff --git a/src/reader/wgsl/parser_impl_test.cc b/src/reader/wgsl/parser_impl_test.cc
index 096a1d0..829b203 100644
--- a/src/reader/wgsl/parser_impl_test.cc
+++ b/src/reader/wgsl/parser_impl_test.cc
@@ -24,12 +24,12 @@
 namespace {
 
 TEST_F(ParserImplTest, Empty) {
-  auto* p = parser("");
+  auto p = parser("");
   ASSERT_TRUE(p->Parse()) << p->error();
 }
 
 TEST_F(ParserImplTest, Parses) {
-  auto* p = parser(R"(
+  auto p = parser(R"(
 [[location(0)]] var<out> gl_FragColor : vec4<f32>;
 
 [[stage(vertex)]]
@@ -45,7 +45,7 @@
 }
 
 TEST_F(ParserImplTest, HandlesError) {
-  auto* p = parser(R"(
+  auto p = parser(R"(
 fn main() ->  {  # missing return type
   return;
 })");
@@ -56,7 +56,7 @@
 }
 
 TEST_F(ParserImplTest, GetRegisteredType) {
-  auto* p = parser("");
+  auto p = parser("");
   ast::type::I32Type i32;
   p->register_constructed("my_alias", &i32);
 
@@ -66,7 +66,7 @@
 }
 
 TEST_F(ParserImplTest, GetUnregisteredType) {
-  auto* p = parser("");
+  auto p = parser("");
   auto* alias = p->get_constructed("my_alias");
   ASSERT_EQ(alias, nullptr);
 }
diff --git a/src/reader/wgsl/parser_impl_test_helper.cc b/src/reader/wgsl/parser_impl_test_helper.cc
index 4621823..acc67ae 100644
--- a/src/reader/wgsl/parser_impl_test_helper.cc
+++ b/src/reader/wgsl/parser_impl_test_helper.cc
@@ -21,15 +21,6 @@
 
 ParserImplTest::~ParserImplTest() = default;
 
-void ParserImplTest::SetUp() {
-  ctx_.Reset();
-}
-
-void ParserImplTest::TearDown() {
-  impl_ = nullptr;
-  files_.clear();
-}
-
 }  // namespace wgsl
 }  // namespace reader
 }  // namespace tint
diff --git a/src/reader/wgsl/parser_impl_test_helper.h b/src/reader/wgsl/parser_impl_test_helper.h
index d8d5652..d77a909 100644
--- a/src/reader/wgsl/parser_impl_test_helper.h
+++ b/src/reader/wgsl/parser_impl_test_helper.h
@@ -35,20 +35,14 @@
   ParserImplTest();
   ~ParserImplTest() override;
 
-  /// Sets up the test helper
-  void SetUp() override;
-
-  /// Tears down the test helper
-  void TearDown() override;
-
   /// Retrieves the parser from the helper
   /// @param str the string to parse
   /// @returns the parser implementation
-  ParserImpl* parser(const std::string& str) {
+  std::unique_ptr<ParserImpl> parser(const std::string& str) {
     auto file = std::make_unique<Source::File>("test.wgsl", str);
-    impl_ = std::make_unique<ParserImpl>(&ctx_, file.get());
+    auto impl = std::make_unique<ParserImpl>(&ctx_, file.get());
     files_.emplace_back(std::move(file));
-    return impl_.get();
+    return impl;
   }
 
   /// @returns the type manager
@@ -56,7 +50,6 @@
 
  private:
   std::vector<std::unique_ptr<Source::File>> files_;
-  std::unique_ptr<ParserImpl> impl_;
   Context ctx_;
 };
 
@@ -68,23 +61,14 @@
   ParserImplTestWithParam() = default;
   ~ParserImplTestWithParam() override = default;
 
-  /// Sets up the test helper
-  void SetUp() override { ctx_.Reset(); }
-
-  /// Tears down the test helper
-  void TearDown() override {
-    impl_ = nullptr;
-    files_.clear();
-  }
-
   /// Retrieves the parser from the helper
   /// @param str the string to parse
   /// @returns the parser implementation
-  ParserImpl* parser(const std::string& str) {
+  std::unique_ptr<ParserImpl> parser(const std::string& str) {
     auto file = std::make_unique<Source::File>("test.wgsl", str);
-    impl_ = std::make_unique<ParserImpl>(&ctx_, file.get());
+    auto impl = std::make_unique<ParserImpl>(&ctx_, file.get());
     files_.emplace_back(std::move(file));
-    return impl_.get();
+    return impl;
   }
 
   /// @returns the type manager
@@ -92,7 +76,7 @@
 
  private:
   std::vector<std::unique_ptr<Source::File>> files_;
-  std::unique_ptr<ParserImpl> impl_;
+  std::unique_ptr<ParserImpl> impl;
   Context ctx_;
 };
 
diff --git a/src/reader/wgsl/parser_impl_texture_sampler_types_test.cc b/src/reader/wgsl/parser_impl_texture_sampler_types_test.cc
index bfc4474..f4d354a 100644
--- a/src/reader/wgsl/parser_impl_texture_sampler_types_test.cc
+++ b/src/reader/wgsl/parser_impl_texture_sampler_types_test.cc
@@ -25,7 +25,7 @@
 namespace {
 
 TEST_F(ParserImplTest, TextureSamplerTypes_Invalid) {
-  auto* p = parser("1234");
+  auto p = parser("1234");
   auto t = p->texture_sampler_types();
   EXPECT_EQ(t.value, nullptr);
   EXPECT_FALSE(t.matched);
@@ -34,7 +34,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_Sampler) {
-  auto* p = parser("sampler");
+  auto p = parser("sampler");
   auto t = p->texture_sampler_types();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(t.matched);
@@ -45,7 +45,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_SamplerComparison) {
-  auto* p = parser("sampler_comparison");
+  auto p = parser("sampler_comparison");
   auto t = p->texture_sampler_types();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(t.matched);
@@ -56,7 +56,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_DepthTexture) {
-  auto* p = parser("texture_depth_2d");
+  auto p = parser("texture_depth_2d");
   auto t = p->texture_sampler_types();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(t.matched);
@@ -68,7 +68,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_SampledTexture_F32_Old) {
-  auto* p = parser("texture_sampled_1d<f32>");
+  auto p = parser("texture_sampled_1d<f32>");
   auto t = p->texture_sampler_types();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(t.matched);
@@ -81,7 +81,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_SampledTexture_I32_Old) {
-  auto* p = parser("texture_sampled_2d<i32>");
+  auto p = parser("texture_sampled_2d<i32>");
   auto t = p->texture_sampler_types();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(t.matched);
@@ -94,7 +94,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_SampledTexture_U32_Old) {
-  auto* p = parser("texture_sampled_3d<u32>");
+  auto p = parser("texture_sampled_3d<u32>");
   auto t = p->texture_sampler_types();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(t.matched);
@@ -107,7 +107,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_SampledTexture_Invalid_Old) {
-  auto* p = parser("texture_sampled_1d<abc>");
+  auto p = parser("texture_sampled_1d<abc>");
   auto t = p->texture_sampler_types();
   ASSERT_TRUE(p->has_error());
   EXPECT_EQ(t.value, nullptr);
@@ -117,7 +117,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_SampledTexture_MissingType_Old) {
-  auto* p = parser("texture_sampled_1d<>");
+  auto p = parser("texture_sampled_1d<>");
   auto t = p->texture_sampler_types();
   ASSERT_TRUE(p->has_error());
   EXPECT_EQ(t.value, nullptr);
@@ -127,7 +127,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_SampledTexture_MissingLessThan_Old) {
-  auto* p = parser("texture_sampled_1d");
+  auto p = parser("texture_sampled_1d");
   auto t = p->texture_sampler_types();
   ASSERT_TRUE(p->has_error());
   EXPECT_EQ(t.value, nullptr);
@@ -138,7 +138,7 @@
 
 TEST_F(ParserImplTest,
        TextureSamplerTypes_SampledTexture_MissingGreaterThan_Old) {
-  auto* p = parser("texture_sampled_1d<u32");
+  auto p = parser("texture_sampled_1d<u32");
   auto t = p->texture_sampler_types();
   ASSERT_TRUE(p->has_error());
   EXPECT_EQ(t.value, nullptr);
@@ -148,7 +148,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_SampledTexture_F32) {
-  auto* p = parser("texture_1d<f32>");
+  auto p = parser("texture_1d<f32>");
   auto t = p->texture_sampler_types();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(t.matched);
@@ -161,7 +161,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_SampledTexture_I32) {
-  auto* p = parser("texture_2d<i32>");
+  auto p = parser("texture_2d<i32>");
   auto t = p->texture_sampler_types();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(t.matched);
@@ -174,7 +174,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_SampledTexture_U32) {
-  auto* p = parser("texture_3d<u32>");
+  auto p = parser("texture_3d<u32>");
   auto t = p->texture_sampler_types();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(t.matched);
@@ -187,7 +187,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_SampledTexture_Invalid) {
-  auto* p = parser("texture_1d<abc>");
+  auto p = parser("texture_1d<abc>");
   auto t = p->texture_sampler_types();
   ASSERT_TRUE(p->has_error());
   EXPECT_EQ(t.value, nullptr);
@@ -197,7 +197,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_SampledTexture_MissingType) {
-  auto* p = parser("texture_1d<>");
+  auto p = parser("texture_1d<>");
   auto t = p->texture_sampler_types();
   ASSERT_TRUE(p->has_error());
   EXPECT_EQ(t.value, nullptr);
@@ -207,7 +207,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_SampledTexture_MissingLessThan) {
-  auto* p = parser("texture_1d");
+  auto p = parser("texture_1d");
   auto t = p->texture_sampler_types();
   ASSERT_TRUE(p->has_error());
   EXPECT_EQ(t.value, nullptr);
@@ -217,7 +217,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_SampledTexture_MissingGreaterThan) {
-  auto* p = parser("texture_1d<u32");
+  auto p = parser("texture_1d<u32");
   auto t = p->texture_sampler_types();
   ASSERT_TRUE(p->has_error());
   EXPECT_EQ(t.value, nullptr);
@@ -227,7 +227,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_MultisampledTexture_I32) {
-  auto* p = parser("texture_multisampled_2d<i32>");
+  auto p = parser("texture_multisampled_2d<i32>");
   auto t = p->texture_sampler_types();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(t.matched);
@@ -240,7 +240,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_MultisampledTexture_Invalid) {
-  auto* p = parser("texture_multisampled_2d<abc>");
+  auto p = parser("texture_multisampled_2d<abc>");
   auto t = p->texture_sampler_types();
   ASSERT_TRUE(p->has_error());
   EXPECT_EQ(t.value, nullptr);
@@ -250,7 +250,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_MultisampledTexture_MissingType) {
-  auto* p = parser("texture_multisampled_2d<>");
+  auto p = parser("texture_multisampled_2d<>");
   auto t = p->texture_sampler_types();
   ASSERT_TRUE(p->has_error());
   EXPECT_EQ(t.value, nullptr);
@@ -261,7 +261,7 @@
 
 TEST_F(ParserImplTest,
        TextureSamplerTypes_MultisampledTexture_MissingLessThan) {
-  auto* p = parser("texture_multisampled_2d");
+  auto p = parser("texture_multisampled_2d");
   auto t = p->texture_sampler_types();
   EXPECT_EQ(t.value, nullptr);
   EXPECT_FALSE(t.matched);
@@ -271,7 +271,7 @@
 
 TEST_F(ParserImplTest,
        TextureSamplerTypes_MultisampledTexture_MissingGreaterThan) {
-  auto* p = parser("texture_multisampled_2d<u32");
+  auto p = parser("texture_multisampled_2d<u32");
   auto t = p->texture_sampler_types();
   EXPECT_EQ(t.value, nullptr);
   EXPECT_FALSE(t.matched);
@@ -281,7 +281,7 @@
 
 TEST_F(ParserImplTest,
        TextureSamplerTypes_StorageTexture_Readonly1dR8Unorm_Old) {
-  auto* p = parser("texture_ro_1d<r8unorm>");
+  auto p = parser("texture_ro_1d<r8unorm>");
   auto t = p->texture_sampler_types();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(t.matched);
@@ -298,7 +298,7 @@
 
 TEST_F(ParserImplTest,
        TextureSamplerTypes_StorageTexture_Writeonly2dR16Float_Old) {
-  auto* p = parser("texture_wo_2d<r16float>");
+  auto p = parser("texture_wo_2d<r16float>");
   auto t = p->texture_sampler_types();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(t.matched);
@@ -314,7 +314,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_StorageTexture_InvalidType_Old) {
-  auto* p = parser("texture_ro_1d<abc>");
+  auto p = parser("texture_ro_1d<abc>");
   auto t = p->texture_sampler_types();
   EXPECT_EQ(t.value, nullptr);
   EXPECT_FALSE(t.matched);
@@ -323,7 +323,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_StorageTexture_MissingType_Old) {
-  auto* p = parser("texture_wo_1d<>");
+  auto p = parser("texture_wo_1d<>");
   auto t = p->texture_sampler_types();
   EXPECT_EQ(t.value, nullptr);
   EXPECT_FALSE(t.matched);
@@ -332,7 +332,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_StorageTexture_MissingLessThan_Old) {
-  auto* p = parser("texture_ro_1d");
+  auto p = parser("texture_ro_1d");
   auto t = p->texture_sampler_types();
   EXPECT_EQ(t.value, nullptr);
   EXPECT_FALSE(t.matched);
@@ -342,7 +342,7 @@
 
 TEST_F(ParserImplTest,
        TextureSamplerTypes_StorageTexture_MissingGreaterThan_Old) {
-  auto* p = parser("texture_wo_1d<r8unorm");
+  auto p = parser("texture_wo_1d<r8unorm");
   auto t = p->texture_sampler_types();
   EXPECT_EQ(t.value, nullptr);
   EXPECT_FALSE(t.matched);
@@ -351,7 +351,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_StorageTexture_Readonly1dR8Unorm) {
-  auto* p = parser("texture_storage_ro_1d<r8unorm>");
+  auto p = parser("texture_storage_ro_1d<r8unorm>");
   auto t = p->texture_sampler_types();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(t.matched);
@@ -367,7 +367,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_StorageTexture_Writeonly2dR16Float) {
-  auto* p = parser("texture_storage_wo_2d<r16float>");
+  auto p = parser("texture_storage_wo_2d<r16float>");
   auto t = p->texture_sampler_types();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(t.matched);
@@ -383,7 +383,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_StorageTexture_InvalidType) {
-  auto* p = parser("texture_storage_ro_1d<abc>");
+  auto p = parser("texture_storage_ro_1d<abc>");
   auto t = p->texture_sampler_types();
   EXPECT_EQ(t.value, nullptr);
   EXPECT_FALSE(t.matched);
@@ -392,7 +392,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_StorageTexture_MissingType) {
-  auto* p = parser("texture_storage_ro_1d<>");
+  auto p = parser("texture_storage_ro_1d<>");
   auto t = p->texture_sampler_types();
   EXPECT_EQ(t.value, nullptr);
   EXPECT_FALSE(t.matched);
@@ -401,7 +401,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_StorageTexture_MissingLessThan) {
-  auto* p = parser("texture_storage_ro_1d");
+  auto p = parser("texture_storage_ro_1d");
   auto t = p->texture_sampler_types();
   EXPECT_EQ(t.value, nullptr);
   EXPECT_FALSE(t.matched);
@@ -410,7 +410,7 @@
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_StorageTexture_MissingGreaterThan) {
-  auto* p = parser("texture_storage_ro_1d<r8unorm");
+  auto p = parser("texture_storage_ro_1d<r8unorm");
   auto t = p->texture_sampler_types();
   EXPECT_EQ(t.value, nullptr);
   EXPECT_FALSE(t.matched);
diff --git a/src/reader/wgsl/parser_impl_type_alias_test.cc b/src/reader/wgsl/parser_impl_type_alias_test.cc
index cbfb7a1..02360d6 100644
--- a/src/reader/wgsl/parser_impl_type_alias_test.cc
+++ b/src/reader/wgsl/parser_impl_type_alias_test.cc
@@ -29,7 +29,7 @@
 TEST_F(ParserImplTest, TypeDecl_ParsesType) {
   auto* i32 = tm()->Get(std::make_unique<ast::type::I32Type>());
 
-  auto* p = parser("type a = i32");
+  auto p = parser("type a = i32");
   auto t = p->type_alias();
   EXPECT_FALSE(p->has_error());
   EXPECT_FALSE(t.errored);
@@ -44,7 +44,7 @@
 TEST_F(ParserImplTest, TypeDecl_ParsesStruct_Ident) {
   ast::type::StructType str("B", {});
 
-  auto* p = parser("type a = B");
+  auto p = parser("type a = B");
   p->register_constructed("B", &str);
 
   auto t = p->type_alias();
@@ -62,7 +62,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_MissingIdent) {
-  auto* p = parser("type = i32");
+  auto p = parser("type = i32");
   auto t = p->type_alias();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -72,7 +72,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_InvalidIdent) {
-  auto* p = parser("type 123 = i32");
+  auto p = parser("type 123 = i32");
   auto t = p->type_alias();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -82,7 +82,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_MissingEqual) {
-  auto* p = parser("type a i32");
+  auto p = parser("type a i32");
   auto t = p->type_alias();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -92,7 +92,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_InvalidType) {
-  auto* p = parser("type a = B");
+  auto p = parser("type a = B");
   auto t = p->type_alias();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
diff --git a/src/reader/wgsl/parser_impl_type_decl_test.cc b/src/reader/wgsl/parser_impl_type_decl_test.cc
index 587b09d..ffec52d 100644
--- a/src/reader/wgsl/parser_impl_type_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_type_decl_test.cc
@@ -36,7 +36,7 @@
 namespace {
 
 TEST_F(ParserImplTest, TypeDecl_Invalid) {
-  auto* p = parser("1234");
+  auto p = parser("1234");
   auto t = p->type_decl();
   EXPECT_EQ(t.errored, false);
   EXPECT_EQ(t.matched, false);
@@ -45,7 +45,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Identifier) {
-  auto* p = parser("A");
+  auto p = parser("A");
 
   auto* int_type = tm()->Get(std::make_unique<ast::type::I32Type>());
   // Pre-register to make sure that it's the same type.
@@ -67,7 +67,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Identifier_NotFound) {
-  auto* p = parser("B");
+  auto p = parser("B");
 
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
@@ -78,7 +78,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Bool) {
-  auto* p = parser("bool");
+  auto p = parser("bool");
 
   auto* bool_type = tm()->Get(std::make_unique<ast::type::BoolType>());
 
@@ -91,7 +91,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_F32) {
-  auto* p = parser("f32");
+  auto p = parser("f32");
 
   auto* float_type = tm()->Get(std::make_unique<ast::type::F32Type>());
 
@@ -104,7 +104,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_I32) {
-  auto* p = parser("i32");
+  auto p = parser("i32");
 
   auto* int_type = tm()->Get(std::make_unique<ast::type::I32Type>());
 
@@ -117,7 +117,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_U32) {
-  auto* p = parser("u32");
+  auto p = parser("u32");
 
   auto* uint_type = tm()->Get(std::make_unique<ast::type::U32Type>());
 
@@ -142,7 +142,7 @@
 
 TEST_P(VecTest, Parse) {
   auto params = GetParam();
-  auto* p = parser(params.input);
+  auto p = parser(params.input);
   auto t = p->type_decl();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -161,7 +161,7 @@
 
 TEST_P(VecMissingGreaterThanTest, Handles_Missing_GreaterThan) {
   auto params = GetParam();
-  auto* p = parser(params.input);
+  auto p = parser(params.input);
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -179,7 +179,7 @@
 
 TEST_P(VecMissingLessThanTest, Handles_Missing_GreaterThan) {
   auto params = GetParam();
-  auto* p = parser(params.input);
+  auto p = parser(params.input);
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -197,7 +197,7 @@
 
 TEST_P(VecBadType, Handles_Unknown_Type) {
   auto params = GetParam();
-  auto* p = parser(params.input);
+  auto p = parser(params.input);
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -215,7 +215,7 @@
 
 TEST_P(VecMissingType, Handles_Missing_Type) {
   auto params = GetParam();
-  auto* p = parser(params.input);
+  auto p = parser(params.input);
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -230,7 +230,7 @@
                                          VecData{"vec4<>", 4}));
 
 TEST_F(ParserImplTest, TypeDecl_Ptr) {
-  auto* p = parser("ptr<function, f32>");
+  auto p = parser("ptr<function, f32>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -244,7 +244,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Ptr_ToVec) {
-  auto* p = parser("ptr<function, vec2<f32>>");
+  auto p = parser("ptr<function, vec2<f32>>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -262,7 +262,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Ptr_MissingLessThan) {
-  auto* p = parser("ptr private, f32>");
+  auto p = parser("ptr private, f32>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -272,7 +272,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Ptr_MissingGreaterThan) {
-  auto* p = parser("ptr<function, f32");
+  auto p = parser("ptr<function, f32");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -282,7 +282,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Ptr_MissingComma) {
-  auto* p = parser("ptr<function f32>");
+  auto p = parser("ptr<function f32>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -292,7 +292,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Ptr_MissingStorageClass) {
-  auto* p = parser("ptr<, f32>");
+  auto p = parser("ptr<, f32>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -302,7 +302,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Ptr_MissingParams) {
-  auto* p = parser("ptr<>");
+  auto p = parser("ptr<>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -312,7 +312,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Ptr_MissingType) {
-  auto* p = parser("ptr<function,>");
+  auto p = parser("ptr<function,>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -322,7 +322,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Ptr_BadStorageClass) {
-  auto* p = parser("ptr<unknown, f32>");
+  auto p = parser("ptr<unknown, f32>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -332,7 +332,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Ptr_BadType) {
-  auto* p = parser("ptr<function, unknown>");
+  auto p = parser("ptr<function, unknown>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -342,7 +342,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array) {
-  auto* p = parser("array<f32, 5>");
+  auto p = parser("array<f32, 5>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -358,7 +358,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_Stride) {
-  auto* p = parser("[[stride(16)]] array<f32, 5>");
+  auto p = parser("[[stride(16)]] array<f32, 5>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -375,7 +375,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_Runtime_Stride) {
-  auto* p = parser("[[stride(16)]] array<f32>");
+  auto p = parser("[[stride(16)]] array<f32>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -391,7 +391,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_MultipleDecorations_OneBlock) {
-  auto* p = parser("[[stride(16), stride(32)]] array<f32>");
+  auto p = parser("[[stride(16), stride(32)]] array<f32>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -412,7 +412,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_MultipleDecorations_MultipleBlocks) {
-  auto* p = parser("[[stride(16)]] [[stride(32)]] array<f32>");
+  auto p = parser("[[stride(16)]] [[stride(32)]] array<f32>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -433,7 +433,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_Decoration_MissingArray) {
-  auto* p = parser("[[stride(16)]] f32");
+  auto p = parser("[[stride(16)]] f32");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -443,7 +443,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_Decoration_MissingClosingAttr) {
-  auto* p = parser("[[stride(16) array<f32, 5>");
+  auto p = parser("[[stride(16) array<f32, 5>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -453,7 +453,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_Decoration_UnknownDecoration) {
-  auto* p = parser("[[unknown 16]] array<f32, 5>");
+  auto p = parser("[[unknown 16]] array<f32, 5>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -463,7 +463,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_Stride_MissingLeftParen) {
-  auto* p = parser("[[stride 4)]] array<f32, 5>");
+  auto p = parser("[[stride 4)]] array<f32, 5>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -473,7 +473,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_Stride_MissingRightParen) {
-  auto* p = parser("[[stride(4]] array<f32, 5>");
+  auto p = parser("[[stride(4]] array<f32, 5>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -483,7 +483,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_Stride_MissingValue) {
-  auto* p = parser("[[stride()]] array<f32, 5>");
+  auto p = parser("[[stride()]] array<f32, 5>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -494,7 +494,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_Stride_InvalidValue) {
-  auto* p = parser("[[stride(invalid)]] array<f32, 5>");
+  auto p = parser("[[stride(invalid)]] array<f32, 5>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -505,7 +505,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_Stride_InvalidValue_Negative) {
-  auto* p = parser("[[stride(-1)]] array<f32, 5>");
+  auto p = parser("[[stride(-1)]] array<f32, 5>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -515,7 +515,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_Runtime) {
-  auto* p = parser("array<u32>");
+  auto p = parser("array<u32>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -529,7 +529,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_BadType) {
-  auto* p = parser("array<unknown, 3>");
+  auto p = parser("array<unknown, 3>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -539,7 +539,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_ZeroSize) {
-  auto* p = parser("array<f32, 0>");
+  auto p = parser("array<f32, 0>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -549,7 +549,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_NegativeSize) {
-  auto* p = parser("array<f32, -1>");
+  auto p = parser("array<f32, -1>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -559,7 +559,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_BadSize) {
-  auto* p = parser("array<f32, invalid>");
+  auto p = parser("array<f32, invalid>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -569,7 +569,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_MissingLessThan) {
-  auto* p = parser("array f32>");
+  auto p = parser("array f32>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -579,7 +579,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_MissingGreaterThan) {
-  auto* p = parser("array<f32");
+  auto p = parser("array<f32");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -589,7 +589,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_MissingComma) {
-  auto* p = parser("array<f32 3>");
+  auto p = parser("array<f32 3>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -612,7 +612,7 @@
 
 TEST_P(MatrixTest, Parse) {
   auto params = GetParam();
-  auto* p = parser(params.input);
+  auto p = parser(params.input);
   auto t = p->type_decl();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -640,7 +640,7 @@
 
 TEST_P(MatrixMissingGreaterThanTest, Handles_Missing_GreaterThan) {
   auto params = GetParam();
-  auto* p = parser(params.input);
+  auto p = parser(params.input);
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -664,7 +664,7 @@
 
 TEST_P(MatrixMissingLessThanTest, Handles_Missing_GreaterThan) {
   auto params = GetParam();
-  auto* p = parser(params.input);
+  auto p = parser(params.input);
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -688,7 +688,7 @@
 
 TEST_P(MatrixBadType, Handles_Unknown_Type) {
   auto params = GetParam();
-  auto* p = parser(params.input);
+  auto p = parser(params.input);
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -712,7 +712,7 @@
 
 TEST_P(MatrixMissingType, Handles_Missing_Type) {
   auto params = GetParam();
-  auto* p = parser(params.input);
+  auto p = parser(params.input);
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
@@ -733,7 +733,7 @@
                                          MatrixData{"mat4x4<>", 4, 4}));
 
 TEST_F(ParserImplTest, TypeDecl_Sampler) {
-  auto* p = parser("sampler");
+  auto p = parser("sampler");
 
   auto* type = tm()->Get(std::make_unique<ast::type::SamplerType>(
       ast::type::SamplerKind::kSampler));
@@ -748,7 +748,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Texture_Old) {
-  auto* p = parser("texture_sampled_cube<f32>");
+  auto p = parser("texture_sampled_cube<f32>");
 
   ast::type::F32Type f32;
   auto* type = tm()->Get(std::make_unique<ast::type::SampledTextureType>(
@@ -765,7 +765,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Texture) {
-  auto* p = parser("texture_cube<f32>");
+  auto p = parser("texture_cube<f32>");
 
   ast::type::F32Type f32;
   auto* type = tm()->Get(std::make_unique<ast::type::SampledTextureType>(
diff --git a/src/reader/wgsl/parser_impl_unary_expression_test.cc b/src/reader/wgsl/parser_impl_unary_expression_test.cc
index 57787ca..6817ed7 100644
--- a/src/reader/wgsl/parser_impl_unary_expression_test.cc
+++ b/src/reader/wgsl/parser_impl_unary_expression_test.cc
@@ -27,7 +27,7 @@
 namespace {
 
 TEST_F(ParserImplTest, UnaryExpression_Postix) {
-  auto* p = parser("a[2]");
+  auto p = parser("a[2]");
   auto e = p->unary_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -48,7 +48,7 @@
 }
 
 TEST_F(ParserImplTest, UnaryExpression_Minus) {
-  auto* p = parser("- 1");
+  auto p = parser("- 1");
   auto e = p->unary_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -68,7 +68,7 @@
 }
 
 TEST_F(ParserImplTest, UnaryExpression_Minus_InvalidRHS) {
-  auto* p = parser("-if(a) {}");
+  auto p = parser("-if(a) {}");
   auto e = p->unary_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -78,7 +78,7 @@
 }
 
 TEST_F(ParserImplTest, UnaryExpression_Bang) {
-  auto* p = parser("!1");
+  auto p = parser("!1");
   auto e = p->unary_expression();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -98,7 +98,7 @@
 }
 
 TEST_F(ParserImplTest, UnaryExpression_Bang_InvalidRHS) {
-  auto* p = parser("!if (a) {}");
+  auto p = parser("!if (a) {}");
   auto e = p->unary_expression();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_variable_decl_test.cc b/src/reader/wgsl/parser_impl_variable_decl_test.cc
index f84f0d9..64fb71e 100644
--- a/src/reader/wgsl/parser_impl_variable_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_variable_decl_test.cc
@@ -23,7 +23,7 @@
 namespace {
 
 TEST_F(ParserImplTest, VariableDecl_Parses) {
-  auto* p = parser("var my_var : f32");
+  auto p = parser("var my_var : f32");
   auto var = p->variable_decl();
   EXPECT_FALSE(p->has_error());
   EXPECT_TRUE(var.matched);
@@ -40,7 +40,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecl_MissingVar) {
-  auto* p = parser("my_var : f32");
+  auto p = parser("my_var : f32");
   auto v = p->variable_decl();
   EXPECT_EQ(v.value, nullptr);
   EXPECT_FALSE(v.matched);
@@ -52,7 +52,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecl_InvalidIdentDecl) {
-  auto* p = parser("var my_var f32");
+  auto p = parser("var my_var f32");
   auto v = p->variable_decl();
   EXPECT_FALSE(v.matched);
   EXPECT_TRUE(v.errored);
@@ -62,7 +62,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecl_WithStorageClass) {
-  auto* p = parser("var<private> my_var : f32");
+  auto p = parser("var<private> my_var : f32");
   auto v = p->variable_decl();
   EXPECT_TRUE(v.matched);
   EXPECT_FALSE(v.errored);
@@ -79,7 +79,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecl_InvalidStorageClass) {
-  auto* p = parser("var<unknown> my_var : f32");
+  auto p = parser("var<unknown> my_var : f32");
   auto v = p->variable_decl();
   EXPECT_FALSE(v.matched);
   EXPECT_TRUE(v.errored);
diff --git a/src/reader/wgsl/parser_impl_variable_decoration_list_test.cc b/src/reader/wgsl/parser_impl_variable_decoration_list_test.cc
index 60d9a49..f10b13d 100644
--- a/src/reader/wgsl/parser_impl_variable_decoration_list_test.cc
+++ b/src/reader/wgsl/parser_impl_variable_decoration_list_test.cc
@@ -24,7 +24,7 @@
 namespace {
 
 TEST_F(ParserImplTest, VariableDecorationList_Parses) {
-  auto* p = parser(R"([[location(4), builtin(position)]])");
+  auto p = parser(R"([[location(4), builtin(position)]])");
   auto decos = p->decoration_list();
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_FALSE(decos.errored);
@@ -43,7 +43,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecorationList_Empty) {
-  auto* p = parser(R"([[]])");
+  auto p = parser(R"([[]])");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
@@ -53,7 +53,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecorationList_Invalid) {
-  auto* p = parser(R"([[invalid]])");
+  auto p = parser(R"([[invalid]])");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
@@ -63,7 +63,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecorationList_ExtraComma) {
-  auto* p = parser(R"([[builtin(position), ]])");
+  auto p = parser(R"([[builtin(position), ]])");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
@@ -73,7 +73,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecorationList_MissingComma) {
-  auto* p = parser(R"([[binding(4) location(5)]])");
+  auto p = parser(R"([[binding(4) location(5)]])");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
@@ -83,7 +83,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecorationList_BadDecoration) {
-  auto* p = parser(R"([[location(bad)]])");
+  auto p = parser(R"([[location(bad)]])");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
@@ -94,7 +94,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecorationList_InvalidBuiltin) {
-  auto* p = parser("[[builtin(invalid)]]");
+  auto p = parser("[[builtin(invalid)]]");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
diff --git a/src/reader/wgsl/parser_impl_variable_decoration_test.cc b/src/reader/wgsl/parser_impl_variable_decoration_test.cc
index e992a61..ecef7b0 100644
--- a/src/reader/wgsl/parser_impl_variable_decoration_test.cc
+++ b/src/reader/wgsl/parser_impl_variable_decoration_test.cc
@@ -26,7 +26,7 @@
 namespace {
 
 TEST_F(ParserImplTest, VariableDecoration_Location) {
-  auto* p = parser("location(4)");
+  auto p = parser("location(4)");
   auto deco = p->decoration();
   EXPECT_TRUE(deco.matched);
   EXPECT_FALSE(deco.errored);
@@ -41,7 +41,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecoration_Location_MissingLeftParen) {
-  auto* p = parser("location 4)");
+  auto p = parser("location 4)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -51,7 +51,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecoration_Location_MissingRightParen) {
-  auto* p = parser("location(4");
+  auto p = parser("location(4");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -61,7 +61,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecoration_Location_MissingValue) {
-  auto* p = parser("location()");
+  auto p = parser("location()");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -72,7 +72,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecoration_Location_MissingInvalid) {
-  auto* p = parser("location(nan)");
+  auto p = parser("location(nan)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -95,7 +95,7 @@
 
 TEST_P(BuiltinTest, VariableDecoration_Builtin) {
   auto params = GetParam();
-  auto* p = parser(std::string("builtin(") + params.input + ")");
+  auto p = parser(std::string("builtin(") + params.input + ")");
 
   auto deco = p->decoration();
   EXPECT_TRUE(deco.matched);
@@ -125,7 +125,7 @@
                     ast::Builtin::kGlobalInvocationId}));
 
 TEST_F(ParserImplTest, VariableDecoration_Builtin_MissingLeftParen) {
-  auto* p = parser("builtin position)");
+  auto p = parser("builtin position)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -135,7 +135,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecoration_Builtin_MissingRightParen) {
-  auto* p = parser("builtin(position");
+  auto p = parser("builtin(position");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -145,7 +145,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecoration_Builtin_MissingValue) {
-  auto* p = parser("builtin()");
+  auto p = parser("builtin()");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -155,7 +155,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecoration_Builtin_InvalidValue) {
-  auto* p = parser("builtin(other_thingy)");
+  auto p = parser("builtin(other_thingy)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -165,7 +165,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecoration_Builtin_MissingInvalid) {
-  auto* p = parser("builtin(3)");
+  auto p = parser("builtin(3)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -175,7 +175,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecoration_Binding) {
-  auto* p = parser("binding(4)");
+  auto p = parser("binding(4)");
   auto deco = p->decoration();
   EXPECT_TRUE(deco.matched);
   EXPECT_FALSE(deco.errored);
@@ -190,7 +190,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecoration_Binding_MissingLeftParen) {
-  auto* p = parser("binding 4)");
+  auto p = parser("binding 4)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -200,7 +200,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecoration_Binding_MissingRightParen) {
-  auto* p = parser("binding(4");
+  auto p = parser("binding(4");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -210,7 +210,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecoration_Binding_MissingValue) {
-  auto* p = parser("binding()");
+  auto p = parser("binding()");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -221,7 +221,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecoration_Binding_MissingInvalid) {
-  auto* p = parser("binding(nan)");
+  auto p = parser("binding(nan)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -232,7 +232,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecoration_set) {
-  auto* p = parser("set(4)");
+  auto p = parser("set(4)");
   auto deco = p->decoration();
   EXPECT_TRUE(deco.matched);
   EXPECT_FALSE(deco.errored);
@@ -247,7 +247,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecoration_Set_MissingLeftParen) {
-  auto* p = parser("set 2)");
+  auto p = parser("set 2)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -257,7 +257,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecoration_Set_MissingRightParen) {
-  auto* p = parser("set(2");
+  auto p = parser("set(2");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -267,7 +267,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecoration_Set_MissingValue) {
-  auto* p = parser("set()");
+  auto p = parser("set()");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
@@ -278,7 +278,7 @@
 }
 
 TEST_F(ParserImplTest, VariableDecoration_Set_MissingInvalid) {
-  auto* p = parser("set(nan)");
+  auto p = parser("set(nan)");
   auto deco = p->decoration();
   EXPECT_FALSE(deco.matched);
   EXPECT_TRUE(deco.errored);
diff --git a/src/reader/wgsl/parser_impl_variable_ident_decl_test.cc b/src/reader/wgsl/parser_impl_variable_ident_decl_test.cc
index 08d0a39..f4af027 100644
--- a/src/reader/wgsl/parser_impl_variable_ident_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_variable_ident_decl_test.cc
@@ -22,7 +22,7 @@
 namespace {
 
 TEST_F(ParserImplTest, VariableIdentDecl_Parses) {
-  auto* p = parser("my_var : f32");
+  auto p = parser("my_var : f32");
   auto decl = p->expect_variable_ident_decl("test");
   ASSERT_FALSE(p->has_error());
   ASSERT_FALSE(decl.errored);
@@ -37,7 +37,7 @@
 }
 
 TEST_F(ParserImplTest, VariableIdentDecl_MissingIdent) {
-  auto* p = parser(": f32");
+  auto p = parser(": f32");
   auto decl = p->expect_variable_ident_decl("test");
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(decl.errored);
@@ -45,7 +45,7 @@
 }
 
 TEST_F(ParserImplTest, VariableIdentDecl_MissingColon) {
-  auto* p = parser("my_var f32");
+  auto p = parser("my_var f32");
   auto decl = p->expect_variable_ident_decl("test");
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(decl.errored);
@@ -53,7 +53,7 @@
 }
 
 TEST_F(ParserImplTest, VariableIdentDecl_MissingType) {
-  auto* p = parser("my_var :");
+  auto p = parser("my_var :");
   auto decl = p->expect_variable_ident_decl("test");
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(decl.errored);
@@ -61,7 +61,7 @@
 }
 
 TEST_F(ParserImplTest, VariableIdentDecl_InvalidIdent) {
-  auto* p = parser("123 : f32");
+  auto p = parser("123 : f32");
   auto decl = p->expect_variable_ident_decl("test");
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(decl.errored);
@@ -69,7 +69,7 @@
 }
 
 TEST_F(ParserImplTest, VariableIdentDecl_InvalidType) {
-  auto* p = parser("my_var : invalid");
+  auto p = parser("my_var : invalid");
   auto decl = p->expect_variable_ident_decl("test");
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(decl.errored);
diff --git a/src/reader/wgsl/parser_impl_variable_stmt_test.cc b/src/reader/wgsl/parser_impl_variable_stmt_test.cc
index 20a966c..fe6cc5a 100644
--- a/src/reader/wgsl/parser_impl_variable_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_variable_stmt_test.cc
@@ -24,7 +24,7 @@
 namespace {
 
 TEST_F(ParserImplTest, VariableStmt_VariableDecl) {
-  auto* p = parser("var a : i32;");
+  auto p = parser("var a : i32;");
   auto e = p->variable_stmt();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -43,7 +43,7 @@
 }
 
 TEST_F(ParserImplTest, VariableStmt_VariableDecl_WithInit) {
-  auto* p = parser("var a : i32 = 1;");
+  auto p = parser("var a : i32 = 1;");
   auto e = p->variable_stmt();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -63,7 +63,7 @@
 }
 
 TEST_F(ParserImplTest, VariableStmt_VariableDecl_Invalid) {
-  auto* p = parser("var a : invalid;");
+  auto p = parser("var a : invalid;");
   auto e = p->variable_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -73,7 +73,7 @@
 }
 
 TEST_F(ParserImplTest, VariableStmt_VariableDecl_ConstructorInvalid) {
-  auto* p = parser("var a : i32 = if(a) {}");
+  auto p = parser("var a : i32 = if(a) {}");
   auto e = p->variable_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -83,7 +83,7 @@
 }
 
 TEST_F(ParserImplTest, VariableStmt_Const) {
-  auto* p = parser("const a : i32 = 1");
+  auto p = parser("const a : i32 = 1");
   auto e = p->variable_stmt();
   EXPECT_TRUE(e.matched);
   EXPECT_FALSE(e.errored);
@@ -98,7 +98,7 @@
 }
 
 TEST_F(ParserImplTest, VariableStmt_Const_InvalidVarIdent) {
-  auto* p = parser("const a : invalid = 1");
+  auto p = parser("const a : invalid = 1");
   auto e = p->variable_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -108,7 +108,7 @@
 }
 
 TEST_F(ParserImplTest, VariableStmt_Const_MissingEqual) {
-  auto* p = parser("const a : i32 1");
+  auto p = parser("const a : i32 1");
   auto e = p->variable_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -118,7 +118,7 @@
 }
 
 TEST_F(ParserImplTest, VariableStmt_Const_MissingConstructor) {
-  auto* p = parser("const a : i32 =");
+  auto p = parser("const a : i32 =");
   auto e = p->variable_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
@@ -128,7 +128,7 @@
 }
 
 TEST_F(ParserImplTest, VariableStmt_Const_InvalidConstructor) {
-  auto* p = parser("const a : i32 = if (a) {}");
+  auto p = parser("const a : i32 = if (a) {}");
   auto e = p->variable_stmt();
   EXPECT_FALSE(e.matched);
   EXPECT_TRUE(e.errored);
diff --git a/src/reader/wgsl/parser_impl_variable_storage_decoration_test.cc b/src/reader/wgsl/parser_impl_variable_storage_decoration_test.cc
index 75daebf..5f8c6ca 100644
--- a/src/reader/wgsl/parser_impl_variable_storage_decoration_test.cc
+++ b/src/reader/wgsl/parser_impl_variable_storage_decoration_test.cc
@@ -36,7 +36,7 @@
 
 TEST_P(VariableStorageTest, Parses) {
   auto params = GetParam();
-  auto* p = parser(std::string("<") + params.input + ">");
+  auto p = parser(std::string("<") + params.input + ">");
 
   auto sc = p->variable_storage_decoration();
   EXPECT_FALSE(p->has_error());
@@ -64,7 +64,7 @@
         VariableStorageData{"function", ast::StorageClass::kFunction}));
 
 TEST_F(ParserImplTest, VariableStorageDecoration_NoMatch) {
-  auto* p = parser("<not-a-storage-class>");
+  auto p = parser("<not-a-storage-class>");
   auto sc = p->variable_storage_decoration();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(sc.errored);
@@ -73,7 +73,7 @@
 }
 
 TEST_F(ParserImplTest, VariableStorageDecoration_Empty) {
-  auto* p = parser("<>");
+  auto p = parser("<>");
   auto sc = p->variable_storage_decoration();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(sc.errored);
@@ -82,7 +82,7 @@
 }
 
 TEST_F(ParserImplTest, VariableStorageDecoration_MissingLessThan) {
-  auto* p = parser("in>");
+  auto p = parser("in>");
   auto sc = p->variable_storage_decoration();
   EXPECT_FALSE(p->has_error());
   EXPECT_FALSE(sc.errored);
@@ -93,7 +93,7 @@
 }
 
 TEST_F(ParserImplTest, VariableStorageDecoration_MissingGreaterThan) {
-  auto* p = parser("<in");
+  auto p = parser("<in");
   auto sc = p->variable_storage_decoration();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(sc.errored);