ast: Remove StructMember constructor that doesn't take a Source

Parsers need fixing up.

Bug: tint:396
Bug: tint:390
Change-Id: Ie9f8f7428d2308c3b1a9a8d2137e2e3c6d1d13e2
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/35162
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/ast/struct_member.cc b/src/ast/struct_member.cc
index 68192da..db7c287 100644
--- a/src/ast/struct_member.cc
+++ b/src/ast/struct_member.cc
@@ -23,11 +23,6 @@
 namespace tint {
 namespace ast {
 
-StructMember::StructMember(const std::string& name,
-                           type::Type* type,
-                           StructMemberDecorationList decorations)
-    : Base(), name_(name), type_(type), decorations_(std::move(decorations)) {}
-
 StructMember::StructMember(const Source& source,
                            const std::string& name,
                            type::Type* type,
diff --git a/src/ast/struct_member.h b/src/ast/struct_member.h
index bf9ea2d..73470b6 100644
--- a/src/ast/struct_member.h
+++ b/src/ast/struct_member.h
@@ -32,13 +32,6 @@
 class StructMember : public Castable<StructMember, Node> {
  public:
   /// Create a new struct member statement
-  /// @param name The struct member name
-  /// @param type The struct member type
-  /// @param decorations The struct member decorations
-  StructMember(const std::string& name,
-               type::Type* type,
-               StructMemberDecorationList decorations);
-  /// Create a new struct member statement
   /// @param source The input source for the struct member statement
   /// @param name The struct member name
   /// @param type The struct member type
diff --git a/src/ast/struct_member_test.cc b/src/ast/struct_member_test.cc
index 88b2eae..e698302 100644
--- a/src/ast/struct_member_test.cc
+++ b/src/ast/struct_member_test.cc
@@ -32,7 +32,7 @@
   StructMemberDecorationList decorations;
   decorations.emplace_back(create<StructMemberOffsetDecoration>(4, Source{}));
 
-  StructMember st{"a", &i32, decorations};
+  StructMember st{Source{}, "a", &i32, decorations};
   EXPECT_EQ(st.name(), "a");
   EXPECT_EQ(st.type(), &i32);
   EXPECT_EQ(st.decorations().size(), 1u);
@@ -59,18 +59,18 @@
 
 TEST_F(StructMemberTest, IsValid) {
   type::I32 i32;
-  StructMember st{"a", &i32, {}};
+  StructMember st{Source{}, "a", &i32, {}};
   EXPECT_TRUE(st.IsValid());
 }
 
 TEST_F(StructMemberTest, IsValid_EmptyName) {
   type::I32 i32;
-  StructMember st{"", &i32, {}};
+  StructMember st{Source{}, "", &i32, {}};
   EXPECT_FALSE(st.IsValid());
 }
 
 TEST_F(StructMemberTest, IsValid_NullType) {
-  StructMember st{"a", nullptr, {}};
+  StructMember st{Source{}, "a", nullptr, {}};
   EXPECT_FALSE(st.IsValid());
 }
 
@@ -80,7 +80,7 @@
   decorations.emplace_back(create<StructMemberOffsetDecoration>(4, Source{}));
   decorations.push_back(nullptr);
 
-  StructMember st{"a", &i32, decorations};
+  StructMember st{Source{}, "a", &i32, decorations};
   EXPECT_FALSE(st.IsValid());
 }
 
@@ -89,7 +89,7 @@
   StructMemberDecorationList decorations;
   decorations.emplace_back(create<StructMemberOffsetDecoration>(4, Source{}));
 
-  StructMember st{"a", &i32, decorations};
+  StructMember st{Source{}, "a", &i32, decorations};
   std::ostringstream out;
   st.to_str(out, 2);
   EXPECT_EQ(out.str(), "  StructMember{[[ offset 4 ]] a: __i32}\n");
@@ -97,7 +97,7 @@
 
 TEST_F(StructMemberTest, ToStrNoDecorations) {
   type::I32 i32;
-  StructMember st{"a", &i32, {}};
+  StructMember st{Source{}, "a", &i32, {}};
   std::ostringstream out;
   st.to_str(out, 2);
   EXPECT_EQ(out.str(), "  StructMember{a: __i32}\n");
diff --git a/src/ast/struct_test.cc b/src/ast/struct_test.cc
index b615bc8..b8f7234 100644
--- a/src/ast/struct_test.cc
+++ b/src/ast/struct_test.cc
@@ -33,7 +33,7 @@
   type::I32 i32;
   StructMemberList members;
   members.push_back(
-      create<StructMember>("a", &i32, StructMemberDecorationList()));
+      create<StructMember>(Source{}, "a", &i32, StructMemberDecorationList()));
 
   Struct s{members};
   EXPECT_EQ(s.members().size(), 1u);
@@ -49,7 +49,7 @@
 
   StructMemberList members;
   members.push_back(
-      create<StructMember>("a", &i32, StructMemberDecorationList()));
+      create<StructMember>(Source{}, "a", &i32, StructMemberDecorationList()));
 
   StructDecorationList decos;
   decos.push_back(create<StructBlockDecoration>(Source{}));
@@ -69,7 +69,7 @@
 
   StructMemberList members;
   members.emplace_back(
-      create<StructMember>("a", &i32, StructMemberDecorationList()));
+      create<StructMember>(Source{}, "a", &i32, StructMemberDecorationList()));
 
   StructDecorationList decos;
   decos.push_back(create<StructBlockDecoration>(Source{}));
@@ -96,7 +96,7 @@
 
   StructMemberList members;
   members.push_back(
-      create<StructMember>("a", &i32, StructMemberDecorationList()));
+      create<StructMember>(Source{}, "a", &i32, StructMemberDecorationList()));
   members.push_back(nullptr);
 
   Struct s{members};
@@ -108,7 +108,7 @@
 
   StructMemberList members;
   members.push_back(
-      create<StructMember>("", &i32, StructMemberDecorationList()));
+      create<StructMember>(Source{}, "", &i32, StructMemberDecorationList()));
 
   Struct s{members};
   EXPECT_FALSE(s.IsValid());
@@ -119,7 +119,7 @@
 
   StructMemberList members;
   members.emplace_back(
-      create<StructMember>("a", &i32, StructMemberDecorationList()));
+      create<StructMember>(Source{}, "a", &i32, StructMemberDecorationList()));
 
   StructDecorationList decos;
   decos.push_back(create<StructBlockDecoration>(Source{}));
diff --git a/src/ast/type/access_control_type_test.cc b/src/ast/type/access_control_type_test.cc
index 65e6cfe..a7bc2aa 100644
--- a/src/ast/type/access_control_type_test.cc
+++ b/src/ast/type/access_control_type_test.cc
@@ -126,11 +126,11 @@
 
   StructMemberDecorationList deco;
   deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<StructMember>("foo", &u32, deco));
+  members.push_back(create<StructMember>(Source{}, "foo", &u32, deco));
 
   deco = StructMemberDecorationList();
   deco.push_back(create<StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<StructMember>("bar", &u32, deco));
+  members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
 
   StructDecorationList decos;
 
@@ -170,12 +170,12 @@
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
-    members.push_back(create<StructMember>("foo", &u32, deco));
+    members.push_back(create<StructMember>(Source{}, "foo", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(4, Source{}));
-    members.push_back(create<StructMember>("bar", &u32, deco));
+    members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
   }
   StructDecorationList decos;
 
