ast: Remove Struct constructors that don't take a Source

And swap the `decorations` and `members` parameters, as decorations come last for other constructors.

Parsers need fixing up.

Bug: tint:396
Bug: tint:390
Change-Id: Ie9b814c1de24b6c987f0fbb9e6f92da7c352caa2
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/35163
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/ast/struct.cc b/src/ast/struct.cc
index a214209..452a93c 100644
--- a/src/ast/struct.cc
+++ b/src/ast/struct.cc
@@ -23,23 +23,12 @@
 namespace tint {
 namespace ast {
 
-Struct::Struct(StructMemberList members)
-    : Base(), members_(std::move(members)) {}
-
-Struct::Struct(StructDecorationList decorations, StructMemberList members)
-    : Base(),
-      decorations_(std::move(decorations)),
-      members_(std::move(members)) {}
-
-Struct::Struct(const Source& source, StructMemberList members)
-    : Base(source), members_(std::move(members)) {}
-
 Struct::Struct(const Source& source,
-               StructDecorationList decorations,
-               StructMemberList members)
+               StructMemberList members,
+               StructDecorationList decorations)
     : Base(source),
-      decorations_(std::move(decorations)),
-      members_(std::move(members)) {}
+      members_(std::move(members)),
+      decorations_(std::move(decorations)) {}
 
 Struct::Struct(Struct&&) = default;
 
@@ -64,8 +53,8 @@
 }
 
 Struct* Struct::Clone(CloneContext* ctx) const {
-  return ctx->mod->create<Struct>(
-      ctx->Clone(source()), ctx->Clone(decorations_), ctx->Clone(members_));
+  return ctx->mod->create<Struct>(ctx->Clone(source()), ctx->Clone(members_),
+                                  ctx->Clone(decorations_));
 }
 
 bool Struct::IsValid() const {
diff --git a/src/ast/struct.h b/src/ast/struct.h
index f9f29ab..36e78ba 100644
--- a/src/ast/struct.h
+++ b/src/ast/struct.h
@@ -30,23 +30,12 @@
 class Struct : public Castable<Struct, Node> {
  public:
   /// Create a new struct statement
-  /// @param members The struct members
-  explicit Struct(StructMemberList members);
-  /// Create a new struct statement
-  /// @param decorations The struct decorations
-  /// @param members The struct members
-  Struct(StructDecorationList decorations, StructMemberList members);
-  /// Create a new struct statement
   /// @param source The input source for the import statement
   /// @param members The struct members
-  Struct(const Source& source, StructMemberList members);
-  /// Create a new struct statement
-  /// @param source The input source for the import statement
   /// @param decorations The struct decorations
-  /// @param members The struct members
   Struct(const Source& source,
-         StructDecorationList decorations,
-         StructMemberList members);
+         StructMemberList members,
+         StructDecorationList decorations);
   /// Move constructor
   Struct(Struct&&);
 
@@ -85,8 +74,8 @@
  private:
   Struct(const Struct&) = delete;
 
-  StructDecorationList decorations_;
   StructMemberList members_;
+  StructDecorationList decorations_;
 };
 
 }  // namespace ast
diff --git a/src/ast/struct_test.cc b/src/ast/struct_test.cc
index b8f7234..5f0f1f0 100644
--- a/src/ast/struct_test.cc
+++ b/src/ast/struct_test.cc
@@ -35,7 +35,7 @@
   members.push_back(
       create<StructMember>(Source{}, "a", &i32, StructMemberDecorationList()));
 
-  Struct s{members};
+  Struct s{Source{}, members, ast::StructDecorationList{}};
   EXPECT_EQ(s.members().size(), 1u);
   EXPECT_TRUE(s.decorations().empty());
   EXPECT_EQ(s.source().range.begin.line, 0u);
@@ -54,7 +54,7 @@
   StructDecorationList decos;
   decos.push_back(create<StructBlockDecoration>(Source{}));
 
-  Struct s{decos, members};
+  Struct s{Source{}, members, decos};
   EXPECT_EQ(s.members().size(), 1u);
   ASSERT_EQ(s.decorations().size(), 1u);
   EXPECT_TRUE(s.decorations()[0]->Is<StructBlockDecoration>());
@@ -76,7 +76,7 @@
 
   Struct s{
       Source{Source::Range{Source::Location{27, 4}, Source::Location{27, 8}}},
-      decos, members};
+      members, decos};
   EXPECT_EQ(s.members().size(), 1u);
   ASSERT_EQ(s.decorations().size(), 1u);
   EXPECT_TRUE(s.decorations()[0]->Is<StructBlockDecoration>());
@@ -87,7 +87,7 @@
 }
 
 TEST_F(StructTest, IsValid) {
-  Struct s({});
+  Struct s(Source{}, StructMemberList{}, StructDecorationList{});
   EXPECT_TRUE(s.IsValid());
 }
 
@@ -99,7 +99,7 @@
       create<StructMember>(Source{}, "a", &i32, StructMemberDecorationList()));
   members.push_back(nullptr);
 
-  Struct s{members};
+  Struct s{Source{}, members, ast::StructDecorationList{}};
   EXPECT_FALSE(s.IsValid());
 }
 
@@ -110,7 +110,7 @@
   members.push_back(
       create<StructMember>(Source{}, "", &i32, StructMemberDecorationList()));
 
-  Struct s{members};
+  Struct s{Source{}, members, ast::StructDecorationList{}};
   EXPECT_FALSE(s.IsValid());
 }
 
@@ -124,7 +124,7 @@
   StructDecorationList decos;
   decos.push_back(create<StructBlockDecoration>(Source{}));
 
-  Struct s{decos, members};
+  Struct s{Source{}, members, decos};
 
   std::ostringstream out;
   s.to_str(out, 2);
diff --git a/src/ast/type/access_control_type_test.cc b/src/ast/type/access_control_type_test.cc
index a7bc2aa..04ba748 100644
--- a/src/ast/type/access_control_type_test.cc
+++ b/src/ast/type/access_control_type_test.cc
@@ -134,7 +134,7 @@
 
   StructDecorationList decos;
 
-  auto* str = create<ast::Struct>(decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, decos);
   Struct struct_type("struct_type", str);
   AccessControl at{ast::AccessControl::kReadOnly, &struct_type};
   EXPECT_EQ(16u, at.MinBufferBindingSize(MemoryLayout::kUniformBuffer));
@@ -179,7 +179,7 @@
   }
   StructDecorationList decos;
 
-  auto* str = create<ast::Struct>(decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, decos);
   Struct struct_type("struct_type", str);
   AccessControl at{ast::AccessControl::kReadOnly, &struct_type};
   EXPECT_EQ(16u, at.BaseAlignment(MemoryLayout::kUniformBuffer));
diff --git a/src/ast/type/alias_type_test.cc b/src/ast/type/alias_type_test.cc
index c54fea7..638716b 100644
--- a/src/ast/type/alias_type_test.cc
+++ b/src/ast/type/alias_type_test.cc
@@ -207,7 +207,7 @@
   }
   StructDecorationList decos;
 
-  auto* str = create<ast::Struct>(decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, decos);
   Struct struct_type("struct_type", str);
   Alias alias{mod.RegisterSymbol("alias"), "alias", &struct_type};
   EXPECT_EQ(16u, alias.MinBufferBindingSize(MemoryLayout::kUniformBuffer));
@@ -256,7 +256,7 @@
   }
   StructDecorationList decos;
 
-  auto* str = create<ast::Struct>(decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, decos);
   Struct struct_type("struct_type", str);
   Alias alias{mod.RegisterSymbol("alias"), "alias", &struct_type};
   EXPECT_EQ(16u, alias.BaseAlignment(MemoryLayout::kUniformBuffer));