diff --git a/src/ast/type/alias_type_test.cc b/src/ast/type/alias_type_test.cc
index ab68bf2..c54fea7 100644
--- a/src/ast/type/alias_type_test.cc
+++ b/src/ast/type/alias_type_test.cc
@@ -198,12 +198,12 @@
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
-    members.push_back(create<StructMember>("foo", &u32, deco));
+    members.push_back(create<StructMember>(Source{}, "foo", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(4, Source{}));
-    members.push_back(create<StructMember>("bar", &u32, deco));
+    members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
   }
   StructDecorationList decos;
 
@@ -247,12 +247,12 @@
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
-    members.push_back(create<StructMember>("foo", &u32, deco));
+    members.push_back(create<StructMember>(Source{}, "foo", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(4, Source{}));
-    members.push_back(create<StructMember>("bar", &u32, deco));
+    members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
   }
   StructDecorationList decos;
 
diff --git a/src/ast/type/struct_type_test.cc b/src/ast/type/struct_type_test.cc
index 7e28685..37e1e97 100644
--- a/src/ast/type/struct_type_test.cc
+++ b/src/ast/type/struct_type_test.cc
@@ -81,12 +81,12 @@
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
-    members.push_back(create<StructMember>("foo", &u32, deco));
+    members.push_back(create<StructMember>(Source{}, "foo", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(4, Source{}));
-    members.push_back(create<StructMember>("bar", &u32, deco));
+    members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
   }
   StructDecorationList decos;
 
@@ -106,17 +106,17 @@
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
-    members.push_back(create<StructMember>("foo", &u32, deco));
+    members.push_back(create<StructMember>(Source{}, "foo", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(4, Source{}));
-    members.push_back(create<StructMember>("bar", &u32, deco));
+    members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(8, Source{}));
-    members.push_back(create<StructMember>("bar", &arr, deco));
+    members.push_back(create<StructMember>(Source{}, "bar", &arr, deco));
   }
   StructDecorationList decos;
 
@@ -137,17 +137,17 @@
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
-    members.push_back(create<StructMember>("foo", &u32, deco));
+    members.push_back(create<StructMember>(Source{}, "foo", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(4, Source{}));
-    members.push_back(create<StructMember>("bar", &u32, deco));
+    members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(8, Source{}));
-    members.push_back(create<StructMember>("bar", &u32, deco));
+    members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
   }
   StructDecorationList decos;
 
@@ -165,7 +165,7 @@
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
-    members.push_back(create<StructMember>("foo", &vec2, deco));
+    members.push_back(create<StructMember>(Source{}, "foo", &vec2, deco));
   }
   StructDecorationList decos;
 
@@ -184,7 +184,7 @@
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
-    members.push_back(create<StructMember>("foo", &vec3, deco));
+    members.push_back(create<StructMember>(Source{}, "foo", &vec3, deco));
   }
   StructDecorationList decos;
 
@@ -204,7 +204,7 @@
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
-    members.push_back(create<StructMember>("foo", &vec4, deco));
+    members.push_back(create<StructMember>(Source{}, "foo", &vec4, deco));
   }
   StructDecorationList decos;
 
@@ -223,12 +223,12 @@
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
-    members.push_back(create<StructMember>("foo", &u32, deco));
+    members.push_back(create<StructMember>(Source{}, "foo", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(4, Source{}));
-    members.push_back(create<StructMember>("bar", &u32, deco));
+    members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
   }
   StructDecorationList decos;
 
@@ -247,17 +247,17 @@
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
-    members.push_back(create<StructMember>("foo", &u32, deco));
+    members.push_back(create<StructMember>(Source{}, "foo", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(4, Source{}));
-    members.push_back(create<StructMember>("bar", &u32, deco));
+    members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(8, Source{}));
-    members.push_back(create<StructMember>("bar", &arr, deco));
+    members.push_back(create<StructMember>(Source{}, "bar", &arr, deco));
   }
   StructDecorationList decos;
 
@@ -276,17 +276,17 @@
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
-    members.push_back(create<StructMember>("foo", &u32, deco));
+    members.push_back(create<StructMember>(Source{}, "foo", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(4, Source{}));
-    members.push_back(create<StructMember>("bar", &u32, deco));
+    members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
   }
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(8, Source{}));
-    members.push_back(create<StructMember>("bar", &u32, deco));
+    members.push_back(create<StructMember>(Source{}, "bar", &u32, deco));
   }
   StructDecorationList decos;
 
@@ -303,7 +303,7 @@
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
-    members.push_back(create<StructMember>("foo", &vec2, deco));
+    members.push_back(create<StructMember>(Source{}, "foo", &vec2, deco));
   }
   StructDecorationList decos;
 
@@ -321,7 +321,7 @@
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
-    members.push_back(create<StructMember>("foo", &vec3, deco));
+    members.push_back(create<StructMember>(Source{}, "foo", &vec3, deco));
   }
   StructDecorationList decos;
 
@@ -339,7 +339,7 @@
   {
     StructMemberDecorationList deco;
     deco.push_back(create<StructMemberOffsetDecoration>(0, Source{}));
-    members.push_back(create<StructMember>("foo", &vec4, deco));
+    members.push_back(create<StructMember>(Source{}, "foo", &vec4, deco));
   }
   StructDecorationList decos;
 
diff --git a/src/inspector/inspector_test.cc b/src/inspector/inspector_test.cc
index 5c7904e..d638381 100644
--- a/src/inspector/inspector_test.cc
+++ b/src/inspector/inspector_test.cc
@@ -300,7 +300,7 @@
           create<ast::StructMemberOffsetDecoration>(offset, Source{}));
 
       members.push_back(create<ast::StructMember>(
-          StructMemberName(members.size(), type), type, deco));
+          Source{}, StructMemberName(members.size(), type), type, deco));
     }
 
     ast::StructDecorationList decos;
@@ -1449,7 +1449,8 @@
   deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
 
   members.push_back(create<ast::StructMember>(
-      StructMemberName(members.size(), i32_type()), i32_type(), deco));
+      Source{}, StructMemberName(members.size(), i32_type()), i32_type(),
+      deco));
 
   ast::StructDecorationList decos;
 
diff --git a/src/reader/spirv/parser_impl.cc b/src/reader/spirv/parser_impl.cc
index f7e2c31..723f8d3 100644
--- a/src/reader/spirv/parser_impl.cc
+++ b/src/reader/spirv/parser_impl.cc
@@ -940,8 +940,9 @@
       ++num_non_writable_members;
     }
     const auto member_name = namer_.GetMemberName(type_id, member_index);
-    auto* ast_struct_member = create<ast::StructMember>(
-        member_name, ast_member_ty, std::move(ast_member_decorations));
+    auto* ast_struct_member =
+        create<ast::StructMember>(Source{}, member_name, ast_member_ty,
+                                  std::move(ast_member_decorations));
     ast_members.push_back(ast_struct_member);
   }
 
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 427a93a..9fcabfc 100644
--- a/src/reader/wgsl/parser_impl_variable_ident_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_variable_ident_decl_test.cc
@@ -85,7 +85,7 @@
 TEST_F(ParserImplTest, VariableIdentDecl_ParsesWithAccessDeco_Read) {
   ast::type::I32 i32;
 
-  ast::StructMember mem("a", &i32, ast::StructMemberDecorationList{});
+  ast::StructMember mem(Source{}, "a", &i32, ast::StructMemberDecorationList{});
   ast::StructMemberList members;
   members.push_back(&mem);
 
@@ -111,7 +111,7 @@
 TEST_F(ParserImplTest, VariableIdentDecl_ParsesWithAccessDeco_ReadWrite) {
   ast::type::I32 i32;
 
-  ast::StructMember mem("a", &i32, ast::StructMemberDecorationList{});
+  ast::StructMember mem(Source{}, "a", &i32, ast::StructMemberDecorationList{});
   ast::StructMemberList members;
   members.push_back(&mem);
 
@@ -137,7 +137,7 @@
 TEST_F(ParserImplTest, VariableIdentDecl_MultipleAccessDecoFail) {
   ast::type::I32 i32;
 
-  ast::StructMember mem("a", &i32, ast::StructMemberDecorationList{});
+  ast::StructMember mem(Source{}, "a", &i32, ast::StructMemberDecorationList{});
   ast::StructMemberList members;
   members.push_back(&mem);
 
@@ -160,7 +160,7 @@
 TEST_F(ParserImplTest, VariableIdentDecl_MultipleAccessDeco_MultiBlock_Fail) {
   ast::type::I32 i32;
 
-  ast::StructMember mem("a", &i32, ast::StructMemberDecorationList{});
+  ast::StructMember mem(Source{}, "a", &i32, ast::StructMemberDecorationList{});
   ast::StructMemberList members;
   members.push_back(&mem);
 
@@ -199,7 +199,7 @@
 TEST_F(ParserImplTest, VariableIdentDecl_NonAccessDecoFail) {
   ast::type::I32 i32;
 
-  ast::StructMember mem("a", &i32, ast::StructMemberDecorationList{});
+  ast::StructMember mem(Source{}, "a", &i32, ast::StructMemberDecorationList{});
   ast::StructMemberList members;
   members.push_back(&mem);
 
diff --git a/src/transform/first_index_offset.cc b/src/transform/first_index_offset.cc
index 81e9bc3..2dbaf93 100644
--- a/src/transform/first_index_offset.cc
+++ b/src/transform/first_index_offset.cc
@@ -204,8 +204,8 @@
     ast::StructMemberDecorationList member_dec;
     member_dec.push_back(
         mod->create<ast::StructMemberOffsetDecoration>(offset, Source{}));
-    members.push_back(mod->create<ast::StructMember>(kFirstVertexName, u32_type,
-                                                     std::move(member_dec)));
+    members.push_back(mod->create<ast::StructMember>(
+        Source{}, kFirstVertexName, u32_type, std::move(member_dec)));
     vertex_index_offset_ = offset;
     offset += 4;
   }
@@ -215,7 +215,7 @@
     member_dec.push_back(
         mod->create<ast::StructMemberOffsetDecoration>(offset, Source{}));
     members.push_back(mod->create<ast::StructMember>(
-        kFirstInstanceName, u32_type, std::move(member_dec)));
+        Source{}, kFirstInstanceName, u32_type, std::move(member_dec)));
     instance_index_offset_ = offset;
     offset += 4;
   }
diff --git a/src/transform/vertex_pulling.cc b/src/transform/vertex_pulling.cc
index 41a42c2..0c9d1a0 100644
--- a/src/transform/vertex_pulling.cc
+++ b/src/transform/vertex_pulling.cc
@@ -258,7 +258,7 @@
       mod->create<ast::StructMemberOffsetDecoration>(0u, Source{}));
 
   members.push_back(mod->create<ast::StructMember>(
-      kStructBufferName, internal_array_type, std::move(member_dec)));
+      Source{}, kStructBufferName, internal_array_type, std::move(member_dec)));
 
   ast::StructDecorationList decos;
   decos.push_back(mod->create<ast::StructBlockDecoration>(Source{}));
diff --git a/src/type_determiner_test.cc b/src/type_determiner_test.cc
index 182f77b..ed65b87 100644
--- a/src/type_determiner_test.cc
+++ b/src/type_determiner_test.cc
@@ -1210,8 +1210,10 @@
 
   ast::StructMemberDecorationList decos;
   ast::StructMemberList members;
-  members.push_back(create<ast::StructMember>("first_member", &i32, decos));
-  members.push_back(create<ast::StructMember>("second_member", &f32, decos));
+  members.push_back(
+      create<ast::StructMember>(Source{}, "first_member", &i32, decos));
+  members.push_back(
+      create<ast::StructMember>(Source{}, "second_member", &f32, decos));
 
   auto* strct = create<ast::Struct>(members);
 
@@ -1251,8 +1253,10 @@
 
   ast::StructMemberDecorationList decos;
   ast::StructMemberList members;
-  members.push_back(create<ast::StructMember>("first_member", &i32, decos));
-  members.push_back(create<ast::StructMember>("second_member", &f32, decos));
+  members.push_back(
+      create<ast::StructMember>(Source{}, "first_member", &i32, decos));
+  members.push_back(
+      create<ast::StructMember>(Source{}, "second_member", &f32, decos));
 
   auto* strct = create<ast::Struct>(members);
 
@@ -1381,7 +1385,7 @@
 
   ast::StructMemberDecorationList decos;
   ast::StructMemberList b_members;
-  b_members.push_back(create<ast::StructMember>("foo", &vec4, decos));
+  b_members.push_back(create<ast::StructMember>(Source{}, "foo", &vec4, decos));
 
   auto* strctB = create<ast::Struct>(b_members);
   ast::type::Struct stB("B", strctB);
@@ -1389,7 +1393,7 @@
   ast::type::Vector vecB(&stB, 3);
 
   ast::StructMemberList a_members;
-  a_members.push_back(create<ast::StructMember>("mem", &vecB, decos));
+  a_members.push_back(create<ast::StructMember>(Source{}, "mem", &vecB, decos));
 
   auto* strctA = create<ast::Struct>(a_members);
 
diff --git a/src/validator/validator_type_test.cc b/src/validator/validator_type_test.cc
index 6cb0a7c..96eb8e8 100644
--- a/src/validator/validator_type_test.cc
+++ b/src/validator/validator_type_test.cc
@@ -47,7 +47,7 @@
   ast::StructMemberList members;
   {
     ast::StructMemberDecorationList deco;
-    members.push_back(create<ast::StructMember>("vf", &f32, deco));
+    members.push_back(create<ast::StructMember>(Source{}, "vf", &f32, deco));
   }
   {
     ast::StructMemberDecorationList deco;
@@ -74,7 +74,7 @@
   ast::StructMemberList members;
   {
     ast::StructMemberDecorationList deco;
-    members.push_back(create<ast::StructMember>("vf", &f32, deco));
+    members.push_back(create<ast::StructMember>(Source{}, "vf", &f32, deco));
   }
   {
     ast::StructMemberDecorationList deco;
@@ -109,7 +109,7 @@
   }
   {
     ast::StructMemberDecorationList deco;
-    members.push_back(create<ast::StructMember>("vf", &f32, deco));
+    members.push_back(create<ast::StructMember>(Source{}, "vf", &f32, deco));
   }
   ast::StructDecorationList decos;
   decos.push_back(create<ast::StructBlockDecoration>(Source{}));
@@ -143,7 +143,7 @@
   }
   {
     ast::StructMemberDecorationList deco;
-    members.push_back(create<ast::StructMember>("a", &u32, deco));
+    members.push_back(create<ast::StructMember>(Source{}, "a", &u32, deco));
   }
 
   ast::StructDecorationList decos;
@@ -172,7 +172,7 @@
   ast::StructMemberList members;
   {
     ast::StructMemberDecorationList deco;
-    members.push_back(create<ast::StructMember>("a", &u32, deco));
+    members.push_back(create<ast::StructMember>(Source{}, "a", &u32, deco));
   }
   {
     ast::StructMemberDecorationList deco;
diff --git a/src/writer/hlsl/generator_impl_alias_type_test.cc b/src/writer/hlsl/generator_impl_alias_type_test.cc
index e1de6b9..57b9611 100644
--- a/src/writer/hlsl/generator_impl_alias_type_test.cc
+++ b/src/writer/hlsl/generator_impl_alias_type_test.cc
@@ -51,9 +51,10 @@
   ast::type::F32 f32;
 
   auto* str = create<ast::Struct>(ast::StructMemberList{
-      create<ast::StructMember>("a", &f32, ast::StructMemberDecorationList{}),
+      create<ast::StructMember>(Source{}, "a", &f32,
+                                ast::StructMemberDecorationList{}),
       create<ast::StructMember>(
-          "b", &i32,
+          Source{}, "b", &i32,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(4, Source{})}),
   });