diff --git a/src/ast/type/struct_type_test.cc b/src/ast/type/struct_type_test.cc
index 37e1e97..b90d0ac 100644
--- a/src/ast/type/struct_type_test.cc
+++ b/src/ast/type/struct_type_test.cc
@@ -41,7 +41,8 @@
 
 TEST_F(StructTest, Creation) {
   StructMemberList members;
-  auto* impl = create<ast::Struct>(members);
+  auto* impl =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
   auto* ptr = impl;
   Struct s{"S", impl};
   EXPECT_EQ(s.impl(), ptr);
@@ -49,7 +50,8 @@
 
 TEST_F(StructTest, Is) {
   StructMemberList members;
-  auto* impl = create<ast::Struct>(members);
+  auto* impl =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
   Struct s{"S", impl};
   Type* ty = &s;
   EXPECT_FALSE(ty->Is<AccessControl>());
@@ -69,7 +71,8 @@
 
 TEST_F(StructTest, TypeName) {
   StructMemberList members;
-  auto* impl = create<ast::Struct>(members);
+  auto* impl =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
   Struct s{"my_struct", impl};
   EXPECT_EQ(s.type_name(), "__struct_my_struct");
 }
@@ -90,7 +93,7 @@
   }
   StructDecorationList decos;
 
-  auto* str = create<ast::Struct>(decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, decos);
   Struct struct_type("struct_type", str);
   EXPECT_EQ(16u,
             struct_type.MinBufferBindingSize(MemoryLayout::kUniformBuffer));
@@ -120,7 +123,7 @@
   }
   StructDecorationList decos;
 
-  auto* str = create<ast::Struct>(decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, decos);
   Struct struct_type("struct_type", str);
   EXPECT_EQ(32u,
             struct_type.MinBufferBindingSize(MemoryLayout::kUniformBuffer));
@@ -151,7 +154,7 @@
   }
   StructDecorationList decos;
 
-  auto* str = create<ast::Struct>(decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, decos);
   Struct struct_type("struct_type", str);
   EXPECT_EQ(12u,
             struct_type.MinBufferBindingSize(MemoryLayout::kStorageBuffer));
@@ -169,7 +172,7 @@
   }
   StructDecorationList decos;
 
-  auto* str = create<ast::Struct>(decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, decos);
   Struct struct_type("struct_type", str);
   EXPECT_EQ(16u,
             struct_type.MinBufferBindingSize(MemoryLayout::kUniformBuffer));
@@ -188,7 +191,7 @@
   }
   StructDecorationList decos;
 
-  auto* str = create<ast::Struct>(decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, decos);
   Struct struct_type("struct_type", str);
   EXPECT_EQ(16u,
             struct_type.MinBufferBindingSize(MemoryLayout::kUniformBuffer));
@@ -208,7 +211,7 @@
   }
   StructDecorationList decos;
 
-  auto* str = create<ast::Struct>(decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, decos);
   Struct struct_type("struct_type", str);
   EXPECT_EQ(16u,
             struct_type.MinBufferBindingSize(MemoryLayout::kUniformBuffer));
@@ -232,7 +235,7 @@
   }
   StructDecorationList decos;
 
-  auto* str = create<ast::Struct>(decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, decos);
   Struct struct_type("struct_type", str);
   EXPECT_EQ(16u, struct_type.BaseAlignment(MemoryLayout::kUniformBuffer));
   EXPECT_EQ(4u, struct_type.BaseAlignment(MemoryLayout::kStorageBuffer));
@@ -261,7 +264,7 @@
   }
   StructDecorationList decos;
 
-  auto* str = create<ast::Struct>(decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, decos);
   Struct struct_type("struct_type", str);
   EXPECT_EQ(16u, struct_type.BaseAlignment(MemoryLayout::kUniformBuffer));
   EXPECT_EQ(4u, struct_type.BaseAlignment(MemoryLayout::kStorageBuffer));
@@ -290,7 +293,7 @@
   }
   StructDecorationList decos;
 
-  auto* str = create<ast::Struct>(decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, decos);
   Struct struct_type("struct_type", str);
   EXPECT_EQ(4u, struct_type.BaseAlignment(MemoryLayout::kStorageBuffer));
 }
@@ -307,7 +310,7 @@
   }
   StructDecorationList decos;
 
-  auto* str = create<ast::Struct>(decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, decos);
   Struct struct_type("struct_type", str);
   EXPECT_EQ(16u, struct_type.BaseAlignment(MemoryLayout::kUniformBuffer));
   EXPECT_EQ(8u, struct_type.BaseAlignment(MemoryLayout::kStorageBuffer));
@@ -325,7 +328,7 @@
   }
   StructDecorationList decos;
 
-  auto* str = create<ast::Struct>(decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, decos);
   Struct struct_type("struct_type", str);
   EXPECT_EQ(16u, struct_type.BaseAlignment(MemoryLayout::kUniformBuffer));
   EXPECT_EQ(16u, struct_type.BaseAlignment(MemoryLayout::kStorageBuffer));
@@ -343,7 +346,7 @@
   }
   StructDecorationList decos;
 
-  auto* str = create<ast::Struct>(decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, decos);
   Struct struct_type("struct_type", str);
   EXPECT_EQ(16u, struct_type.BaseAlignment(MemoryLayout::kUniformBuffer));
   EXPECT_EQ(16u, struct_type.BaseAlignment(MemoryLayout::kStorageBuffer));
diff --git a/src/inspector/inspector_test.cc b/src/inspector/inspector_test.cc
index d638381..99250af 100644
--- a/src/inspector/inspector_test.cc
+++ b/src/inspector/inspector_test.cc
@@ -308,7 +308,7 @@
       decos.push_back(create<ast::StructBlockDecoration>(Source{}));
     }
 
-    auto* str = create<ast::Struct>(decos, members);
+    auto* str = create<ast::Struct>(Source{}, members, decos);
 
     return std::make_unique<ast::type::Struct>(name, str);
   }
@@ -1454,7 +1454,7 @@
 
   ast::StructDecorationList decos;
 
-  auto* str = create<ast::Struct>(decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, decos);
   auto foo_type = std::make_unique<ast::type::Struct>("foo_type", str);
 
   AddUniformBuffer("foo_ub", foo_type.get(), 0, 0);
diff --git a/src/reader/spirv/parser_impl.cc b/src/reader/spirv/parser_impl.cc
index 723f8d3..9cabd3e 100644
--- a/src/reader/spirv/parser_impl.cc
+++ b/src/reader/spirv/parser_impl.cc
@@ -947,8 +947,8 @@
   }
 
   // Now make the struct.
-  auto* ast_struct = create<ast::Struct>(std::move(ast_struct_decorations),
-                                         std::move(ast_members));
+  auto* ast_struct = create<ast::Struct>(Source{}, std::move(ast_members),
+                                         std::move(ast_struct_decorations));
 
   namer_.SuggestSanitizedName(type_id, "S");
 
diff --git a/src/reader/wgsl/parser_impl.cc b/src/reader/wgsl/parser_impl.cc
index 65fb63a..d6270cc 100644
--- a/src/reader/wgsl/parser_impl.cc
+++ b/src/reader/wgsl/parser_impl.cc
@@ -1192,8 +1192,8 @@
     return Failure::kErrored;
 
   return std::make_unique<ast::type::Struct>(
-      name.value, create<ast::Struct>(source, std::move(struct_decos.value),
-                                      std::move(body.value)));
+      name.value, create<ast::Struct>(source, std::move(body.value),
+                                      std::move(struct_decos.value)));
 }
 
 // struct_body_decl
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 9fcabfc..e971c60 100644
--- a/src/reader/wgsl/parser_impl_variable_ident_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_variable_ident_decl_test.cc
@@ -93,7 +93,7 @@
   ast::StructDecorationList decos;
   decos.push_back(&block_deco);
 
-  ast::Struct str(decos, members);
+  ast::Struct str(Source{}, members, decos);
   ast::type::Struct s("S", &str);
 
   auto p = parser("my_var : [[access(read)]] S");
@@ -119,7 +119,7 @@
   ast::StructDecorationList decos;
   decos.push_back(&block_deco);
 
-  ast::Struct str(decos, members);
+  ast::Struct str(Source{}, members, decos);
   ast::type::Struct s("S", &str);
 
   auto p = parser("my_var : [[access(read_write)]] S");
@@ -145,7 +145,7 @@
   ast::StructDecorationList decos;
   decos.push_back(&block_deco);
 
-  ast::Struct str(decos, members);
+  ast::Struct str(Source{}, members, decos);
   ast::type::Struct s("S", &str);
 
   auto p = parser("my_var : [[access(read), access(read_write)]] S");
@@ -168,7 +168,7 @@
   ast::StructDecorationList decos;
   decos.push_back(&block_deco);
 
-  ast::Struct str(decos, members);
+  ast::Struct str(Source{}, members, decos);
   ast::type::Struct s("S", &str);
 
   auto p = parser("my_var : [[access(read)]][[access(read_write)]] S");
@@ -207,7 +207,7 @@
   ast::StructDecorationList decos;
   decos.push_back(&block_deco);
 
-  ast::Struct str(decos, members);
+  ast::Struct str(Source{}, members, decos);
   ast::type::Struct s("S", &str);
 
   auto p = parser("my_var : [[stride(1)]] S");
diff --git a/src/transform/first_index_offset.cc b/src/transform/first_index_offset.cc
index 2dbaf93..45273b0 100644
--- a/src/transform/first_index_offset.cc
+++ b/src/transform/first_index_offset.cc
@@ -225,7 +225,7 @@
 
   auto* struct_type = mod->create<ast::type::Struct>(
       kStructName,
-      mod->create<ast::Struct>(std::move(decos), std::move(members)));
+      mod->create<ast::Struct>(Source{}, std::move(members), std::move(decos)));
 
   auto* idx_var = mod->create<ast::Variable>(
       Source{},                     // source
diff --git a/src/transform/vertex_pulling.cc b/src/transform/vertex_pulling.cc
index 0c9d1a0..cf4ec6f 100644
--- a/src/transform/vertex_pulling.cc
+++ b/src/transform/vertex_pulling.cc
@@ -265,7 +265,7 @@
 
   auto* struct_type = mod->create<ast::type::Struct>(
       kStructName,
-      mod->create<ast::Struct>(std::move(decos), std::move(members)));
+      mod->create<ast::Struct>(Source{}, std::move(members), std::move(decos)));
 
   for (uint32_t i = 0; i < cfg.vertex_state.size(); ++i) {
     // The decorated variable with struct type
diff --git a/src/type_determiner_test.cc b/src/type_determiner_test.cc
index ed65b87..5f317dc 100644
--- a/src/type_determiner_test.cc
+++ b/src/type_determiner_test.cc
@@ -1215,7 +1215,8 @@
   members.push_back(
       create<ast::StructMember>(Source{}, "second_member", &f32, decos));
 
-  auto* strct = create<ast::Struct>(members);
+  auto* strct =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct st("S", strct);
 
@@ -1258,7 +1259,8 @@
   members.push_back(
       create<ast::StructMember>(Source{}, "second_member", &f32, decos));
 
-  auto* strct = create<ast::Struct>(members);
+  auto* strct =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   auto st = std::make_unique<ast::type::Struct>("alias", strct);
   ast::type::Alias alias(mod->RegisterSymbol("alias"), "alias", st.get());
@@ -1387,7 +1389,8 @@
   ast::StructMemberList b_members;
   b_members.push_back(create<ast::StructMember>(Source{}, "foo", &vec4, decos));
 
-  auto* strctB = create<ast::Struct>(b_members);
+  auto* strctB =
+      create<ast::Struct>(Source{}, b_members, ast::StructDecorationList{});
   ast::type::Struct stB("B", strctB);
 
   ast::type::Vector vecB(&stB, 3);
@@ -1395,7 +1398,8 @@
   ast::StructMemberList a_members;
   a_members.push_back(create<ast::StructMember>(Source{}, "mem", &vecB, decos));
 
-  auto* strctA = create<ast::Struct>(a_members);
+  auto* strctA =
+      create<ast::Struct>(Source{}, a_members, ast::StructDecorationList{});
 
   ast::type::Struct stA("A", strctA);
 
diff --git a/src/validator/validator_type_test.cc b/src/validator/validator_type_test.cc
index 96eb8e8..aec9695 100644
--- a/src/validator/validator_type_test.cc
+++ b/src/validator/validator_type_test.cc
@@ -56,7 +56,7 @@
   }
   ast::StructDecorationList decos;
   decos.push_back(create<ast::StructBlockDecoration>(Source{}));
-  auto* st = create<ast::Struct>(decos, members);
+  auto* st = create<ast::Struct>(Source{}, members, decos);
   ast::type::Struct struct_type("Foo", st);
 
   mod()->AddConstructedType(&struct_type);
@@ -82,7 +82,7 @@
         Source{Source::Location{12, 34}}, "rt", &arr, deco));
   }
   ast::StructDecorationList decos;
-  auto* st = create<ast::Struct>(decos, members);
+  auto* st = create<ast::Struct>(Source{}, members, decos);
   ast::type::Struct struct_type("Foo", st);
 
   mod()->AddConstructedType(&struct_type);
@@ -113,7 +113,7 @@
   }
   ast::StructDecorationList decos;
   decos.push_back(create<ast::StructBlockDecoration>(Source{}));
-  auto* st = create<ast::Struct>(decos, members);
+  auto* st = create<ast::Struct>(Source{}, members, decos);
   ast::type::Struct struct_type("Foo", st);
 
   mod()->AddConstructedType(&struct_type);
@@ -148,7 +148,7 @@
 
   ast::StructDecorationList decos;
   decos.push_back(create<ast::StructBlockDecoration>(Source{}));
-  auto* st = create<ast::Struct>(decos, members);
+  auto* st = create<ast::Struct>(Source{}, members, decos);
   ast::type::Struct struct_type("s", st);
   mod()->AddConstructedType(&struct_type);
   EXPECT_FALSE(v()->ValidateConstructedTypes(mod()->constructed_types()));
@@ -181,7 +181,7 @@
   }
   ast::StructDecorationList decos;
   decos.push_back(create<ast::StructBlockDecoration>(Source{}));
-  auto* st = create<ast::Struct>(decos, members);
+  auto* st = create<ast::Struct>(Source{}, members, decos);
   ast::type::Struct struct_type("s", st);
   mod()->AddConstructedType(&struct_type);
   EXPECT_TRUE(v()->ValidateConstructedTypes(mod()->constructed_types()));
diff --git a/src/writer/hlsl/generator_impl_alias_type_test.cc b/src/writer/hlsl/generator_impl_alias_type_test.cc
index 57b9611..4b01f06 100644
--- a/src/writer/hlsl/generator_impl_alias_type_test.cc
+++ b/src/writer/hlsl/generator_impl_alias_type_test.cc
@@ -50,14 +50,17 @@
   ast::type::I32 i32;
   ast::type::F32 f32;
 
-  auto* str = create<ast::Struct>(ast::StructMemberList{
-      create<ast::StructMember>(Source{}, "a", &f32,
-                                ast::StructMemberDecorationList{}),
-      create<ast::StructMember>(
-          Source{}, "b", &i32,
-          ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(4, Source{})}),
-  });
+  auto* str = create<ast::Struct>(
+      Source{},
+      ast::StructMemberList{
+          create<ast::StructMember>(Source{}, "a", &f32,
+                                    ast::StructMemberDecorationList{}),
+          create<ast::StructMember>(
+              Source{}, "b", &i32,
+              ast::StructMemberDecorationList{
+                  create<ast::StructMemberOffsetDecoration>(4, Source{})}),
+      },
+      ast::StructDecorationList{});
 
   ast::type::Struct s("A", str);
   ast::type::Alias alias(mod.RegisterSymbol("B"), "B", &s);