diff --git a/src/writer/hlsl/generator_impl_function_test.cc b/src/writer/hlsl/generator_impl_function_test.cc
index 6a5cecc..29541f0 100644
--- a/src/writer/hlsl/generator_impl_function_test.cc
+++ b/src/writer/hlsl/generator_impl_function_test.cc
@@ -353,7 +353,7 @@
 
   ast::StructMemberList members;
   members.push_back(create<ast::StructMember>(
-      "coord", &vec4, ast::StructMemberDecorationList{}));
+      Source{}, "coord", &vec4, ast::StructMemberDecorationList{}));
 
   auto* str = create<ast::Struct>(members);
 
@@ -433,11 +433,11 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("a", &i32, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &f32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -508,11 +508,11 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("a", &i32, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &f32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -583,11 +583,11 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("a", &i32, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &f32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -1360,7 +1360,7 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("d", &f32, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "d", &f32, a_deco));
 
   ast::StructDecorationList s_decos;
   s_decos.push_back(create<ast::StructBlockDecoration>(Source{}));
diff --git a/src/writer/hlsl/generator_impl_member_accessor_test.cc b/src/writer/hlsl/generator_impl_member_accessor_test.cc
index e21b210..47ac922 100644
--- a/src/writer/hlsl/generator_impl_member_accessor_test.cc
+++ b/src/writer/hlsl/generator_impl_member_accessor_test.cc
@@ -51,7 +51,7 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList deco;
   deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("mem", &f32, deco));
+  members.push_back(create<ast::StructMember>(Source{}, "mem", &f32, deco));
 
   auto* strct = create<ast::Struct>(members);
 
@@ -98,11 +98,11 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("a", &i32, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &f32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -151,11 +151,11 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("a", &i32, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &f32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -206,11 +206,11 @@
 
   auto* str = create<ast::Struct>(ast::StructMemberList{
       create<ast::StructMember>(
-          "z", &i32,
+          Source{}, "z", &i32,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(0, Source{})}),
       create<ast::StructMember>(
-          "a", &mat,
+          Source{}, "a", &mat,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(4, Source{})}),
   });
@@ -283,11 +283,11 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("z", &i32, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "z", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("a", &mat, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &mat, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -347,11 +347,11 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("z", &i32, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "z", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("a", &mat, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &mat, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -407,11 +407,11 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("z", &i32, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "z", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("a", &mat, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &mat, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -463,7 +463,7 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList deco;
   deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("a", &mat, deco));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &mat, deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -515,11 +515,11 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("z", &i32, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "z", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(16, Source{}));
-  members.push_back(create<ast::StructMember>("a", &mat, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &mat, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -579,7 +579,7 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("a", &ary, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &ary, a_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -635,7 +635,7 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("a", &ary, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &ary, a_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -697,11 +697,11 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("a", &i32, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &f32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -758,7 +758,7 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("a", &ary, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &ary, a_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -816,11 +816,11 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("a", &i32, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &f32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -876,11 +876,11 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("a", &ivec3, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &ivec3, a_deco));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(16, Source{}));
-  members.push_back(create<ast::StructMember>("b", &fvec3, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &fvec3, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -932,11 +932,11 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("a", &ivec3, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &ivec3, a_deco));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(16, Source{}));
-  members.push_back(create<ast::StructMember>("b", &fvec3, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &fvec3, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -1004,11 +1004,11 @@
 
   auto* data_str = create<ast::Struct>(ast::StructMemberList{
       create<ast::StructMember>(
-          "a", &ivec3,
+          Source{}, "a", &ivec3,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(0, Source{})}),
       create<ast::StructMember>(
-          "b", &fvec3,
+          Source{}, "b", &fvec3,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(16, Source{})}),
   });
@@ -1022,7 +1022,7 @@
 
   auto* pre_str = create<ast::Struct>(ast::StructMemberList{
       create<ast::StructMember>(
-          "c", &ary,
+          Source{}, "c", &ary,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(0, Source{})}),
   });
@@ -1089,11 +1089,11 @@
 
   auto* data_str = create<ast::Struct>(ast::StructMemberList{
       create<ast::StructMember>(
-          "a", &ivec3,
+          Source{}, "a", &ivec3,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(0, Source{})}),
       create<ast::StructMember>(
-          "b", &fvec3,
+          Source{}, "b", &fvec3,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(16, Source{})}),
   });
@@ -1106,7 +1106,7 @@
 
   auto* pre_str =
       create<ast::Struct>(ast::StructMemberList{create<ast::StructMember>(
-          "c", &ary,
+          Source{}, "c", &ary,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(0, Source{})})});
 
@@ -1174,11 +1174,11 @@
 
   auto* data_str = create<ast::Struct>(ast::StructMemberList{
       create<ast::StructMember>(
-          "a", &ivec3,
+          Source{}, "a", &ivec3,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(0, Source{})}),
       create<ast::StructMember>(
-          "b", &fvec3,
+          Source{}, "b", &fvec3,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(16, Source{})}),
   });
@@ -1192,7 +1192,7 @@
 
   auto* pre_str =
       create<ast::Struct>(ast::StructMemberList{create<ast::StructMember>(
-          "c", &ary,
+          Source{}, "c", &ary,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(0, Source{})})});
 
@@ -1259,11 +1259,11 @@
 
   auto* data_str = create<ast::Struct>(ast::StructMemberList{
       create<ast::StructMember>(
-          "a", &ivec3,
+          Source{}, "a", &ivec3,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(0, Source{})}),
       create<ast::StructMember>(
-          "b", &fvec3,
+          Source{}, "b", &fvec3,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(16, Source{})}),
   });
@@ -1277,7 +1277,7 @@
 
   auto* pre_str =
       create<ast::Struct>(ast::StructMemberList{create<ast::StructMember>(
-          "c", &ary,
+          Source{}, "c", &ary,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(0, Source{})})});
 
@@ -1344,11 +1344,11 @@
 
   auto* data_str = create<ast::Struct>(ast::StructMemberList{
       create<ast::StructMember>(
-          "a", &ivec3,
+          Source{}, "a", &ivec3,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(0, Source{})}),
       create<ast::StructMember>(
-          "b", &fvec3,
+          Source{}, "b", &fvec3,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(16, Source{})}),
   });
@@ -1362,7 +1362,7 @@
 
   auto* pre_str =
       create<ast::Struct>(ast::StructMemberList{create<ast::StructMember>(
-          "c", &ary,
+          Source{}, "c", &ary,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(0, Source{})})});
 
@@ -1439,11 +1439,11 @@
 
   auto* data_str = create<ast::Struct>(ast::StructMemberList{
       create<ast::StructMember>(
-          "a", &ivec3,
+          Source{}, "a", &ivec3,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(0, Source{})}),
       create<ast::StructMember>(
-          "b", &fvec3,
+          Source{}, "b", &fvec3,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(16, Source{})}),
   });
@@ -1457,7 +1457,7 @@
 
   auto* pre_str =
       create<ast::Struct>(ast::StructMemberList{create<ast::StructMember>(
-          "c", &ary,
+          Source{}, "c", &ary,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(0, Source{})})});
 