diff --git a/src/writer/hlsl/generator_impl_function_test.cc b/src/writer/hlsl/generator_impl_function_test.cc
index 29541f0..68069fb 100644
--- a/src/writer/hlsl/generator_impl_function_test.cc
+++ b/src/writer/hlsl/generator_impl_function_test.cc
@@ -355,7 +355,8 @@
   members.push_back(create<ast::StructMember>(
       Source{}, "coord", &vec4, ast::StructMemberDecorationList{}));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("Uniforms", str);
 
@@ -439,7 +440,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("Data", str);
   ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s);
@@ -514,7 +516,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("Data", str);
   ast::type::AccessControl ac(ast::AccessControl::kReadOnly, &s);
@@ -589,7 +592,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("Data", str);
   ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s);
@@ -1365,7 +1369,7 @@
   ast::StructDecorationList s_decos;
   s_decos.push_back(create<ast::StructBlockDecoration>(Source{}));
 
-  auto* str = create<ast::Struct>(s_decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, s_decos);
 
   ast::type::Struct s("Data", str);
   ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s);
diff --git a/src/writer/hlsl/generator_impl_member_accessor_test.cc b/src/writer/hlsl/generator_impl_member_accessor_test.cc
index 47ac922..3f3cfcb 100644
--- a/src/writer/hlsl/generator_impl_member_accessor_test.cc
+++ b/src/writer/hlsl/generator_impl_member_accessor_test.cc
@@ -53,7 +53,8 @@
   deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "mem", &f32, deco));
 
-  auto* strct = create<ast::Struct>(members);
+  auto* strct =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("Str", strct);
 
@@ -104,7 +105,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("Data", str);
 
@@ -157,7 +159,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("Data", str);
 
@@ -204,16 +207,19 @@
   ast::type::I32 i32;
   ast::type::Matrix mat(&f32, 3, 2);
 
-  auto* str = create<ast::Struct>(ast::StructMemberList{
-      create<ast::StructMember>(
-          Source{}, "z", &i32,
-          ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(0, Source{})}),
-      create<ast::StructMember>(
-          Source{}, "a", &mat,
-          ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(4, Source{})}),
-  });
+  auto* str = create<ast::Struct>(
+      Source{},
+      ast::StructMemberList{
+          create<ast::StructMember>(
+              Source{}, "z", &i32,
+              ast::StructMemberDecorationList{
+                  create<ast::StructMemberOffsetDecoration>(0, Source{})}),
+          create<ast::StructMember>(
+              Source{}, "a", &mat,
+              ast::StructMemberDecorationList{
+                  create<ast::StructMemberOffsetDecoration>(4, Source{})}),
+      },
+      ast::StructDecorationList{});
 
   ast::type::Struct s("Data", str);
 
@@ -289,7 +295,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "a", &mat, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("Data", str);
 
@@ -353,7 +360,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "a", &mat, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("Data", str);
 
@@ -413,7 +421,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "a", &mat, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("Data", str);
 
@@ -465,7 +474,8 @@
   deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "a", &mat, deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("Data", str);
 
@@ -521,7 +531,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(16, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "a", &mat, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("Data", str);
 
@@ -581,7 +592,8 @@
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "a", &ary, a_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("Data", str);
 
@@ -637,7 +649,8 @@
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "a", &ary, a_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("Data", str);
 
@@ -703,7 +716,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("Data", str);
 
@@ -760,7 +774,8 @@
   a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "a", &ary, a_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("Data", str);
 
@@ -822,7 +837,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("Data", str);
 
@@ -882,7 +898,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(16, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &fvec3, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("Data", str);
 
@@ -938,7 +955,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(16, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &fvec3, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("Data", str);
 
@@ -1002,16 +1020,19 @@
   ast::type::Vector ivec3(&i32, 3);
   ast::type::Vector fvec3(&f32, 3);
 
-  auto* data_str = create<ast::Struct>(ast::StructMemberList{
-      create<ast::StructMember>(
-          Source{}, "a", &ivec3,
-          ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(0, Source{})}),
-      create<ast::StructMember>(
-          Source{}, "b", &fvec3,
-          ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(16, Source{})}),
-  });
+  auto* data_str = create<ast::Struct>(
+      Source{},
+      ast::StructMemberList{
+          create<ast::StructMember>(
+              Source{}, "a", &ivec3,
+              ast::StructMemberDecorationList{
+                  create<ast::StructMemberOffsetDecoration>(0, Source{})}),
+          create<ast::StructMember>(
+              Source{}, "b", &fvec3,
+              ast::StructMemberDecorationList{
+                  create<ast::StructMemberOffsetDecoration>(16, Source{})}),
+      },
+      ast::StructDecorationList{});
 
   ast::type::Struct data("Data", data_str);
 
@@ -1020,12 +1041,15 @@
                            create<ast::StrideDecoration>(32, Source{}),
                        });
 
-  auto* pre_str = create<ast::Struct>(ast::StructMemberList{
-      create<ast::StructMember>(
-          Source{}, "c", &ary,
-          ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(0, Source{})}),
-  });
+  auto* pre_str = create<ast::Struct>(
+      Source{},
+      ast::StructMemberList{
+          create<ast::StructMember>(
+              Source{}, "c", &ary,
+              ast::StructMemberDecorationList{
+                  create<ast::StructMemberOffsetDecoration>(0, Source{})}),
+      },
+      ast::StructDecorationList{});
 
   ast::type::Struct pre_struct("Pre", pre_str);
 
@@ -1087,16 +1111,19 @@
   ast::StructMemberList members;
   ast::StructMemberDecorationList deco;
 
-  auto* data_str = create<ast::Struct>(ast::StructMemberList{
-      create<ast::StructMember>(
-          Source{}, "a", &ivec3,
-          ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(0, Source{})}),
-      create<ast::StructMember>(
-          Source{}, "b", &fvec3,
-          ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(16, Source{})}),
-  });
+  auto* data_str = create<ast::Struct>(
+      Source{},
+      ast::StructMemberList{
+          create<ast::StructMember>(
+              Source{}, "a", &ivec3,
+              ast::StructMemberDecorationList{
+                  create<ast::StructMemberOffsetDecoration>(0, Source{})}),
+          create<ast::StructMember>(
+              Source{}, "b", &fvec3,
+              ast::StructMemberDecorationList{
+                  create<ast::StructMemberOffsetDecoration>(16, Source{})}),
+      },
+      ast::StructDecorationList{});
 
   ast::type::Struct data("Data", data_str);
 
@@ -1104,11 +1131,13 @@
       &data, 4,
       ast::ArrayDecorationList{create<ast::StrideDecoration>(32, Source{})});
 
-  auto* pre_str =
-      create<ast::Struct>(ast::StructMemberList{create<ast::StructMember>(
+  auto* pre_str = create<ast::Struct>(
+      Source{},
+      ast::StructMemberList{create<ast::StructMember>(
           Source{}, "c", &ary,
           ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(0, Source{})})});
+              create<ast::StructMemberOffsetDecoration>(0, Source{})})},
+      ast::StructDecorationList{});
 
   ast::type::Struct pre_struct("Pre", pre_str);
 
@@ -1172,16 +1201,19 @@
   ast::type::Vector ivec3(&i32, 3);
   ast::type::Vector fvec3(&f32, 3);
 
-  auto* data_str = create<ast::Struct>(ast::StructMemberList{
-      create<ast::StructMember>(
-          Source{}, "a", &ivec3,
-          ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(0, Source{})}),
-      create<ast::StructMember>(
-          Source{}, "b", &fvec3,
-          ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(16, Source{})}),
-  });
+  auto* data_str = create<ast::Struct>(
+      Source{},
+      ast::StructMemberList{
+          create<ast::StructMember>(
+              Source{}, "a", &ivec3,
+              ast::StructMemberDecorationList{
+                  create<ast::StructMemberOffsetDecoration>(0, Source{})}),
+          create<ast::StructMember>(
+              Source{}, "b", &fvec3,
+              ast::StructMemberDecorationList{
+                  create<ast::StructMemberOffsetDecoration>(16, Source{})}),
+      },
+      ast::StructDecorationList{});
 
   ast::type::Struct data("Data", data_str);
 
@@ -1190,11 +1222,13 @@
                            create<ast::StrideDecoration>(32, Source{}),
                        });
 
-  auto* pre_str =
-      create<ast::Struct>(ast::StructMemberList{create<ast::StructMember>(
+  auto* pre_str = create<ast::Struct>(
+      Source{},
+      ast::StructMemberList{create<ast::StructMember>(
           Source{}, "c", &ary,
           ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(0, Source{})})});
+              create<ast::StructMemberOffsetDecoration>(0, Source{})})},
+      ast::StructDecorationList{});
 
   ast::type::Struct pre_struct("Pre", pre_str);
 
@@ -1257,16 +1291,19 @@
   ast::type::Vector ivec3(&i32, 3);
   ast::type::Vector fvec3(&f32, 3);
 
-  auto* data_str = create<ast::Struct>(ast::StructMemberList{
-      create<ast::StructMember>(
-          Source{}, "a", &ivec3,
-          ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(0, Source{})}),
-      create<ast::StructMember>(
-          Source{}, "b", &fvec3,
-          ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(16, Source{})}),
-  });
+  auto* data_str = create<ast::Struct>(
+      Source{},
+      ast::StructMemberList{
+          create<ast::StructMember>(
+              Source{}, "a", &ivec3,
+              ast::StructMemberDecorationList{
+                  create<ast::StructMemberOffsetDecoration>(0, Source{})}),
+          create<ast::StructMember>(
+              Source{}, "b", &fvec3,
+              ast::StructMemberDecorationList{
+                  create<ast::StructMemberOffsetDecoration>(16, Source{})}),
+      },
+      ast::StructDecorationList{});
 
   ast::type::Struct data("Data", data_str);
 
@@ -1275,11 +1312,13 @@
                            create<ast::StrideDecoration>(32, Source{}),
                        });
 
-  auto* pre_str =
-      create<ast::Struct>(ast::StructMemberList{create<ast::StructMember>(
+  auto* pre_str = create<ast::Struct>(
+      Source{},
+      ast::StructMemberList{create<ast::StructMember>(
           Source{}, "c", &ary,
           ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(0, Source{})})});
+              create<ast::StructMemberOffsetDecoration>(0, Source{})})},
+      ast::StructDecorationList{});
 
   ast::type::Struct pre_struct("Pre", pre_str);
 
@@ -1342,16 +1381,19 @@
   ast::type::Vector ivec3(&i32, 3);
   ast::type::Vector fvec3(&f32, 3);
 
-  auto* data_str = create<ast::Struct>(ast::StructMemberList{
-      create<ast::StructMember>(
-          Source{}, "a", &ivec3,
-          ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(0, Source{})}),
-      create<ast::StructMember>(
-          Source{}, "b", &fvec3,
-          ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(16, Source{})}),
-  });
+  auto* data_str = create<ast::Struct>(
+      Source{},
+      ast::StructMemberList{
+          create<ast::StructMember>(
+              Source{}, "a", &ivec3,
+              ast::StructMemberDecorationList{
+                  create<ast::StructMemberOffsetDecoration>(0, Source{})}),
+          create<ast::StructMember>(
+              Source{}, "b", &fvec3,
+              ast::StructMemberDecorationList{
+                  create<ast::StructMemberOffsetDecoration>(16, Source{})}),
+      },
+      ast::StructDecorationList{});
 
   ast::type::Struct data("Data", data_str);
 
@@ -1360,11 +1402,13 @@
                            create<ast::StrideDecoration>(32, Source{}),
                        });
 
-  auto* pre_str =
-      create<ast::Struct>(ast::StructMemberList{create<ast::StructMember>(
+  auto* pre_str = create<ast::Struct>(
+      Source{},
+      ast::StructMemberList{create<ast::StructMember>(
           Source{}, "c", &ary,
           ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(0, Source{})})});
+              create<ast::StructMemberOffsetDecoration>(0, Source{})})},
+      ast::StructDecorationList{});
 
   ast::type::Struct pre_struct("Pre", pre_str);
 
@@ -1437,16 +1481,19 @@
   ast::type::Vector ivec3(&i32, 3);
   ast::type::Vector fvec3(&f32, 3);
 
-  auto* data_str = create<ast::Struct>(ast::StructMemberList{
-      create<ast::StructMember>(
-          Source{}, "a", &ivec3,
-          ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(0, Source{})}),
-      create<ast::StructMember>(
-          Source{}, "b", &fvec3,
-          ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(16, Source{})}),
-  });
+  auto* data_str = create<ast::Struct>(
+      Source{},
+      ast::StructMemberList{
+          create<ast::StructMember>(
+              Source{}, "a", &ivec3,
+              ast::StructMemberDecorationList{
+                  create<ast::StructMemberOffsetDecoration>(0, Source{})}),
+          create<ast::StructMember>(
+              Source{}, "b", &fvec3,
+              ast::StructMemberDecorationList{
+                  create<ast::StructMemberOffsetDecoration>(16, Source{})}),
+      },
+      ast::StructDecorationList{});
 
   ast::type::Struct data("Data", data_str);
 
@@ -1455,11 +1502,13 @@
                            create<ast::StrideDecoration>(32, Source{}),
                        });
 
-  auto* pre_str =
-      create<ast::Struct>(ast::StructMemberList{create<ast::StructMember>(
+  auto* pre_str = create<ast::Struct>(
+      Source{},
+      ast::StructMemberList{create<ast::StructMember>(
           Source{}, "c", &ary,
           ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(0, Source{})})});
+              create<ast::StructMemberOffsetDecoration>(0, Source{})})},
+      ast::StructDecorationList{});
 
   ast::type::Struct pre_struct("Pre", pre_str);
 
diff --git a/src/writer/hlsl/generator_impl_type_test.cc b/src/writer/hlsl/generator_impl_type_test.cc
index d65611e..9e3765d 100644
--- a/src/writer/hlsl/generator_impl_type_test.cc
+++ b/src/writer/hlsl/generator_impl_type_test.cc
@@ -181,7 +181,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("S", str);
 
@@ -205,7 +206,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("S", str);
 
@@ -229,7 +231,8 @@
   decos.push_back(create<ast::StructMemberOffsetDecoration>(128, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "c", &f32, decos));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("S", str);
 
@@ -255,7 +258,8 @@
   ast::StructMemberDecorationList b_deco;
   members.push_back(create<ast::StructMember>(Source{}, "float", &f32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("S", str);
 
@@ -283,7 +287,7 @@
   ast::StructDecorationList decos;
   decos.push_back(create<ast::StructBlockDecoration>(Source{}));
 
-  auto* str = create<ast::Struct>(decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, decos);
 
   ast::type::Struct s("S", str);
 
diff --git a/src/writer/msl/generator_impl_alias_type_test.cc b/src/writer/msl/generator_impl_alias_type_test.cc
index 99e5427..581260c 100644
--- a/src/writer/msl/generator_impl_alias_type_test.cc
+++ b/src/writer/msl/generator_impl_alias_type_test.cc
@@ -61,7 +61,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &i32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("a", str);
 
@@ -85,7 +86,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &i32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("b", str);
   ast::type::Alias alias(mod.RegisterSymbol("a"), "a", &s);
diff --git a/src/writer/msl/generator_impl_function_test.cc b/src/writer/msl/generator_impl_function_test.cc
index 2bca592..581247e 100644
--- a/src/writer/msl/generator_impl_function_test.cc
+++ b/src/writer/msl/generator_impl_function_test.cc
@@ -371,7 +371,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("Data", str);
   ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s);
@@ -455,7 +456,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("Data", str);
   ast::type::AccessControl ac(ast::AccessControl::kReadOnly, &s);
@@ -968,7 +970,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("Data", str);
   ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s);