diff --git a/src/writer/hlsl/generator_impl_type_test.cc b/src/writer/hlsl/generator_impl_type_test.cc
index 3625278..d65611e 100644
--- a/src/writer/hlsl/generator_impl_type_test.cc
+++ b/src/writer/hlsl/generator_impl_type_test.cc
@@ -174,12 +174,12 @@
   ast::type::F32 f32;
 
   ast::StructMemberList members;
-  members.push_back(
-      create<ast::StructMember>("a", &i32, ast::StructMemberDecorationList{}));
+  members.push_back(create<ast::StructMember>(
+      Source{}, "a", &i32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &f32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -198,12 +198,12 @@
   ast::type::F32 f32;
 
   ast::StructMemberList members;
-  members.push_back(
-      create<ast::StructMember>("a", &i32, ast::StructMemberDecorationList{}));
+  members.push_back(create<ast::StructMember>(
+      Source{}, "a", &i32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &f32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -221,13 +221,13 @@
   decos.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
 
   ast::StructMemberList members;
-  members.push_back(create<ast::StructMember>("a", &i32, decos));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &i32, decos));
 
   decos.push_back(create<ast::StructMemberOffsetDecoration>(32, Source{}));
-  members.push_back(create<ast::StructMember>("b", &f32, decos));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, decos));
 
   decos.push_back(create<ast::StructMemberOffsetDecoration>(128, Source{}));
-  members.push_back(create<ast::StructMember>("c", &f32, decos));
+  members.push_back(create<ast::StructMember>(Source{}, "c", &f32, decos));
 
   auto* str = create<ast::Struct>(members);
 
@@ -250,10 +250,10 @@
 
   ast::StructMemberList members;
   members.push_back(create<ast::StructMember>(
-      "double", &i32, ast::StructMemberDecorationList{}));
+      Source{}, "double", &i32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
-  members.push_back(create<ast::StructMember>("float", &f32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "float", &f32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -273,12 +273,12 @@
   ast::type::F32 f32;
 
   ast::StructMemberList members;
-  members.push_back(
-      create<ast::StructMember>("a", &i32, ast::StructMemberDecorationList{}));
+  members.push_back(create<ast::StructMember>(
+      Source{}, "a", &i32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &f32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   ast::StructDecorationList decos;
   decos.push_back(create<ast::StructBlockDecoration>(Source{}));
diff --git a/src/writer/msl/generator_impl_alias_type_test.cc b/src/writer/msl/generator_impl_alias_type_test.cc
index d9567f3..99e5427 100644
--- a/src/writer/msl/generator_impl_alias_type_test.cc
+++ b/src/writer/msl/generator_impl_alias_type_test.cc
@@ -54,12 +54,12 @@
   ast::type::F32 f32;
 
   ast::StructMemberList members;
-  members.push_back(
-      create<ast::StructMember>("a", &f32, ast::StructMemberDecorationList{}));
+  members.push_back(create<ast::StructMember>(
+      Source{}, "a", &f32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &i32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &i32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -78,12 +78,12 @@
   ast::type::F32 f32;
 
   ast::StructMemberList members;
-  members.push_back(
-      create<ast::StructMember>("a", &f32, ast::StructMemberDecorationList{}));
+  members.push_back(create<ast::StructMember>(
+      Source{}, "a", &f32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &i32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &i32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
diff --git a/src/writer/msl/generator_impl_function_test.cc b/src/writer/msl/generator_impl_function_test.cc
index 7155a10..2bca592 100644
--- a/src/writer/msl/generator_impl_function_test.cc
+++ b/src/writer/msl/generator_impl_function_test.cc
@@ -365,11 +365,11 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("a", &i32, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &f32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -449,11 +449,11 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("a", &i32, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &f32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -962,11 +962,11 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("a", &i32, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &f32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -1076,11 +1076,11 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("a", &i32, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &i32, a_deco));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &f32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -1336,7 +1336,7 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("d", &f32, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "d", &f32, a_deco));
 
   ast::StructDecorationList s_decos;
   s_decos.push_back(create<ast::StructBlockDecoration>(Source{}));
diff --git a/src/writer/msl/generator_impl_test.cc b/src/writer/msl/generator_impl_test.cc
index c22568c..068f847 100644
--- a/src/writer/msl/generator_impl_test.cc
+++ b/src/writer/msl/generator_impl_test.cc
@@ -163,13 +163,13 @@
   decos.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
 
   ast::StructMemberList members;
-  members.push_back(create<ast::StructMember>("a", &i32, decos));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &i32, decos));
 
   decos.push_back(create<ast::StructMemberOffsetDecoration>(32, Source{}));
-  members.push_back(create<ast::StructMember>("b", &f32, decos));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, decos));
 
   decos.push_back(create<ast::StructMemberOffsetDecoration>(128, Source{}));
-  members.push_back(create<ast::StructMember>("c", &f32, decos));
+  members.push_back(create<ast::StructMember>(Source{}, "c", &f32, decos));
 
   auto* str = create<ast::Struct>(members);
 
@@ -187,26 +187,26 @@
   decos.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
 
   ast::StructMemberList members;
-  members.push_back(create<ast::StructMember>("a", &i32, decos));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &i32, decos));
 
   decos.push_back(create<ast::StructMemberOffsetDecoration>(16, Source{}));
-  members.push_back(create<ast::StructMember>("b", &fvec, decos));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &fvec, decos));
 
   decos.push_back(create<ast::StructMemberOffsetDecoration>(32, Source{}));
-  members.push_back(create<ast::StructMember>("c", &f32, decos));
+  members.push_back(create<ast::StructMember>(Source{}, "c", &f32, decos));
 
   auto* inner_str = create<ast::Struct>(members);
 
   ast::type::Struct inner_s("Inner", inner_str);
 
   decos.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("d", &f32, decos));
+  members.push_back(create<ast::StructMember>(Source{}, "d", &f32, decos));
 
   decos.push_back(create<ast::StructMemberOffsetDecoration>(32, Source{}));
-  members.push_back(create<ast::StructMember>("e", &inner_s, decos));
+  members.push_back(create<ast::StructMember>(Source{}, "e", &inner_s, decos));
 
   decos.push_back(create<ast::StructMemberOffsetDecoration>(64, Source{}));
-  members.push_back(create<ast::StructMember>("f", &f32, decos));
+  members.push_back(create<ast::StructMember>(Source{}, "f", &f32, decos));
 
   auto* outer_str = create<ast::Struct>(members);
 
diff --git a/src/writer/msl/generator_impl_type_test.cc b/src/writer/msl/generator_impl_type_test.cc
index a2b8e83..fb33521 100644
--- a/src/writer/msl/generator_impl_type_test.cc
+++ b/src/writer/msl/generator_impl_type_test.cc
@@ -175,12 +175,12 @@
   ast::type::F32 f32;
 
   ast::StructMemberList members;