@@ -1082,7 +1085,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("Data", str);
   ast::type::AccessControl ac(ast::AccessControl::kReadOnly, &s);
@@ -1341,7 +1345,7 @@
   ast::StructDecorationList s_decos;
   s_decos.push_back(create<ast::StructBlockDecoration>(Source{}));
 
-  auto* str = create<ast::Struct>(s_decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, s_decos);
 
   ast::type::Struct s("Data", str);
   ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s);
diff --git a/src/writer/msl/generator_impl_test.cc b/src/writer/msl/generator_impl_test.cc
index 068f847..1f28920 100644
--- a/src/writer/msl/generator_impl_test.cc
+++ b/src/writer/msl/generator_impl_test.cc
@@ -171,7 +171,8 @@
   decos.push_back(create<ast::StructMemberOffsetDecoration>(128, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "c", &f32, decos));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("S", str);
 
@@ -195,7 +196,8 @@
   decos.push_back(create<ast::StructMemberOffsetDecoration>(32, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "c", &f32, decos));
 
-  auto* inner_str = create<ast::Struct>(members);
+  auto* inner_str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct inner_s("Inner", inner_str);
 
@@ -208,7 +210,8 @@
   decos.push_back(create<ast::StructMemberOffsetDecoration>(64, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "f", &f32, decos));
 
-  auto* outer_str = create<ast::Struct>(members);
+  auto* outer_str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct outer_s("Outer", outer_str);
 
diff --git a/src/writer/msl/generator_impl_type_test.cc b/src/writer/msl/generator_impl_type_test.cc
index fb33521..c779de6 100644
--- a/src/writer/msl/generator_impl_type_test.cc
+++ b/src/writer/msl/generator_impl_type_test.cc
@@ -182,7 +182,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("S", str);
 
@@ -202,7 +203,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("S", str);
 
@@ -218,20 +220,23 @@
   ast::type::I32 i32;
   ast::type::F32 f32;
 
-  auto* str = create<ast::Struct>(ast::StructMemberList{
-      create<ast::StructMember>(
-          Source{}, "a", &i32,
-          ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(4, Source{})}),
-      create<ast::StructMember>(
-          Source{}, "b", &f32,
-          ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(32, Source{})}),
-      create<ast::StructMember>(
-          Source{}, "c", &f32,
-          ast::StructMemberDecorationList{
-              create<ast::StructMemberOffsetDecoration>(128, Source{})}),
-  });
+  auto* str = create<ast::Struct>(
+      Source{},
+      ast::StructMemberList{
+          create<ast::StructMember>(
+              Source{}, "a", &i32,
+              ast::StructMemberDecorationList{
+                  create<ast::StructMemberOffsetDecoration>(4, Source{})}),
+          create<ast::StructMember>(
+              Source{}, "b", &f32,
+              ast::StructMemberDecorationList{
+                  create<ast::StructMemberOffsetDecoration>(32, Source{})}),
+          create<ast::StructMember>(
+              Source{}, "c", &f32,
+              ast::StructMemberDecorationList{
+                  create<ast::StructMemberOffsetDecoration>(128, Source{})}),
+      },
+      ast::StructDecorationList{});
 
   ast::type::Struct s("S", str);
 
@@ -258,7 +263,8 @@
   ast::StructMemberDecorationList b_deco;
   members.push_back(create<ast::StructMember>(Source{}, "float", &f32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("S", str);
 
@@ -285,7 +291,7 @@
 
   ast::StructDecorationList decos;
   decos.push_back(create<ast::StructBlockDecoration>(Source{}));
-  auto* str = create<ast::Struct>(decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, decos);
 
   ast::type::Struct s("S", str);
 
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 b2d03dd..791ad6a 100644
--- a/src/writer/msl/generator_impl_variable_decl_statement_test.cc
+++ b/src/writer/msl/generator_impl_variable_decl_statement_test.cc
@@ -110,7 +110,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("S", str);
 
diff --git a/src/writer/spirv/builder_accessor_expression_test.cc b/src/writer/spirv/builder_accessor_expression_test.cc
index 802cd79..43ebfc8 100644
--- a/src/writer/spirv/builder_accessor_expression_test.cc
+++ b/src/writer/spirv/builder_accessor_expression_test.cc
@@ -304,7 +304,7 @@
   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);
+  auto* s = create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
   ast::type::Struct s_type("my_struct", s);
 
   ast::Variable var(Source{}, "ident", ast::StorageClass::kFunction, &s_type,
@@ -360,13 +360,17 @@
   inner_members.push_back(
       create<ast::StructMember>(Source{}, "b", &f32, decos));
 
-  ast::type::Struct inner_struct("Inner", create<ast::Struct>(inner_members));
+  ast::type::Struct inner_struct(
+      "Inner", create<ast::Struct>(Source{}, inner_members,
+                                   ast::StructDecorationList{}));
 
   ast::StructMemberList outer_members;
   outer_members.push_back(
       create<ast::StructMember>(Source{}, "inner", &inner_struct, decos));
 
-  ast::type::Struct s_type("my_struct", create<ast::Struct>(outer_members));
+  ast::type::Struct s_type("my_struct",
+                           create<ast::Struct>(Source{}, outer_members,
+                                               ast::StructDecorationList{}));
 
   ast::Variable var(Source{}, "ident", ast::StorageClass::kFunction, &s_type,
                     false, nullptr, ast::VariableDecorationList{});
@@ -427,7 +431,9 @@
   inner_members.push_back(
       create<ast::StructMember>(Source{}, "b", &f32, decos));
 
-  ast::type::Struct inner_struct("Inner", create<ast::Struct>(inner_members));
+  ast::type::Struct inner_struct(
+      "Inner", create<ast::Struct>(Source{}, inner_members,
+                                   ast::StructDecorationList{}));
 
   ast::type::Alias alias(mod->RegisterSymbol("Inner"), "Inner", &inner_struct);
 
@@ -435,7 +441,9 @@
   outer_members.push_back(
       create<ast::StructMember>(Source{}, "inner", &alias, decos));
 
-  ast::type::Struct s_type("Outer", create<ast::Struct>(outer_members));
+  ast::type::Struct s_type("Outer",
+                           create<ast::Struct>(Source{}, outer_members,
+                                               ast::StructDecorationList{}));
 
   ast::Variable var(Source{}, "ident", ast::StorageClass::kFunction, &s_type,
                     false, nullptr, ast::VariableDecorationList{});
@@ -496,13 +504,17 @@
   inner_members.push_back(
       create<ast::StructMember>(Source{}, "b", &f32, decos));
 
-  ast::type::Struct inner_struct("Inner", create<ast::Struct>(inner_members));
+  ast::type::Struct inner_struct(
+      "Inner", create<ast::Struct>(Source{}, inner_members,
+                                   ast::StructDecorationList{}));
 
   ast::StructMemberList outer_members;
   outer_members.push_back(
       create<ast::StructMember>(Source{}, "inner", &inner_struct, decos));
 
-  ast::type::Struct s_type("my_struct", create<ast::Struct>(outer_members));
+  ast::type::Struct s_type("my_struct",
+                           create<ast::Struct>(Source{}, outer_members,
+                                               ast::StructDecorationList{}));
 
   ast::Variable var(Source{}, "ident", ast::StorageClass::kFunction, &s_type,
                     false, nullptr, ast::VariableDecorationList{});
@@ -570,13 +582,17 @@
   inner_members.push_back(
       create<ast::StructMember>(Source{}, "b", &f32, decos));
 
-  ast::type::Struct inner_struct("Inner", create<ast::Struct>(inner_members));
+  ast::type::Struct inner_struct(
+      "Inner", create<ast::Struct>(Source{}, inner_members,
+                                   ast::StructDecorationList{}));
 
   ast::StructMemberList outer_members;
   outer_members.push_back(
       create<ast::StructMember>(Source{}, "inner", &inner_struct, decos));
 
-  ast::type::Struct s_type("my_struct", create<ast::Struct>(outer_members));
+  ast::type::Struct s_type("my_struct",
+                           create<ast::Struct>(Source{}, outer_members,
+                                               ast::StructDecorationList{}));
 
   ast::Variable var(Source{}, "ident", ast::StorageClass::kFunction, &s_type,
                     false, nullptr, ast::VariableDecorationList{});
@@ -861,18 +877,24 @@
 
   ast::StructMemberDecorationList decos;
 
-  auto* s = create<ast::Struct>(ast::StructMemberList{
-      create<ast::StructMember>(Source{}, "baz", &vec3, decos)});
+  auto* s = create<ast::Struct>(Source{},
+                                ast::StructMemberList{create<ast::StructMember>(
+                                    Source{}, "baz", &vec3, decos)},
+                                ast::StructDecorationList{});
   ast::type::Struct c_type("C", s);
 
-  s = create<ast::Struct>(ast::StructMemberList{
-      create<ast::StructMember>(Source{}, "bar", &c_type, decos)});
+  s = create<ast::Struct>(Source{},
+                          ast::StructMemberList{create<ast::StructMember>(
+                              Source{}, "bar", &c_type, decos)},
+                          ast::StructDecorationList{});
   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>(Source{}, "foo", &b_ary_type, decos)});
+  s = create<ast::Struct>(Source{},
+                          ast::StructMemberList{create<ast::StructMember>(
+                              Source{}, "foo", &b_ary_type, decos)},
+                          ast::StructDecorationList{});
   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 c13f530..79bb488 100644
--- a/src/writer/spirv/builder_assign_test.cc
+++ b/src/writer/spirv/builder_assign_test.cc
@@ -234,7 +234,7 @@
   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);
+  auto* s = create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
   ast::type::Struct s_type("my_struct", s);
 
   ast::Variable v(Source{}, "ident", ast::StorageClass::kFunction, &s_type,
diff --git a/src/writer/spirv/builder_constructor_expression_test.cc b/src/writer/spirv/builder_constructor_expression_test.cc
index 778d842..ac33690 100644
--- a/src/writer/spirv/builder_constructor_expression_test.cc
+++ b/src/writer/spirv/builder_constructor_expression_test.cc
@@ -942,10 +942,13 @@
 
 TEST_F(SpvBuilderConstructorTest, Type_Struct) {
   ast::StructMemberDecorationList decos;
-  auto* s = create<ast::Struct>(ast::StructMemberList{
-      create<ast::StructMember>(Source{}, "a", ty.f32, decos),
-      create<ast::StructMember>(Source{}, "b", ty.vec3<f32>(), decos),
-  });
+  auto* s = create<ast::Struct>(
+      Source{},
+      ast::StructMemberList{
+          create<ast::StructMember>(Source{}, "a", ty.f32, decos),
+          create<ast::StructMember>(Source{}, "b", ty.vec3<f32>(), decos),
+      },
+      ast::StructDecorationList{});
   ast::type::Struct s_type("my_struct", s);
 
   auto* t = Construct(&s_type, 2.0f, vec3<f32>(2.0f, 2.0f, 2.0f));
@@ -1079,9 +1082,12 @@
 
 TEST_F(SpvBuilderConstructorTest, Type_ZeroInit_Struct) {
   ast::StructMemberDecorationList decos;
-  auto* s = create<ast::Struct>(ast::StructMemberList{
-      create<ast::StructMember>(Source{}, "a", ty.f32, decos),
-  });
+  auto* s = create<ast::Struct>(
+      Source{},
+      ast::StructMemberList{
+          create<ast::StructMember>(Source{}, "a", ty.f32, decos),
+      },
+      ast::StructDecorationList{});
   ast::type::Struct s_type("my_struct", s);
 
   auto* t = Construct(&s_type);
@@ -1491,10 +1497,13 @@
 
 TEST_F(SpvBuilderConstructorTest, IsConstructorConst_Struct) {
   ast::StructMemberDecorationList decos;
-  auto* s = create<ast::Struct>(ast::StructMemberList{
-      create<ast::StructMember>(Source{}, "a", ty.f32, decos),
-      create<ast::StructMember>(Source{}, "b", ty.vec3<f32>(), decos),
-  });
+  auto* s = create<ast::Struct>(
+      Source{},
+      ast::StructMemberList{
+          create<ast::StructMember>(Source{}, "a", ty.f32, decos),
+          create<ast::StructMember>(Source{}, "b", ty.vec3<f32>(), decos),
+      },
+      ast::StructDecorationList{});
   ast::type::Struct s_type("my_struct", s);
 
   auto* t = Construct(&s_type, 2.f, vec3<f32>(2.f, 2.f, 2.f));
@@ -1508,10 +1517,13 @@
 TEST_F(SpvBuilderConstructorTest,
        IsConstructorConst_Struct_WithIdentSubExpression) {
   ast::StructMemberDecorationList decos;
-  auto* s = create<ast::Struct>(ast::StructMemberList{
-      create<ast::StructMember>(Source{}, "a", ty.f32, decos),
-      create<ast::StructMember>(Source{}, "b", ty.vec3<f32>(), decos),
-  });
+  auto* s = create<ast::Struct>(
+      Source{},
+      ast::StructMemberList{
+          create<ast::StructMember>(Source{}, "a", ty.f32, decos),
+          create<ast::StructMember>(Source{}, "b", ty.vec3<f32>(), decos),
+      },
+      ast::StructDecorationList{});
 
   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 dd6024c..7953a43 100644
--- a/src/writer/spirv/builder_function_test.cc
+++ b/src/writer/spirv/builder_function_test.cc
@@ -269,7 +269,7 @@
   ast::StructDecorationList s_decos;
   s_decos.push_back(create<ast::StructBlockDecoration>(Source{}));
 
-  auto* str = create<ast::Struct>(s_decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, s_decos);
 
   ast::type::Struct s("Data", str);
   ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s);
diff --git a/src/writer/spirv/builder_global_variable_test.cc b/src/writer/spirv/builder_global_variable_test.cc
index 1ca89f9..da47bb0 100644
--- a/src/writer/spirv/builder_global_variable_test.cc
+++ b/src/writer/spirv/builder_global_variable_test.cc
@@ -533,7 +533,8 @@
   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::Struct A(
+      "A", create<ast::Struct>(Source{}, members, ast::StructDecorationList{}));
   ast::type::AccessControl ac{ast::AccessControl::kReadOnly, &A};
 
   ast::Variable var(Source{}, "b", ast::StorageClass::kStorageBuffer, &ac,
@@ -569,7 +570,8 @@
   ast::StructMemberList members;
   members.push_back(create<ast::StructMember>(Source{}, "a", &i32, decos));
 
-  ast::type::Struct A("A", create<ast::Struct>(members));
+  ast::type::Struct A(
+      "A", create<ast::Struct>(Source{}, members, ast::StructDecorationList{}));
   ast::type::Alias B(mod->RegisterSymbol("B"), "B", &A);
   ast::type::AccessControl ac{ast::AccessControl::kReadOnly, &B};
 
@@ -604,7 +606,8 @@
   ast::StructMemberList members;
   members.push_back(create<ast::StructMember>(Source{}, "a", &i32, decos));
 
-  ast::type::Struct A("A", create<ast::Struct>(members));
+  ast::type::Struct A(
+      "A", create<ast::Struct>(Source{}, members, ast::StructDecorationList{}));
   ast::type::AccessControl ac{ast::AccessControl::kReadOnly, &A};
   ast::type::Alias B(mod->RegisterSymbol("B"), "B", &ac);
 
@@ -639,7 +642,8 @@
   ast::StructMemberList members;
   members.push_back(create<ast::StructMember>(Source{}, "a", &i32, decos));
 
-  ast::type::Struct A("A", create<ast::Struct>(members));
+  ast::type::Struct A(
+      "A", create<ast::Struct>(Source{}, members, ast::StructDecorationList{}));
   ast::type::AccessControl read{ast::AccessControl::kReadOnly, &A};
   ast::type::AccessControl rw{ast::AccessControl::kReadWrite, &A};
 
diff --git a/src/writer/spirv/builder_intrinsic_test.cc b/src/writer/spirv/builder_intrinsic_test.cc
index e353ffc..9c7ec94 100644
--- a/src/writer/spirv/builder_intrinsic_test.cc
+++ b/src/writer/spirv/builder_intrinsic_test.cc
@@ -1311,7 +1311,7 @@
   members.push_back(
       create<ast::StructMember>(Source{}, "a", ty.array<f32>(), decos));
 
-  auto* s = create<ast::Struct>(members);
+  auto* s = create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
   ast::type::Struct s_type("my_struct", s);
 
   auto* var = Var("b", ast::StorageClass::kPrivate, &s_type);
@@ -1353,7 +1353,7 @@
   members.push_back(
       create<ast::StructMember>(Source{}, "a", ty.array<f32>(), decos));
 
-  auto* s = create<ast::Struct>(members);
+  auto* s = create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
   ast::type::Struct s_type("my_struct", s);
 
   auto* var = Var("b", ast::StorageClass::kPrivate, &s_type);
@@ -1397,7 +1397,7 @@
   members.push_back(
       create<ast::StructMember>(Source{}, "a", ty.array<f32>(), decos));
 
-  auto* s = create<ast::Struct>(members);
+  auto* s = create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
   ast::type::Struct s_type("my_struct", s);
 
   auto* var = Var("b", ast::StorageClass::kPrivate, &s_type);
diff --git a/src/writer/spirv/builder_type_test.cc b/src/writer/spirv/builder_type_test.cc
index 77457b6..638dc46 100644
--- a/src/writer/spirv/builder_type_test.cc
+++ b/src/writer/spirv/builder_type_test.cc
@@ -278,7 +278,8 @@
 }
 
 TEST_F(BuilderTest_Type, GenerateStruct_Empty) {
-  auto* s = create<ast::Struct>(ast::StructMemberList{});
+  auto* s = create<ast::Struct>(Source{}, ast::StructMemberList{},
+                                ast::StructDecorationList{});
   ast::type::Struct s_type("S", s);
 
   auto id = b.GenerateTypeIfNeeded(&s_type);
@@ -299,7 +300,7 @@
   ast::StructMemberList members;
   members.push_back(create<ast::StructMember>(Source{}, "a", &f32, decos));
 
-  auto* s = create<ast::Struct>(members);
+  auto* s = create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
   ast::type::Struct s_type("my_struct", s);
 
   auto id = b.GenerateTypeIfNeeded(&s_type);
@@ -324,7 +325,7 @@
   ast::StructDecorationList struct_decos;
   struct_decos.push_back(create<ast::StructBlockDecoration>(Source{}));
 
-  auto* s = create<ast::Struct>(struct_decos, members);
+  auto* s = create<ast::Struct>(Source{}, members, struct_decos);
   ast::type::Struct s_type("my_struct", s);
 
   auto id = b.GenerateTypeIfNeeded(&s_type);
@@ -353,7 +354,7 @@
   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);
+  auto* s = create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
   ast::type::Struct s_type("S", s);
 
   auto id = b.GenerateTypeIfNeeded(&s_type);
@@ -390,7 +391,7 @@
   members.push_back(
       create<ast::StructMember>(Source{}, "c", &glsl_mat4x4, empty_c));
 
-  auto* s = create<ast::Struct>(members);
+  auto* s = create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
   ast::type::Struct s_type("S", s);
 
   auto id = b.GenerateTypeIfNeeded(&s_type);
@@ -436,7 +437,7 @@
   members.push_back(
       create<ast::StructMember>(Source{}, "c", &glsl_mat4x4, c_decos));
 
-  auto* s = create<ast::Struct>(members);
+  auto* s = create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
   ast::type::Struct s_type("S", s);
 
   auto id = b.GenerateTypeIfNeeded(&s_type);
@@ -503,7 +504,7 @@
   members.push_back(
       create<ast::StructMember>(Source{}, "c", &glsl_mat4x4, c_decos));
 
-  auto* s = create<ast::Struct>(members);
+  auto* s = create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
   ast::type::Struct s_type("S", s);
 
   auto id = b.GenerateTypeIfNeeded(&s_type);
diff --git a/src/writer/wgsl/generator_impl_alias_type_test.cc b/src/writer/wgsl/generator_impl_alias_type_test.cc
index 4602ac9..6d7fdab 100644
--- a/src/writer/wgsl/generator_impl_alias_type_test.cc
+++ b/src/writer/wgsl/generator_impl_alias_type_test.cc
@@ -51,7 +51,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &i32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("A", str);
   ast::type::Alias alias(mod.RegisterSymbol("B"), "B", &s);
@@ -79,7 +80,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &i32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("A", str);
   ast::type::Alias alias(mod.RegisterSymbol("B"), "B", &s);
diff --git a/src/writer/wgsl/generator_impl_function_test.cc b/src/writer/wgsl/generator_impl_function_test.cc
index 65d5a8f..05ef507 100644
--- a/src/writer/wgsl/generator_impl_function_test.cc
+++ b/src/writer/wgsl/generator_impl_function_test.cc
@@ -198,7 +198,7 @@
   ast::StructDecorationList s_decos;
   s_decos.push_back(create<ast::StructBlockDecoration>(Source{}));
 
-  auto* str = create<ast::Struct>(s_decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, s_decos);
 
   ast::type::Struct s("Data", str);
   ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s);
diff --git a/src/writer/wgsl/generator_impl_type_test.cc b/src/writer/wgsl/generator_impl_type_test.cc
index aa70ad8..2377569 100644
--- a/src/writer/wgsl/generator_impl_type_test.cc
+++ b/src/writer/wgsl/generator_impl_type_test.cc
@@ -74,7 +74,7 @@
   ast::StructDecorationList decos;
   decos.push_back(&block_deco);
 
-  ast::Struct str(decos, members);
+  ast::Struct str(Source{}, members, decos);
   ast::type::Struct s("S", &str);
 
   ast::type::AccessControl a(ast::AccessControl::kReadOnly, &s);
@@ -94,7 +94,7 @@
   ast::StructDecorationList decos;
   decos.push_back(&block_deco);
 
-  ast::Struct str(decos, members);
+  ast::Struct str(Source{}, members, decos);
   ast::type::Struct s("S", &str);
 
   ast::type::AccessControl a(ast::AccessControl::kReadWrite, &s);
@@ -183,7 +183,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("S", str);
 
@@ -203,7 +204,8 @@
   b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4, Source{}));
   members.push_back(create<ast::StructMember>(Source{}, "b", &f32, b_deco));
 
-  auto* str = create<ast::Struct>(members);
+  auto* str =
+      create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
 
   ast::type::Struct s("S", str);
 
@@ -231,7 +233,7 @@
   ast::StructDecorationList decos;
   decos.push_back(create<ast::StructBlockDecoration>(Source{}));
 
-  auto* str = create<ast::Struct>(decos, members);
+  auto* str = create<ast::Struct>(Source{}, members, decos);
 
   ast::type::Struct s("S", str);