-  members.push_back(
-      create<ast::StructMember>("a", &i32, ast::StructMemberDecorationList{}));
+  members.push_back(create<ast::StructMember>(
+      Source{}, "a", &i32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &f32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -195,12 +195,12 @@
   ast::type::F32 f32;
 
   ast::StructMemberList members;
-  members.push_back(
-      create<ast::StructMember>("a", &i32, ast::StructMemberDecorationList{}));
+  members.push_back(create<ast::StructMember>(
+      Source{}, "a", &i32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &f32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -220,15 +220,15 @@
 
   auto* str = create<ast::Struct>(ast::StructMemberList{
       create<ast::StructMember>(
-          "a", &i32,
+          Source{}, "a", &i32,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(4, Source{})}),
       create<ast::StructMember>(
-          "b", &f32,
+          Source{}, "b", &f32,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(32, Source{})}),
       create<ast::StructMember>(
-          "c", &f32,
+          Source{}, "c", &f32,
           ast::StructMemberDecorationList{
               create<ast::StructMemberOffsetDecoration>(128, Source{})}),
   });
@@ -253,10 +253,10 @@
 
   ast::StructMemberList members;
   members.push_back(create<ast::StructMember>(
-      "main", &i32, ast::StructMemberDecorationList{}));
+      Source{}, "main", &i32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
-  members.push_back(create<ast::StructMember>("float", &f32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "float", &f32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -276,12 +276,12 @@
   ast::type::F32 f32;
 
   ast::StructMemberList members;
-  members.push_back(
-      create<ast::StructMember>("a", &i32, ast::StructMemberDecorationList{}));
+  members.push_back(create<ast::StructMember>(
+      Source{}, "a", &i32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &f32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   ast::StructDecorationList decos;
   decos.push_back(create<ast::StructBlockDecoration>(Source{}));
diff --git a/src/writer/msl/generator_impl_variable_decl_statement_test.cc b/src/writer/msl/generator_impl_variable_decl_statement_test.cc
index 23b9147..b2d03dd 100644
--- a/src/writer/msl/generator_impl_variable_decl_statement_test.cc
+++ b/src/writer/msl/generator_impl_variable_decl_statement_test.cc
@@ -103,12 +103,12 @@
   ast::type::F32 f32;
 
   ast::StructMemberList members;
-  members.push_back(
-      create<ast::StructMember>("a", &f32, ast::StructMemberDecorationList{}));
+  members.push_back(create<ast::StructMember>(
+      Source{}, "a", &f32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &f32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
diff --git a/src/writer/spirv/builder_accessor_expression_test.cc b/src/writer/spirv/builder_accessor_expression_test.cc
index 82f100e..802cd79 100644
--- a/src/writer/spirv/builder_accessor_expression_test.cc
+++ b/src/writer/spirv/builder_accessor_expression_test.cc
@@ -301,8 +301,8 @@
 
   ast::StructMemberDecorationList decos;
   ast::StructMemberList members;
-  members.push_back(create<ast::StructMember>("a", &f32, decos));
-  members.push_back(create<ast::StructMember>("b", &f32, decos));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &f32, decos));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, decos));
 
   auto* s = create<ast::Struct>(members);
   ast::type::Struct s_type("my_struct", s);
@@ -355,14 +355,16 @@
   // ident.inner.a
   ast::StructMemberDecorationList decos;
   ast::StructMemberList inner_members;
-  inner_members.push_back(create<ast::StructMember>("a", &f32, decos));
-  inner_members.push_back(create<ast::StructMember>("b", &f32, decos));
+  inner_members.push_back(
+      create<ast::StructMember>(Source{}, "a", &f32, decos));
+  inner_members.push_back(
+      create<ast::StructMember>(Source{}, "b", &f32, decos));
 
   ast::type::Struct inner_struct("Inner", create<ast::Struct>(inner_members));
 
   ast::StructMemberList outer_members;
   outer_members.push_back(
-      create<ast::StructMember>("inner", &inner_struct, decos));
+      create<ast::StructMember>(Source{}, "inner", &inner_struct, decos));
 
   ast::type::Struct s_type("my_struct", create<ast::Struct>(outer_members));
 
@@ -420,15 +422,18 @@
   // ident.inner.a
   ast::StructMemberDecorationList decos;
   ast::StructMemberList inner_members;
-  inner_members.push_back(create<ast::StructMember>("a", &f32, decos));
-  inner_members.push_back(create<ast::StructMember>("b", &f32, decos));
+  inner_members.push_back(
+      create<ast::StructMember>(Source{}, "a", &f32, decos));
+  inner_members.push_back(
+      create<ast::StructMember>(Source{}, "b", &f32, decos));
 
   ast::type::Struct inner_struct("Inner", create<ast::Struct>(inner_members));
 
   ast::type::Alias alias(mod->RegisterSymbol("Inner"), "Inner", &inner_struct);
 
   ast::StructMemberList outer_members;
-  outer_members.push_back(create<ast::StructMember>("inner", &alias, decos));
+  outer_members.push_back(
+      create<ast::StructMember>(Source{}, "inner", &alias, decos));
 
   ast::type::Struct s_type("Outer", create<ast::Struct>(outer_members));
 
@@ -486,14 +491,16 @@
 
   ast::StructMemberDecorationList decos;
   ast::StructMemberList inner_members;
-  inner_members.push_back(create<ast::StructMember>("a", &f32, decos));
-  inner_members.push_back(create<ast::StructMember>("b", &f32, decos));
+  inner_members.push_back(
+      create<ast::StructMember>(Source{}, "a", &f32, decos));
+  inner_members.push_back(
+      create<ast::StructMember>(Source{}, "b", &f32, decos));
 
   ast::type::Struct inner_struct("Inner", create<ast::Struct>(inner_members));
 
   ast::StructMemberList outer_members;
   outer_members.push_back(
-      create<ast::StructMember>("inner", &inner_struct, decos));
+      create<ast::StructMember>(Source{}, "inner", &inner_struct, decos));
 
   ast::type::Struct s_type("my_struct", create<ast::Struct>(outer_members));
 
@@ -558,14 +565,16 @@
 
   ast::StructMemberDecorationList decos;
   ast::StructMemberList inner_members;
-  inner_members.push_back(create<ast::StructMember>("a", &f32, decos));
-  inner_members.push_back(create<ast::StructMember>("b", &f32, decos));
+  inner_members.push_back(
+      create<ast::StructMember>(Source{}, "a", &f32, decos));
+  inner_members.push_back(
+      create<ast::StructMember>(Source{}, "b", &f32, decos));
 
   ast::type::Struct inner_struct("Inner", create<ast::Struct>(inner_members));
 
   ast::StructMemberList outer_members;
   outer_members.push_back(
-      create<ast::StructMember>("inner", &inner_struct, decos));
+      create<ast::StructMember>(Source{}, "inner", &inner_struct, decos));
 
   ast::type::Struct s_type("my_struct", create<ast::Struct>(outer_members));
 
@@ -852,18 +861,18 @@
 
   ast::StructMemberDecorationList decos;
 
-  auto* s = create<ast::Struct>(
-      ast::StructMemberList{create<ast::StructMember>("baz", &vec3, decos)});
+  auto* s = create<ast::Struct>(ast::StructMemberList{
+      create<ast::StructMember>(Source{}, "baz", &vec3, decos)});
   ast::type::Struct c_type("C", s);
 
-  s = create<ast::Struct>(
-      ast::StructMemberList{create<ast::StructMember>("bar", &c_type, decos)});
+  s = create<ast::Struct>(ast::StructMemberList{
+      create<ast::StructMember>(Source{}, "bar", &c_type, decos)});
   ast::type::Struct b_type("B", s);
 
   ast::type::Array b_ary_type(&b_type, 3, ast::ArrayDecorationList{});
 
   s = create<ast::Struct>(ast::StructMemberList{
-      create<ast::StructMember>("foo", &b_ary_type, decos)});
+      create<ast::StructMember>(Source{}, "foo", &b_ary_type, decos)});
   ast::type::Struct a_type("A", s);
 
   ast::type::Array a_ary_type(&a_type, 2, ast::ArrayDecorationList{});
diff --git a/src/writer/spirv/builder_assign_test.cc b/src/writer/spirv/builder_assign_test.cc
index 96fe75e..c13f530 100644
--- a/src/writer/spirv/builder_assign_test.cc
+++ b/src/writer/spirv/builder_assign_test.cc
@@ -231,8 +231,8 @@
 
   ast::StructMemberDecorationList decos;
   ast::StructMemberList members;
-  members.push_back(create<ast::StructMember>("a", &f32, decos));
-  members.push_back(create<ast::StructMember>("b", &f32, decos));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &f32, decos));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, decos));
 
   auto* s = create<ast::Struct>(members);
   ast::type::Struct s_type("my_struct", s);
diff --git a/src/writer/spirv/builder_constructor_expression_test.cc b/src/writer/spirv/builder_constructor_expression_test.cc
index 2b1fdef..778d842 100644
--- a/src/writer/spirv/builder_constructor_expression_test.cc
+++ b/src/writer/spirv/builder_constructor_expression_test.cc
@@ -943,8 +943,8 @@
 TEST_F(SpvBuilderConstructorTest, Type_Struct) {
   ast::StructMemberDecorationList decos;
   auto* s = create<ast::Struct>(ast::StructMemberList{
-      create<ast::StructMember>("a", ty.f32, decos),
-      create<ast::StructMember>("b", ty.vec3<f32>(), decos),
+      create<ast::StructMember>(Source{}, "a", ty.f32, decos),
+      create<ast::StructMember>(Source{}, "b", ty.vec3<f32>(), decos),
   });
   ast::type::Struct s_type("my_struct", s);
 
@@ -1080,7 +1080,7 @@
 TEST_F(SpvBuilderConstructorTest, Type_ZeroInit_Struct) {
   ast::StructMemberDecorationList decos;
   auto* s = create<ast::Struct>(ast::StructMemberList{
-      create<ast::StructMember>("a", ty.f32, decos),
+      create<ast::StructMember>(Source{}, "a", ty.f32, decos),
   });
   ast::type::Struct s_type("my_struct", s);
 
@@ -1492,8 +1492,8 @@
 TEST_F(SpvBuilderConstructorTest, IsConstructorConst_Struct) {
   ast::StructMemberDecorationList decos;
   auto* s = create<ast::Struct>(ast::StructMemberList{
-      create<ast::StructMember>("a", ty.f32, decos),
-      create<ast::StructMember>("b", ty.vec3<f32>(), decos),
+      create<ast::StructMember>(Source{}, "a", ty.f32, decos),
+      create<ast::StructMember>(Source{}, "b", ty.vec3<f32>(), decos),
   });
   ast::type::Struct s_type("my_struct", s);
 
@@ -1509,8 +1509,8 @@
        IsConstructorConst_Struct_WithIdentSubExpression) {
   ast::StructMemberDecorationList decos;
   auto* s = create<ast::Struct>(ast::StructMemberList{
-      create<ast::StructMember>("a", ty.f32, decos),
-      create<ast::StructMember>("b", ty.vec3<f32>(), decos),
+      create<ast::StructMember>(Source{}, "a", ty.f32, decos),
+      create<ast::StructMember>(Source{}, "b", ty.vec3<f32>(), decos),
   });
 
   ast::type::Struct s_type("my_struct", s);
diff --git a/src/writer/spirv/builder_function_test.cc b/src/writer/spirv/builder_function_test.cc
index e0024d4..dd6024c 100644
--- a/src/writer/spirv/builder_function_test.cc
+++ b/src/writer/spirv/builder_function_test.cc
@@ -264,7 +264,7 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("d", &f32, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "d", &f32, a_deco));
 
   ast::StructDecorationList s_decos;
   s_decos.push_back(create<ast::StructBlockDecoration>(Source{}));
diff --git a/src/writer/spirv/builder_global_variable_test.cc b/src/writer/spirv/builder_global_variable_test.cc
index 126b535..1ca89f9 100644
--- a/src/writer/spirv/builder_global_variable_test.cc
+++ b/src/writer/spirv/builder_global_variable_test.cc
@@ -530,8 +530,8 @@
 
   ast::StructMemberDecorationList decos;
   ast::StructMemberList members;
-  members.push_back(create<ast::StructMember>("a", &i32, decos));
-  members.push_back(create<ast::StructMember>("b", &i32, decos));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &i32, decos));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &i32, decos));
 
   ast::type::Struct A("A", create<ast::Struct>(members));
   ast::type::AccessControl ac{ast::AccessControl::kReadOnly, &A};
@@ -567,7 +567,7 @@
 
   ast::StructMemberDecorationList decos;
   ast::StructMemberList members;
-  members.push_back(create<ast::StructMember>("a", &i32, decos));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &i32, decos));
 
   ast::type::Struct A("A", create<ast::Struct>(members));
   ast::type::Alias B(mod->RegisterSymbol("B"), "B", &A);
@@ -602,7 +602,7 @@
 
   ast::StructMemberDecorationList decos;
   ast::StructMemberList members;
-  members.push_back(create<ast::StructMember>("a", &i32, decos));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &i32, decos));
 
   ast::type::Struct A("A", create<ast::Struct>(members));
   ast::type::AccessControl ac{ast::AccessControl::kReadOnly, &A};
@@ -637,7 +637,7 @@
 
   ast::StructMemberDecorationList decos;
   ast::StructMemberList members;
-  members.push_back(create<ast::StructMember>("a", &i32, decos));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &i32, decos));
 
   ast::type::Struct A("A", create<ast::Struct>(members));
   ast::type::AccessControl read{ast::AccessControl::kReadOnly, &A};
diff --git a/src/writer/spirv/builder_intrinsic_test.cc b/src/writer/spirv/builder_intrinsic_test.cc
index 8de99f1..e353ffc 100644
--- a/src/writer/spirv/builder_intrinsic_test.cc
+++ b/src/writer/spirv/builder_intrinsic_test.cc
@@ -1308,7 +1308,8 @@
 TEST_F(IntrinsicBuilderTest, Call_ArrayLength) {
   ast::StructMemberDecorationList decos;
   ast::StructMemberList members;
-  members.push_back(create<ast::StructMember>("a", ty.array<f32>(), decos));
+  members.push_back(
+      create<ast::StructMember>(Source{}, "a", ty.array<f32>(), decos));
 
   auto* s = create<ast::Struct>(members);
   ast::type::Struct s_type("my_struct", s);
@@ -1348,8 +1349,9 @@
 TEST_F(IntrinsicBuilderTest, Call_ArrayLength_OtherMembersInStruct) {
   ast::StructMemberDecorationList decos;
   ast::StructMemberList members;
-  members.push_back(create<ast::StructMember>("z", ty.f32, decos));
-  members.push_back(create<ast::StructMember>("a", ty.array<f32>(), decos));
+  members.push_back(create<ast::StructMember>(Source{}, "z", ty.f32, decos));
+  members.push_back(
+      create<ast::StructMember>(Source{}, "a", ty.array<f32>(), decos));
 
   auto* s = create<ast::Struct>(members);
   ast::type::Struct s_type("my_struct", s);
@@ -1391,8 +1393,9 @@
 
   ast::StructMemberDecorationList decos;
   ast::StructMemberList members;
-  members.push_back(create<ast::StructMember>("z", ty.f32, decos));
-  members.push_back(create<ast::StructMember>("a", ty.array<f32>(), decos));
+  members.push_back(create<ast::StructMember>(Source{}, "z", ty.f32, decos));
+  members.push_back(
+      create<ast::StructMember>(Source{}, "a", ty.array<f32>(), decos));
 
   auto* s = create<ast::Struct>(members);
   ast::type::Struct s_type("my_struct", s);
diff --git a/src/writer/spirv/builder_type_test.cc b/src/writer/spirv/builder_type_test.cc
index dc37373..77457b6 100644
--- a/src/writer/spirv/builder_type_test.cc
+++ b/src/writer/spirv/builder_type_test.cc
@@ -297,7 +297,7 @@
 
   ast::StructMemberDecorationList decos;
   ast::StructMemberList members;
-  members.push_back(create<ast::StructMember>("a", &f32, decos));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &f32, decos));
 
   auto* s = create<ast::Struct>(members);
   ast::type::Struct s_type("my_struct", s);
@@ -319,7 +319,7 @@
 
   ast::StructMemberDecorationList decos;
   ast::StructMemberList members;
-  members.push_back(create<ast::StructMember>("a", &f32, decos));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &f32, decos));
 
   ast::StructDecorationList struct_decos;
   struct_decos.push_back(create<ast::StructBlockDecoration>(Source{}));
@@ -350,8 +350,8 @@
   b_decos.push_back(create<ast::StructMemberOffsetDecoration>(8, Source{}));
 
   ast::StructMemberList members;
-  members.push_back(create<ast::StructMember>("a", &f32, a_decos));
-  members.push_back(create<ast::StructMember>("b", &f32, b_decos));
+  members.push_back(create<ast::StructMember>(Source{}, "a", &f32, a_decos));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_decos));
 
   auto* s = create<ast::Struct>(members);
   ast::type::Struct s_type("S", s);
@@ -383,9 +383,12 @@
   ast::StructMemberDecorationList empty_b;
   ast::StructMemberDecorationList empty_c;
   ast::StructMemberList members;
-  members.push_back(create<ast::StructMember>("a", &glsl_mat2x2, empty_a));
-  members.push_back(create<ast::StructMember>("b", &glsl_mat2x3, empty_b));
-  members.push_back(create<ast::StructMember>("c", &glsl_mat4x4, empty_c));
+  members.push_back(
+      create<ast::StructMember>(Source{}, "a", &glsl_mat2x2, empty_a));
+  members.push_back(
+      create<ast::StructMember>(Source{}, "b", &glsl_mat2x3, empty_b));
+  members.push_back(
+      create<ast::StructMember>(Source{}, "c", &glsl_mat4x4, empty_c));
 
   auto* s = create<ast::Struct>(members);
   ast::type::Struct s_type("S", s);
@@ -426,9 +429,12 @@
   c_decos.push_back(create<ast::StructMemberOffsetDecoration>(48, Source{}));
 
   ast::StructMemberList members;
-  members.push_back(create<ast::StructMember>("a", &glsl_mat2x2, a_decos));
-  members.push_back(create<ast::StructMember>("b", &glsl_mat2x3, b_decos));
-  members.push_back(create<ast::StructMember>("c", &glsl_mat4x4, c_decos));
+  members.push_back(
+      create<ast::StructMember>(Source{}, "a", &glsl_mat2x2, a_decos));
+  members.push_back(
+      create<ast::StructMember>(Source{}, "b", &glsl_mat2x3, b_decos));
+  members.push_back(
+      create<ast::StructMember>(Source{}, "c", &glsl_mat4x4, c_decos));
 
   auto* s = create<ast::Struct>(members);
   ast::type::Struct s_type("S", s);
@@ -490,9 +496,12 @@
   c_decos.push_back(create<ast::StructMemberOffsetDecoration>(48, Source{}));
 
   ast::StructMemberList members;
-  members.push_back(create<ast::StructMember>("a", &glsl_mat2x2, a_decos));
-  members.push_back(create<ast::StructMember>("b", &glsl_mat2x3, b_decos));
-  members.push_back(create<ast::StructMember>("c", &glsl_mat4x4, c_decos));
+  members.push_back(
+      create<ast::StructMember>(Source{}, "a", &glsl_mat2x2, a_decos));
+  members.push_back(
+      create<ast::StructMember>(Source{}, "b", &glsl_mat2x3, b_decos));
+  members.push_back(
+      create<ast::StructMember>(Source{}, "c", &glsl_mat4x4, c_decos));
 
   auto* s = create<ast::Struct>(members);
   ast::type::Struct s_type("S", s);
diff --git a/src/writer/wgsl/generator_impl_alias_type_test.cc b/src/writer/wgsl/generator_impl_alias_type_test.cc
index cd09f54..4602ac9 100644
--- a/src/writer/wgsl/generator_impl_alias_type_test.cc
+++ b/src/writer/wgsl/generator_impl_alias_type_test.cc
@@ -44,12 +44,12 @@
   ast::type::F32 f32;
 
   ast::StructMemberList members;
-  members.push_back(
-      create<ast::StructMember>("a", &f32, ast::StructMemberDecorationList{}));
+  members.push_back(create<ast::StructMember>(
+      Source{}, "a", &f32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &i32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &i32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -72,12 +72,12 @@
   ast::type::F32 f32;
 
   ast::StructMemberList members;
-  members.push_back(
-      create<ast::StructMember>("a", &f32, ast::StructMemberDecorationList{}));
+  members.push_back(create<ast::StructMember>(
+      Source{}, "a", &f32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &i32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &i32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
diff --git a/src/writer/wgsl/generator_impl_function_test.cc b/src/writer/wgsl/generator_impl_function_test.cc
index 41263ba..65d5a8f 100644
--- a/src/writer/wgsl/generator_impl_function_test.cc
+++ b/src/writer/wgsl/generator_impl_function_test.cc
@@ -193,7 +193,7 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList a_deco;
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
-  members.push_back(create<ast::StructMember>("d", &f32, a_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "d", &f32, a_deco));
 
   ast::StructDecorationList s_decos;
   s_decos.push_back(create<ast::StructBlockDecoration>(Source{}));
diff --git a/src/writer/wgsl/generator_impl_type_test.cc b/src/writer/wgsl/generator_impl_type_test.cc
index 71937e3..aa70ad8 100644
--- a/src/writer/wgsl/generator_impl_type_test.cc
+++ b/src/writer/wgsl/generator_impl_type_test.cc
@@ -66,7 +66,7 @@
 TEST_F(WgslGeneratorImplTest, EmitType_AccessControl_Read) {
   ast::type::I32 i32;
 
-  ast::StructMember mem("a", &i32, ast::StructMemberDecorationList{});
+  ast::StructMember mem(Source{}, "a", &i32, ast::StructMemberDecorationList{});
   ast::StructMemberList members;
   members.push_back(&mem);
 
@@ -86,7 +86,7 @@
 TEST_F(WgslGeneratorImplTest, EmitType_AccessControl_ReadWrite) {
   ast::type::I32 i32;
 
-  ast::StructMember mem("a", &i32, ast::StructMemberDecorationList{});
+  ast::StructMember mem(Source{}, "a", &i32, ast::StructMemberDecorationList{});
   ast::StructMemberList members;
   members.push_back(&mem);
 
@@ -176,12 +176,12 @@
   ast::type::F32 f32;
 
   ast::StructMemberList members;
-  members.push_back(
-      create<ast::StructMember>("a", &i32, ast::StructMemberDecorationList{}));
+  members.push_back(create<ast::StructMember>(
+      Source{}, "a", &i32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &f32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -196,12 +196,12 @@
   ast::type::F32 f32;
 
   ast::StructMemberList members;
-  members.push_back(
-      create<ast::StructMember>("a", &i32, ast::StructMemberDecorationList{}));
+  members.push_back(create<ast::StructMember>(
+      Source{}, "a", &i32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &f32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   auto* str = create<ast::Struct>(members);
 
@@ -221,12 +221,12 @@
   ast::type::F32 f32;
 
   ast::StructMemberList members;
-  members.push_back(
-      create<ast::StructMember>("a", &i32, ast::StructMemberDecorationList{}));
+  members.push_back(create<ast::StructMember>(
+      Source{}, "a", &i32, ast::StructMemberDecorationList{}));
 
   ast::StructMemberDecorationList b_deco;
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
-  members.push_back(create<ast::StructMember>("b", &f32, b_deco));
+  members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
   ast::StructDecorationList decos;
   decos.push_back(create<ast::StructBlockDecoration>(Source{}));