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

Parsers need fixing up.

Bug: tint:396
Bug: tint:390
Change-Id: I137f1017ca56125cf3d52ecbef2ff46d0574338b
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/35161
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/ast/assignment_statement.cc b/src/ast/assignment_statement.cc
index 67d0b30..4561263 100644
--- a/src/ast/assignment_statement.cc
+++ b/src/ast/assignment_statement.cc
@@ -22,9 +22,6 @@
 namespace tint {
 namespace ast {
 
-AssignmentStatement::AssignmentStatement(Expression* lhs, Expression* rhs)
-    : Base(), lhs_(lhs), rhs_(rhs) {}
-
 AssignmentStatement::AssignmentStatement(const Source& source,
                                          Expression* lhs,
                                          Expression* rhs)
diff --git a/src/ast/assignment_statement.h b/src/ast/assignment_statement.h
index 558ae42..a91b000 100644
--- a/src/ast/assignment_statement.h
+++ b/src/ast/assignment_statement.h
@@ -29,10 +29,6 @@
 class AssignmentStatement : public Castable<AssignmentStatement, Statement> {
  public:
   /// Constructor
-  /// @param lhs the left side of the expression
-  /// @param rhs the right side of the expression
-  AssignmentStatement(Expression* lhs, Expression* rhs);
-  /// Constructor
   /// @param source the assignment statement source
   /// @param lhs the left side of the expression
   /// @param rhs the right side of the expression
diff --git a/src/ast/assignment_statement_test.cc b/src/ast/assignment_statement_test.cc
index 5cb5954..951e32c 100644
--- a/src/ast/assignment_statement_test.cc
+++ b/src/ast/assignment_statement_test.cc
@@ -29,7 +29,7 @@
   auto* rhs =
       create<IdentifierExpression>(Source{}, mod.RegisterSymbol("rhs"), "rhs");
 
-  AssignmentStatement stmt(lhs, rhs);
+  AssignmentStatement stmt(Source{}, lhs, rhs);
   EXPECT_EQ(stmt.lhs(), lhs);
   EXPECT_EQ(stmt.rhs(), rhs);
 }
@@ -52,7 +52,7 @@
   auto* rhs =
       create<IdentifierExpression>(Source{}, mod.RegisterSymbol("rhs"), "rhs");
 
-  AssignmentStatement stmt(lhs, rhs);
+  AssignmentStatement stmt(Source{}, lhs, rhs);
   EXPECT_TRUE(stmt.Is<AssignmentStatement>());
 }
 
@@ -62,7 +62,7 @@
   auto* rhs =
       create<IdentifierExpression>(Source{}, mod.RegisterSymbol("rhs"), "rhs");
 
-  AssignmentStatement stmt(lhs, rhs);
+  AssignmentStatement stmt(Source{}, lhs, rhs);
   EXPECT_TRUE(stmt.IsValid());
 }
 
@@ -70,7 +70,7 @@
   auto* rhs =
       create<IdentifierExpression>(Source{}, mod.RegisterSymbol("rhs"), "rhs");
 
-  AssignmentStatement stmt(nullptr, rhs);
+  AssignmentStatement stmt(Source{}, nullptr, rhs);
   EXPECT_FALSE(stmt.IsValid());
 }
 
@@ -78,7 +78,7 @@
   auto* lhs =
       create<IdentifierExpression>(Source{}, mod.RegisterSymbol("lhs"), "lhs");
 
-  AssignmentStatement stmt(lhs, nullptr);
+  AssignmentStatement stmt(Source{}, lhs, nullptr);
   EXPECT_FALSE(stmt.IsValid());
 }
 
@@ -87,7 +87,7 @@
       create<IdentifierExpression>(Source{}, mod.RegisterSymbol(""), "");
   auto* rhs =
       create<IdentifierExpression>(Source{}, mod.RegisterSymbol("rhs"), "rhs");
-  AssignmentStatement stmt(lhs, rhs);
+  AssignmentStatement stmt(Source{}, lhs, rhs);
   EXPECT_FALSE(stmt.IsValid());
 }
 
@@ -96,7 +96,7 @@
       create<IdentifierExpression>(Source{}, mod.RegisterSymbol("lhs"), "lhs");
   auto* rhs =
       create<IdentifierExpression>(Source{}, mod.RegisterSymbol(""), "");
-  AssignmentStatement stmt(lhs, rhs);
+  AssignmentStatement stmt(Source{}, lhs, rhs);
   EXPECT_FALSE(stmt.IsValid());
 }
 
@@ -106,7 +106,7 @@
   auto* rhs =
       create<IdentifierExpression>(Source{}, mod.RegisterSymbol("rhs"), "rhs");
 
-  AssignmentStatement stmt(lhs, rhs);
+  AssignmentStatement stmt(Source{}, lhs, rhs);
   std::ostringstream out;
   stmt.to_str(out, 2);
 
diff --git a/src/ast/block_statement.cc b/src/ast/block_statement.cc
index a851e37..b0e5f4b 100644
--- a/src/ast/block_statement.cc
+++ b/src/ast/block_statement.cc
@@ -22,8 +22,6 @@
 namespace tint {
 namespace ast {
 
-BlockStatement::BlockStatement() : Base() {}
-
 BlockStatement::BlockStatement(const Source& source) : Base(source) {}
 
 BlockStatement::BlockStatement(BlockStatement&&) = default;
diff --git a/src/ast/block_statement.h b/src/ast/block_statement.h
index 95290f9..faa7aaa 100644
--- a/src/ast/block_statement.h
+++ b/src/ast/block_statement.h
@@ -28,8 +28,6 @@
 class BlockStatement : public Castable<BlockStatement, Statement> {
  public:
   /// Constructor
-  BlockStatement();
-  /// Constructor
   /// @param source the block statement source
   explicit BlockStatement(const Source& source);
   /// Move constructor
diff --git a/src/ast/block_statement_test.cc b/src/ast/block_statement_test.cc
index fc2cb92..086931c 100644
--- a/src/ast/block_statement_test.cc
+++ b/src/ast/block_statement_test.cc
@@ -28,10 +28,10 @@
 using BlockStatementTest = TestHelper;
 
 TEST_F(BlockStatementTest, Creation) {
-  auto* d = create<DiscardStatement>();
+  auto* d = create<DiscardStatement>(Source{});
   auto* ptr = d;
 
-  BlockStatement b;
+  BlockStatement b(Source{});
   b.append(d);
 
   ASSERT_EQ(b.size(), 1u);
@@ -39,11 +39,11 @@
 }
 
 TEST_F(BlockStatementTest, Creation_WithInsert) {
-  auto* s1 = create<DiscardStatement>();
-  auto* s2 = create<DiscardStatement>();
-  auto* s3 = create<DiscardStatement>();
+  auto* s1 = create<DiscardStatement>(Source{});
+  auto* s2 = create<DiscardStatement>(Source{});
+  auto* s3 = create<DiscardStatement>(Source{});
 
-  BlockStatement b;
+  BlockStatement b(Source{});
   b.insert(0, s1);
   b.insert(0, s2);
   b.insert(1, s3);
@@ -64,38 +64,39 @@
 }
 
 TEST_F(BlockStatementTest, IsBlock) {
-  BlockStatement b;
+  BlockStatement b(Source{});
   EXPECT_TRUE(b.Is<BlockStatement>());
 }
 
 TEST_F(BlockStatementTest, IsValid) {
-  BlockStatement b;
-  b.append(create<DiscardStatement>());
+  BlockStatement b(Source{});
+  b.append(create<DiscardStatement>(Source{}));
   EXPECT_TRUE(b.IsValid());
 }
 
 TEST_F(BlockStatementTest, IsValid_Empty) {
-  BlockStatement b;
+  BlockStatement b(Source{});
   EXPECT_TRUE(b.IsValid());
 }
 
 TEST_F(BlockStatementTest, IsValid_NullBodyStatement) {
-  BlockStatement b;
-  b.append(create<DiscardStatement>());
+  BlockStatement b(Source{});
+  b.append(create<DiscardStatement>(Source{}));
   b.append(nullptr);
   EXPECT_FALSE(b.IsValid());
 }
 
 TEST_F(BlockStatementTest, IsValid_InvalidBodyStatement) {
-  BlockStatement b;
-  b.append(create<IfStatement>(Source{}, nullptr, create<BlockStatement>(),
+  BlockStatement b(Source{});
+  b.append(create<IfStatement>(Source{}, nullptr,
+                               create<BlockStatement>(Source{}),
                                ElseStatementList{}));
   EXPECT_FALSE(b.IsValid());
 }
 
 TEST_F(BlockStatementTest, ToStr) {
-  BlockStatement b;
-  b.append(create<DiscardStatement>());
+  BlockStatement b(Source{});
+  b.append(create<DiscardStatement>(Source{}));
 
   std::ostringstream out;
   b.to_str(out, 2);
diff --git a/src/ast/break_statement.cc b/src/ast/break_statement.cc
index 1affc27..eba613e 100644
--- a/src/ast/break_statement.cc
+++ b/src/ast/break_statement.cc
@@ -22,8 +22,6 @@
 namespace tint {
 namespace ast {
 
-BreakStatement::BreakStatement() : Base() {}
-
 BreakStatement::BreakStatement(const Source& source) : Base(source) {}
 
 BreakStatement::BreakStatement(BreakStatement&&) = default;
diff --git a/src/ast/break_statement.h b/src/ast/break_statement.h
index 83d902e..7c9bd91 100644
--- a/src/ast/break_statement.h
+++ b/src/ast/break_statement.h
@@ -24,8 +24,6 @@
 class BreakStatement : public Castable<BreakStatement, Statement> {
  public:
   /// Constructor
-  BreakStatement();
-  /// Constructor
   /// @param source the break statement source
   explicit BreakStatement(const Source& source);
   /// Move constructor
diff --git a/src/ast/break_statement_test.cc b/src/ast/break_statement_test.cc
index 8021348..27a7a8f 100644
--- a/src/ast/break_statement_test.cc
+++ b/src/ast/break_statement_test.cc
@@ -30,17 +30,17 @@
 }
 
 TEST_F(BreakStatementTest, IsBreak) {
-  BreakStatement stmt;
+  BreakStatement stmt(Source{});
   EXPECT_TRUE(stmt.Is<BreakStatement>());
 }
 
 TEST_F(BreakStatementTest, IsValid) {
-  BreakStatement stmt;
+  BreakStatement stmt(Source{});
   EXPECT_TRUE(stmt.IsValid());
 }
 
 TEST_F(BreakStatementTest, ToStr) {
-  BreakStatement stmt;
+  BreakStatement stmt(Source{});
   std::ostringstream out;
   stmt.to_str(out, 2);
   EXPECT_EQ(out.str(), R"(  Break{}
diff --git a/src/ast/call_statement.cc b/src/ast/call_statement.cc
index d74df3d..43670f7 100644
--- a/src/ast/call_statement.cc
+++ b/src/ast/call_statement.cc
@@ -23,14 +23,16 @@
 namespace tint {
 namespace ast {
 
-CallStatement::CallStatement(CallExpression* call) : Base(), call_(call) {}
+CallStatement::CallStatement(const Source& source, CallExpression* call)
+    : Base(source), call_(call) {}
 
 CallStatement::CallStatement(CallStatement&&) = default;
 
 CallStatement::~CallStatement() = default;
 
 CallStatement* CallStatement::Clone(CloneContext* ctx) const {
-  return ctx->mod->create<CallStatement>(ctx->Clone(call_));
+  return ctx->mod->create<CallStatement>(ctx->Clone(source()),
+                                         ctx->Clone(call_));
 }
 
 bool CallStatement::IsValid() const {
diff --git a/src/ast/call_statement.h b/src/ast/call_statement.h
index 2af7582..59f7bed 100644
--- a/src/ast/call_statement.h
+++ b/src/ast/call_statement.h
@@ -28,8 +28,9 @@
 class CallStatement : public Castable<CallStatement, Statement> {
  public:
   /// Constructor
+  /// @param source the input source for the statement
   /// @param call the function
-  explicit CallStatement(CallExpression* call);
+  CallStatement(const Source& source, CallExpression* call);
   /// Move constructor
   CallStatement(CallStatement&&);
   ~CallStatement() override;
diff --git a/src/ast/call_statement_test.cc b/src/ast/call_statement_test.cc
index dae79dc..b6fcee2 100644
--- a/src/ast/call_statement_test.cc
+++ b/src/ast/call_statement_test.cc
@@ -31,17 +31,18 @@
                                  Source{}, mod.RegisterSymbol("func"), "func"),
                              ExpressionList{});
 
-  CallStatement c(expr);
+  CallStatement c(Source{}, expr);
   EXPECT_EQ(c.expr(), expr);
 }
 
 TEST_F(CallStatementTest, IsCall) {
-  CallStatement c(nullptr);
+  CallStatement c(Source{}, nullptr);
   EXPECT_TRUE(c.Is<CallStatement>());
 }
 
 TEST_F(CallStatementTest, IsValid) {
   CallStatement c(
+      Source{},
       create<CallExpression>(Source{},
                              create<IdentifierExpression>(
                                  Source{}, mod.RegisterSymbol("func"), "func"),
@@ -50,18 +51,19 @@
 }
 
 TEST_F(CallStatementTest, IsValid_MissingExpr) {
-  CallStatement c(nullptr);
+  CallStatement c(Source{}, nullptr);
   EXPECT_FALSE(c.IsValid());
 }
 
 TEST_F(CallStatementTest, IsValid_InvalidExpr) {
   CallExpression stmt(Source{}, nullptr, {});
-  CallStatement c(&stmt);
+  CallStatement c(Source{}, &stmt);
   EXPECT_FALSE(c.IsValid());
 }
 
 TEST_F(CallStatementTest, ToStr) {
   CallStatement c(
+      Source{},
       create<CallExpression>(Source{},
                              create<IdentifierExpression>(
                                  Source{}, mod.RegisterSymbol("func"), "func"),
diff --git a/src/ast/case_statement.cc b/src/ast/case_statement.cc
index 03c803e..181a263 100644
--- a/src/ast/case_statement.cc
+++ b/src/ast/case_statement.cc
@@ -22,11 +22,6 @@
 namespace tint {
 namespace ast {
 
-CaseStatement::CaseStatement(BlockStatement* body) : Base(), body_(body) {}
-
-CaseStatement::CaseStatement(CaseSelectorList selectors, BlockStatement* body)
-    : Base(), selectors_(selectors), body_(body) {}
-
 CaseStatement::CaseStatement(const Source& source,
                              CaseSelectorList selectors,
                              BlockStatement* body)
diff --git a/src/ast/case_statement.h b/src/ast/case_statement.h
index 35cb495..c9c424e 100644
--- a/src/ast/case_statement.h
+++ b/src/ast/case_statement.h
@@ -34,14 +34,6 @@
 class CaseStatement : public Castable<CaseStatement, Statement> {
  public:
   /// Constructor
-  /// Creates a default case statement
-  /// @param body the case body
-  explicit CaseStatement(BlockStatement* body);
-  /// Constructor
-  /// @param selectors the case selectors
-  /// @param body the case body
-  CaseStatement(CaseSelectorList selectors, BlockStatement* body);
-  /// Constructor
   /// @param source the source information
   /// @param selectors the case selectors
   /// @param body the case body
diff --git a/src/ast/case_statement_test.cc b/src/ast/case_statement_test.cc
index 9ecf1bb..0473418 100644
--- a/src/ast/case_statement_test.cc
+++ b/src/ast/case_statement_test.cc
@@ -35,11 +35,11 @@
   auto* selector = create<SintLiteral>(Source{}, &i32, 2);
   b.push_back(selector);
 
-  auto* body = create<BlockStatement>();
-  auto* discard = create<DiscardStatement>();
+  auto* body = create<BlockStatement>(Source{});
+  auto* discard = create<DiscardStatement>(Source{});
   body->append(discard);
 
-  CaseStatement c(b, body);
+  CaseStatement c(Source{}, b, body);
   ASSERT_EQ(c.selectors().size(), 1u);
   EXPECT_EQ(c.selectors()[0], selector);
   ASSERT_EQ(c.body()->size(), 1u);
@@ -53,11 +53,11 @@
   auto* selector = create<SintLiteral>(Source{}, &u32, 2);
   b.push_back(selector);
 
-  auto* body = create<BlockStatement>();
-  auto* discard = create<DiscardStatement>();
+  auto* body = create<BlockStatement>(Source{});
+  auto* discard = create<DiscardStatement>(Source{});
   body->append(discard);
 
-  CaseStatement c(b, body);
+  CaseStatement c(Source{}, b, body);
   ASSERT_EQ(c.selectors().size(), 1u);
   EXPECT_EQ(c.selectors()[0], selector);
   ASSERT_EQ(c.body()->size(), 1u);
@@ -69,8 +69,8 @@
   CaseSelectorList b;
   b.push_back(create<SintLiteral>(Source{}, &i32, 2));
 
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
   CaseStatement c(Source{Source::Location{20, 2}}, b, body);
   auto src = c.source();
@@ -79,10 +79,10 @@
 }
 
 TEST_F(CaseStatementTest, IsDefault_WithoutSelectors) {
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
-  CaseStatement c(body);
+  CaseStatement c(Source{}, CaseSelectorList{}, body);
   EXPECT_TRUE(c.IsDefault());
 }
 
@@ -91,17 +91,19 @@
   CaseSelectorList b;
   b.push_back(create<SintLiteral>(Source{}, &i32, 2));
 
-  CaseStatement c(b, create<BlockStatement>());
+  CaseStatement c(Source{}, b, create<BlockStatement>(Source{}));
   EXPECT_FALSE(c.IsDefault());
 }
 
 TEST_F(CaseStatementTest, IsCase) {
-  CaseStatement c(create<BlockStatement>());
+  CaseStatement c(Source{}, CaseSelectorList{},
+                  create<BlockStatement>(Source{}));
   EXPECT_TRUE(c.Is<CaseStatement>());
 }
 
 TEST_F(CaseStatementTest, IsValid) {
-  CaseStatement c(create<BlockStatement>());
+  CaseStatement c(Source{}, CaseSelectorList{},
+                  create<BlockStatement>(Source{}));
   EXPECT_TRUE(c.IsValid());
 }
 
@@ -110,11 +112,11 @@
   CaseSelectorList b;
   b.push_back(create<SintLiteral>(Source{}, &i32, 2));
 
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
   body->append(nullptr);
 
-  CaseStatement c(b, body);
+  CaseStatement c(Source{}, b, body);
   EXPECT_FALSE(c.IsValid());
 }
 
@@ -123,11 +125,12 @@
   CaseSelectorList b;
   b.push_back(create<SintLiteral>(Source{}, &i32, 2));
 
-  auto* body = create<BlockStatement>();
-  body->append(create<IfStatement>(Source{}, nullptr, create<BlockStatement>(),
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<IfStatement>(Source{}, nullptr,
+                                   create<BlockStatement>(Source{}),
                                    ElseStatementList{}));
 
-  CaseStatement c({b}, body);
+  CaseStatement c(Source{}, {b}, body);
   EXPECT_FALSE(c.IsValid());
 }
 
@@ -136,9 +139,9 @@
   CaseSelectorList b;
   b.push_back(create<SintLiteral>(Source{}, &i32, -2));
 
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
-  CaseStatement c({b}, body);
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
+  CaseStatement c(Source{}, {b}, body);
 
   std::ostringstream out;
   c.to_str(out, 2);
@@ -153,9 +156,9 @@
   CaseSelectorList b;
   b.push_back(create<UintLiteral>(Source{}, &u32, 2));
 
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
-  CaseStatement c({b}, body);
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
+  CaseStatement c(Source{}, {b}, body);
 
   std::ostringstream out;
   c.to_str(out, 2);
@@ -172,9 +175,9 @@
   b.push_back(create<SintLiteral>(Source{}, &i32, 1));
   b.push_back(create<SintLiteral>(Source{}, &i32, 2));
 
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
-  CaseStatement c(b, body);
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
+  CaseStatement c(Source{}, b, body);
 
   std::ostringstream out;
   c.to_str(out, 2);
@@ -185,9 +188,9 @@
 }
 
 TEST_F(CaseStatementTest, ToStr_WithoutSelectors) {
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
-  CaseStatement c(CaseSelectorList{}, body);
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
+  CaseStatement c(Source{}, CaseSelectorList{}, body);
 
   std::ostringstream out;
   c.to_str(out, 2);
diff --git a/src/ast/continue_statement.cc b/src/ast/continue_statement.cc
index 77377d4..4d1597b 100644
--- a/src/ast/continue_statement.cc
+++ b/src/ast/continue_statement.cc
@@ -22,8 +22,6 @@
 namespace tint {
 namespace ast {
 
-ContinueStatement::ContinueStatement() : Base() {}
-
 ContinueStatement::ContinueStatement(const Source& source) : Base(source) {}
 
 ContinueStatement::ContinueStatement(ContinueStatement&&) = default;
diff --git a/src/ast/continue_statement.h b/src/ast/continue_statement.h
index e68f9e6..1d4de24 100644
--- a/src/ast/continue_statement.h
+++ b/src/ast/continue_statement.h
@@ -27,8 +27,6 @@
 class ContinueStatement : public Castable<ContinueStatement, Statement> {
  public:
   /// Constructor
-  ContinueStatement();
-  /// Constructor
   /// @param source the continue statement source
   explicit ContinueStatement(const Source& source);
   /// Move constructor
diff --git a/src/ast/continue_statement_test.cc b/src/ast/continue_statement_test.cc
index 577d50b..5c15b80 100644
--- a/src/ast/continue_statement_test.cc
+++ b/src/ast/continue_statement_test.cc
@@ -30,17 +30,17 @@
 }
 
 TEST_F(ContinueStatementTest, IsContinue) {
-  ContinueStatement stmt;
+  ContinueStatement stmt(Source{});
   EXPECT_TRUE(stmt.Is<ContinueStatement>());
 }
 
 TEST_F(ContinueStatementTest, IsValid) {
-  ContinueStatement stmt;
+  ContinueStatement stmt(Source{});
   EXPECT_TRUE(stmt.IsValid());
 }
 
 TEST_F(ContinueStatementTest, ToStr) {
-  ContinueStatement stmt;
+  ContinueStatement stmt(Source{});
   std::ostringstream out;
   stmt.to_str(out, 2);
   EXPECT_EQ(out.str(), R"(  Continue{}
diff --git a/src/ast/discard_statement.cc b/src/ast/discard_statement.cc
index 66c0e19..cab164c 100644
--- a/src/ast/discard_statement.cc
+++ b/src/ast/discard_statement.cc
@@ -22,8 +22,6 @@
 namespace tint {
 namespace ast {
 
-DiscardStatement::DiscardStatement() : Base() {}
-
 DiscardStatement::DiscardStatement(const Source& source) : Base(source) {}
 
 DiscardStatement::DiscardStatement(DiscardStatement&&) = default;
diff --git a/src/ast/discard_statement.h b/src/ast/discard_statement.h
index c5afd77..8f17fd7 100644
--- a/src/ast/discard_statement.h
+++ b/src/ast/discard_statement.h
@@ -24,8 +24,6 @@
 class DiscardStatement : public Castable<DiscardStatement, Statement> {
  public:
   /// Constructor
-  DiscardStatement();
-  /// Constructor
   /// @param source the discard statement source
   explicit DiscardStatement(const Source& source);
   /// Move constructor
diff --git a/src/ast/discard_statement_test.cc b/src/ast/discard_statement_test.cc
index fdf444f..3cd5256 100644
--- a/src/ast/discard_statement_test.cc
+++ b/src/ast/discard_statement_test.cc
@@ -25,7 +25,7 @@
 using DiscardStatementTest = TestHelper;
 
 TEST_F(DiscardStatementTest, Creation) {
-  DiscardStatement stmt;
+  DiscardStatement stmt(Source{});
   EXPECT_EQ(stmt.source().range.begin.line, 0u);
   EXPECT_EQ(stmt.source().range.begin.column, 0u);
   EXPECT_EQ(stmt.source().range.end.line, 0u);
@@ -42,17 +42,17 @@
 }
 
 TEST_F(DiscardStatementTest, IsDiscard) {
-  DiscardStatement stmt;
+  DiscardStatement stmt(Source{});
   EXPECT_TRUE(stmt.Is<DiscardStatement>());
 }
 
 TEST_F(DiscardStatementTest, IsValid) {
-  DiscardStatement stmt;
+  DiscardStatement stmt(Source{});
   EXPECT_TRUE(stmt.IsValid());
 }
 
 TEST_F(DiscardStatementTest, ToStr) {
-  DiscardStatement stmt;
+  DiscardStatement stmt(Source{});
   std::ostringstream out;
   stmt.to_str(out, 2);
   EXPECT_EQ(out.str(), R"(  Discard{}
diff --git a/src/ast/else_statement.cc b/src/ast/else_statement.cc
index fbcc2ca..6a1a014 100644
--- a/src/ast/else_statement.cc
+++ b/src/ast/else_statement.cc
@@ -22,14 +22,6 @@
 namespace tint {
 namespace ast {
 
-ElseStatement::ElseStatement(BlockStatement* body) : Base(), body_(body) {}
-
-ElseStatement::ElseStatement(Expression* condition, BlockStatement* body)
-    : Base(), condition_(condition), body_(body) {}
-
-ElseStatement::ElseStatement(const Source& source, BlockStatement* body)
-    : Base(source), body_(body) {}
-
 ElseStatement::ElseStatement(const Source& source,
                              Expression* condition,
                              BlockStatement* body)
diff --git a/src/ast/else_statement.h b/src/ast/else_statement.h
index f39a1f0..6466720 100644
--- a/src/ast/else_statement.h
+++ b/src/ast/else_statement.h
@@ -30,17 +30,6 @@
 class ElseStatement : public Castable<ElseStatement, Statement> {
  public:
   /// Constructor
-  /// @param body the else body
-  explicit ElseStatement(BlockStatement* body);
-  /// Constructor
-  /// @param condition the else condition
-  /// @param body the else body
-  ElseStatement(Expression* condition, BlockStatement* body);
-  /// Constructor
-  /// @param source the source information
-  /// @param body the else body
-  ElseStatement(const Source& source, BlockStatement* body);
-  /// Constructor
   /// @param source the source information
   /// @param condition the else condition
   /// @param body the else body
diff --git a/src/ast/else_statement_test.cc b/src/ast/else_statement_test.cc
index 633ae86..c2ea1e8 100644
--- a/src/ast/else_statement_test.cc
+++ b/src/ast/else_statement_test.cc
@@ -31,26 +31,27 @@
   type::Bool bool_type;
   auto* cond = create<ScalarConstructorExpression>(
       Source{}, create<BoolLiteral>(Source{}, &bool_type, true));
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
   auto* discard = body->get(0);
 
-  ElseStatement e(cond, body);
+  ElseStatement e(Source{}, cond, body);
   EXPECT_EQ(e.condition(), cond);
   ASSERT_EQ(e.body()->size(), 1u);
   EXPECT_EQ(e.body()->get(0), discard);
 }
 
 TEST_F(ElseStatementTest, Creation_WithSource) {
-  ElseStatement e(Source{Source::Location{20, 2}}, create<BlockStatement>());
+  ElseStatement e(Source{Source::Location{20, 2}}, nullptr,
+                  create<BlockStatement>(Source{}));
   auto src = e.source();
   EXPECT_EQ(src.range.begin.line, 20u);
   EXPECT_EQ(src.range.begin.column, 2u);
 }
 
 TEST_F(ElseStatementTest, IsElse) {
-  ElseStatement e(create<BlockStatement>());
+  ElseStatement e(Source{}, nullptr, create<BlockStatement>(Source{}));
   EXPECT_TRUE(e.Is<ElseStatement>());
 }
 
@@ -58,49 +59,50 @@
   type::Bool bool_type;
   auto* cond = create<ScalarConstructorExpression>(
       Source{}, create<BoolLiteral>(Source{}, &bool_type, true));
-  ElseStatement e(cond, create<BlockStatement>());
+  ElseStatement e(Source{}, cond, create<BlockStatement>(Source{}));
   EXPECT_TRUE(e.HasCondition());
 }
 
 TEST_F(ElseStatementTest, HasContition_NullCondition) {
-  ElseStatement e(create<BlockStatement>());
+  ElseStatement e(Source{}, nullptr, create<BlockStatement>(Source{}));
   EXPECT_FALSE(e.HasCondition());
 }
 
 TEST_F(ElseStatementTest, IsValid) {
-  ElseStatement e(create<BlockStatement>());
+  ElseStatement e(Source{}, nullptr, create<BlockStatement>(Source{}));
   EXPECT_TRUE(e.IsValid());
 }
 
 TEST_F(ElseStatementTest, IsValid_WithBody) {
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
-  ElseStatement e(body);
+  ElseStatement e(Source{}, nullptr, body);
   EXPECT_TRUE(e.IsValid());
 }
 
 TEST_F(ElseStatementTest, IsValid_WithNullBodyStatement) {
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
   body->append(nullptr);
 
-  ElseStatement e(body);
+  ElseStatement e(Source{}, nullptr, body);
   EXPECT_FALSE(e.IsValid());
 }
 
 TEST_F(ElseStatementTest, IsValid_InvalidCondition) {
   auto* cond = create<ScalarConstructorExpression>(Source{}, nullptr);
-  ElseStatement e(cond, create<BlockStatement>());
+  ElseStatement e(Source{}, cond, create<BlockStatement>(Source{}));
   EXPECT_FALSE(e.IsValid());
 }
 
 TEST_F(ElseStatementTest, IsValid_InvalidBodyStatement) {
-  auto* body = create<BlockStatement>();
-  body->append(create<IfStatement>(Source{}, nullptr, create<BlockStatement>(),
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<IfStatement>(Source{}, nullptr,
+                                   create<BlockStatement>(Source{}),
                                    ElseStatementList{}));
 
-  ElseStatement e(body);
+  ElseStatement e(Source{}, nullptr, body);
   EXPECT_FALSE(e.IsValid());
 }
 
@@ -108,10 +110,10 @@
   type::Bool bool_type;
   auto* cond = create<ScalarConstructorExpression>(
       Source{}, create<BoolLiteral>(Source{}, &bool_type, true));
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
-  ElseStatement e(cond, body);
+  ElseStatement e(Source{}, cond, body);
   std::ostringstream out;
   e.to_str(out, 2);
   EXPECT_EQ(out.str(), R"(  Else{
@@ -126,10 +128,10 @@
 }
 
 TEST_F(ElseStatementTest, ToStr_NoCondition) {
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
-  ElseStatement e(body);
+  ElseStatement e(Source{}, nullptr, body);
   std::ostringstream out;
   e.to_str(out, 2);
   EXPECT_EQ(out.str(), R"(  Else{
diff --git a/src/ast/fallthrough_statement.cc b/src/ast/fallthrough_statement.cc
index 5aff216..db51488 100644
--- a/src/ast/fallthrough_statement.cc
+++ b/src/ast/fallthrough_statement.cc
@@ -22,8 +22,6 @@
 namespace tint {
 namespace ast {
 
-FallthroughStatement::FallthroughStatement() : Base() {}
-
 FallthroughStatement::FallthroughStatement(const Source& source)
     : Base(source) {}
 
diff --git a/src/ast/fallthrough_statement.h b/src/ast/fallthrough_statement.h
index 5f652bd..25d5870 100644
--- a/src/ast/fallthrough_statement.h
+++ b/src/ast/fallthrough_statement.h
@@ -24,8 +24,6 @@
 class FallthroughStatement : public Castable<FallthroughStatement, Statement> {
  public:
   /// Constructor
-  FallthroughStatement();
-  /// Constructor
   /// @param source the source information
   explicit FallthroughStatement(const Source& source);
   /// Move constructor
diff --git a/src/ast/fallthrough_statement_test.cc b/src/ast/fallthrough_statement_test.cc
index a41f5be..1e926dd 100644
--- a/src/ast/fallthrough_statement_test.cc
+++ b/src/ast/fallthrough_statement_test.cc
@@ -23,7 +23,7 @@
 using FallthroughStatementTest = TestHelper;
 
 TEST_F(FallthroughStatementTest, Creation) {
-  FallthroughStatement stmt;
+  FallthroughStatement stmt(Source{});
   EXPECT_EQ(stmt.source().range.begin.line, 0u);
   EXPECT_EQ(stmt.source().range.begin.column, 0u);
   EXPECT_EQ(stmt.source().range.end.line, 0u);
@@ -38,17 +38,17 @@
 }
 
 TEST_F(FallthroughStatementTest, IsFallthrough) {
-  FallthroughStatement stmt;
+  FallthroughStatement stmt(Source{});
   EXPECT_TRUE(stmt.Is<FallthroughStatement>());
 }
 
 TEST_F(FallthroughStatementTest, IsValid) {
-  FallthroughStatement stmt;
+  FallthroughStatement stmt(Source{});
   EXPECT_TRUE(stmt.IsValid());
 }
 
 TEST_F(FallthroughStatementTest, ToStr) {
-  FallthroughStatement stmt;
+  FallthroughStatement stmt(Source{});
   std::ostringstream out;
   stmt.to_str(out, 2);
   EXPECT_EQ(out.str(), R"(  Fallthrough{}
diff --git a/src/ast/function_test.cc b/src/ast/function_test.cc
index 89bc80a..f3439cc 100644
--- a/src/ast/function_test.cc
+++ b/src/ast/function_test.cc
@@ -44,7 +44,7 @@
   auto* var = params[0];
 
   Function f(Source{}, func_sym, "func", params, &void_type,
-             create<BlockStatement>(), FunctionDecorationList{});
+             create<BlockStatement>(Source{}), FunctionDecorationList{});
   EXPECT_EQ(f.symbol(), func_sym);
   EXPECT_EQ(f.name(), "func");
   ASSERT_EQ(f.params().size(), 1u);
@@ -64,7 +64,8 @@
                                     ast::VariableDecorationList{}));
 
   Function f(Source{Source::Location{20, 2}}, func_sym, "func", params,
-             &void_type, create<BlockStatement>(), FunctionDecorationList{});
+             &void_type, create<BlockStatement>(Source{}),
+             FunctionDecorationList{});
   auto src = f.source();
   EXPECT_EQ(src.range.begin.line, 20u);
   EXPECT_EQ(src.range.begin.column, 2u);
@@ -79,7 +80,7 @@
   Variable v(Source{}, "var", StorageClass::kInput, &i32, false, nullptr,
              ast::VariableDecorationList{});
   Function f(Source{}, func_sym, "func", VariableList{}, &void_type,
-             create<BlockStatement>(), FunctionDecorationList{});
+             create<BlockStatement>(Source{}), FunctionDecorationList{});
 
   f.add_referenced_module_variable(&v);
   ASSERT_EQ(f.referenced_module_variables().size(), 1u);
@@ -126,7 +127,7 @@
       });
 
   Function f(Source{}, func_sym, "func", VariableList{}, &void_type,
-             create<BlockStatement>(), FunctionDecorationList{});
+             create<BlockStatement>(Source{}), FunctionDecorationList{});
 
   f.add_referenced_module_variable(loc1);
   f.add_referenced_module_variable(builtin1);
@@ -173,7 +174,7 @@
       });
 
   Function f(Source{}, func_sym, "func", VariableList{}, &void_type,
-             create<BlockStatement>(), FunctionDecorationList{});
+             create<BlockStatement>(Source{}), FunctionDecorationList{});
 
   f.add_referenced_module_variable(loc1);
   f.add_referenced_module_variable(builtin1);
@@ -196,7 +197,7 @@
   auto main_sym = mod.RegisterSymbol("main");
 
   Function f(Source{}, func_sym, "func", VariableList{}, &void_type,
-             create<BlockStatement>(), FunctionDecorationList{});
+             create<BlockStatement>(Source{}), FunctionDecorationList{});
 
   f.add_ancestor_entry_point(main_sym);
   ASSERT_EQ(1u, f.ancestor_entry_points().size());
@@ -218,8 +219,8 @@
                                     false, nullptr,
                                     ast::VariableDecorationList{}));
 
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
   Function f(Source{}, func_sym, "func", params, &void_type, body,
              FunctionDecorationList{});
@@ -237,8 +238,8 @@
                                     false, nullptr,
                                     ast::VariableDecorationList{}));
 
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
   Function f(Source{}, func_sym, "", params, &void_type, body,
              FunctionDecorationList{});
@@ -256,7 +257,7 @@
                                     ast::VariableDecorationList{}));
 
   Function f(Source{}, func_sym, "func", params, nullptr,
-             create<BlockStatement>(), FunctionDecorationList{});
+             create<BlockStatement>(Source{}), FunctionDecorationList{});
   EXPECT_FALSE(f.IsValid());
 }
 
@@ -273,7 +274,7 @@
   params.push_back(nullptr);
 
   Function f(Source{}, func_sym, "func", params, &void_type,
-             create<BlockStatement>(), FunctionDecorationList{});
+             create<BlockStatement>(Source{}), FunctionDecorationList{});
   EXPECT_FALSE(f.IsValid());
 }
 
@@ -288,7 +289,7 @@
                                     ast::VariableDecorationList{}));
 
   Function f(Source{}, func_sym, "func", params, &void_type,
-             create<BlockStatement>(), FunctionDecorationList{});
+             create<BlockStatement>(Source{}), FunctionDecorationList{});
   EXPECT_FALSE(f.IsValid());
 }
 
@@ -303,8 +304,8 @@
                                     false, nullptr,
                                     ast::VariableDecorationList{}));
 
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
   body->append(nullptr);
 
   Function f(Source{}, func_sym, "func", params, &void_type, body,
@@ -324,8 +325,8 @@
                                     false, nullptr,
                                     ast::VariableDecorationList{}));
 
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
   body->append(nullptr);
 
   Function f(Source{}, func_sym, "func", params, &void_type, body,
@@ -339,8 +340,8 @@
 
   auto func_sym = mod.RegisterSymbol("func");
 
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
   Function f(Source{}, func_sym, "func", {}, &void_type, body,
              FunctionDecorationList{});
@@ -361,8 +362,8 @@
 
   auto func_sym = mod.RegisterSymbol("func");
 
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
   Function f(
       Source{}, func_sym, "func", {}, &void_type, body,
@@ -390,8 +391,8 @@
                                     false, nullptr,
                                     ast::VariableDecorationList{}));
 
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
   Function f(Source{}, func_sym, "func", params, &void_type, body,
              FunctionDecorationList{});
@@ -418,7 +419,7 @@
   auto func_sym = mod.RegisterSymbol("func");
 
   Function f(Source{}, func_sym, "func", {}, &void_type,
-             create<BlockStatement>(), FunctionDecorationList{});
+             create<BlockStatement>(Source{}), FunctionDecorationList{});
   EXPECT_EQ(f.type_name(), "__func__void");
 }
 
@@ -438,7 +439,7 @@
                                     ast::VariableDecorationList{}));
 
   Function f(Source{}, func_sym, "func", params, &void_type,
-             create<BlockStatement>(), FunctionDecorationList{});
+             create<BlockStatement>(Source{}), FunctionDecorationList{});
   EXPECT_EQ(f.type_name(), "__func__void__i32__f32");
 }
 
@@ -448,8 +449,8 @@
   auto func_sym = mod.RegisterSymbol("func");
 
   VariableList params;
-  auto* body = create<BlockStatement>();
-  auto* stmt = create<DiscardStatement>();
+  auto* body = create<BlockStatement>(Source{});
+  auto* stmt = create<DiscardStatement>(Source{});
   body->append(stmt);
   Function f(Source{}, func_sym, "func", params, &void_type, body,
              FunctionDecorationList{});
@@ -463,7 +464,7 @@
   auto func_sym = mod.RegisterSymbol("func");
 
   VariableList params;
-  auto* body = create<BlockStatement>();
+  auto* body = create<BlockStatement>(Source{});
   Function f(Source{}, func_sym, "func", params, &void_type, body,
              FunctionDecorationList{});
 
@@ -476,7 +477,7 @@
   auto func_sym = mod.RegisterSymbol("func");
 
   Function f(Source{}, func_sym, "func", {}, &void_type,
-             create<BlockStatement>(), FunctionDecorationList{});
+             create<BlockStatement>(Source{}), FunctionDecorationList{});
   uint32_t x = 0;
   uint32_t y = 0;
   uint32_t z = 0;
@@ -492,7 +493,7 @@
   auto func_sym = mod.RegisterSymbol("func");
 
   Function f(Source{}, func_sym, "func", {}, &void_type,
-             create<BlockStatement>(),
+             create<BlockStatement>(Source{}),
              {create<WorkgroupDecoration>(2u, 4u, 6u, Source{})});
 
   uint32_t x = 0;
diff --git a/src/ast/if_statement_test.cc b/src/ast/if_statement_test.cc
index b7814e4..7c7c777 100644
--- a/src/ast/if_statement_test.cc
+++ b/src/ast/if_statement_test.cc
@@ -27,8 +27,8 @@
 TEST_F(IfStatementTest, Creation) {
   auto* cond = create<IdentifierExpression>(Source{},
                                             mod.RegisterSymbol("cond"), "cond");
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
   IfStatement stmt(Source{Source::Location{20, 2}}, cond, body,
                    ElseStatementList{});
@@ -38,7 +38,7 @@
 }
 
 TEST_F(IfStatementTest, IsIf) {
-  IfStatement stmt(Source{}, nullptr, create<BlockStatement>(),
+  IfStatement stmt(Source{}, nullptr, create<BlockStatement>(Source{}),
                    ElseStatementList{});
   EXPECT_TRUE(stmt.Is<IfStatement>());
 }
@@ -46,8 +46,8 @@
 TEST_F(IfStatementTest, IsValid) {
   auto* cond = create<IdentifierExpression>(Source{},
                                             mod.RegisterSymbol("cond"), "cond");
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
   IfStatement stmt(Source{}, cond, body, ElseStatementList{});
   EXPECT_TRUE(stmt.IsValid());
@@ -56,23 +56,25 @@
 TEST_F(IfStatementTest, IsValid_WithElseStatements) {
   auto* cond = create<IdentifierExpression>(Source{},
                                             mod.RegisterSymbol("cond"), "cond");
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
   IfStatement stmt(Source{}, cond, body,
                    {
                        create<ElseStatement>(
+                           Source{},
                            create<IdentifierExpression>(
                                Source{}, mod.RegisterSymbol("Ident"), "Ident"),
-                           create<BlockStatement>()),
-                       create<ElseStatement>(create<BlockStatement>()),
+                           create<BlockStatement>(Source{})),
+                       create<ElseStatement>(Source{}, nullptr,
+                                             create<BlockStatement>(Source{})),
                    });
   EXPECT_TRUE(stmt.IsValid());
 }
 
 TEST_F(IfStatementTest, IsValid_MissingCondition) {
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
   IfStatement stmt(Source{}, nullptr, body, ElseStatementList{});
   EXPECT_FALSE(stmt.IsValid());
@@ -81,8 +83,8 @@
 TEST_F(IfStatementTest, IsValid_InvalidCondition) {
   auto* cond =
       create<IdentifierExpression>(Source{}, mod.RegisterSymbol(""), "");
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
   IfStatement stmt(Source{}, cond, body, ElseStatementList{});
   EXPECT_FALSE(stmt.IsValid());
@@ -91,8 +93,8 @@
 TEST_F(IfStatementTest, IsValid_NullBodyStatement) {
   auto* cond = create<IdentifierExpression>(Source{},
                                             mod.RegisterSymbol("cond"), "cond");
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
   body->append(nullptr);
 
   IfStatement stmt(Source{}, cond, body, ElseStatementList{});
@@ -102,9 +104,10 @@
 TEST_F(IfStatementTest, IsValid_InvalidBodyStatement) {
   auto* cond = create<IdentifierExpression>(Source{},
                                             mod.RegisterSymbol("cond"), "cond");
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
-  body->append(create<IfStatement>(Source{}, nullptr, create<BlockStatement>(),
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
+  body->append(create<IfStatement>(Source{}, nullptr,
+                                   create<BlockStatement>(Source{}),
                                    ast::ElseStatementList{}));
 
   IfStatement stmt(Source{}, cond, body, ElseStatementList{});
@@ -114,16 +117,18 @@
 TEST_F(IfStatementTest, IsValid_NullElseStatement) {
   auto* cond = create<IdentifierExpression>(Source{},
                                             mod.RegisterSymbol("cond"), "cond");
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
   IfStatement stmt(Source{}, cond, body,
                    {
                        create<ElseStatement>(
+                           Source{},
                            create<IdentifierExpression>(
                                Source{}, mod.RegisterSymbol("Ident"), "Ident"),
-                           create<BlockStatement>()),
-                       create<ElseStatement>(create<BlockStatement>()),
+                           create<BlockStatement>(Source{})),
+                       create<ElseStatement>(Source{}, nullptr,
+                                             create<BlockStatement>(Source{})),
                        nullptr,
                    });
   EXPECT_FALSE(stmt.IsValid());
@@ -132,15 +137,16 @@
 TEST_F(IfStatementTest, IsValid_InvalidElseStatement) {
   auto* cond = create<IdentifierExpression>(Source{},
                                             mod.RegisterSymbol("cond"), "cond");
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
   IfStatement stmt(
       Source{}, cond, body,
       {
-          create<ElseStatement>(create<IdentifierExpression>(
+          create<ElseStatement>(Source{},
+                                create<IdentifierExpression>(
                                     Source{}, mod.RegisterSymbol(""), ""),
-                                create<BlockStatement>()),
+                                create<BlockStatement>(Source{})),
       });
   EXPECT_FALSE(stmt.IsValid());
 }
@@ -148,13 +154,15 @@
 TEST_F(IfStatementTest, IsValid_MultipleElseWiththoutCondition) {
   auto* cond = create<IdentifierExpression>(Source{},
                                             mod.RegisterSymbol("cond"), "cond");
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
   IfStatement stmt(Source{}, cond, body,
                    {
-                       create<ElseStatement>(create<BlockStatement>()),
-                       create<ElseStatement>(create<BlockStatement>()),
+                       create<ElseStatement>(Source{}, nullptr,
+                                             create<BlockStatement>(Source{})),
+                       create<ElseStatement>(Source{}, nullptr,
+                                             create<BlockStatement>(Source{})),
                    });
   EXPECT_FALSE(stmt.IsValid());
 }
@@ -162,16 +170,18 @@
 TEST_F(IfStatementTest, IsValid_ElseNotLast) {
   auto* cond = create<IdentifierExpression>(Source{},
                                             mod.RegisterSymbol("cond"), "cond");
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
   IfStatement stmt(Source{}, cond, body,
                    {
-                       create<ElseStatement>(create<BlockStatement>()),
+                       create<ElseStatement>(Source{}, nullptr,
+                                             create<BlockStatement>(Source{})),
                        create<ElseStatement>(
+                           Source{},
                            create<IdentifierExpression>(
                                Source{}, mod.RegisterSymbol("ident"), "ident"),
-                           create<BlockStatement>()),
+                           create<BlockStatement>(Source{})),
                    });
   EXPECT_FALSE(stmt.IsValid());
 }
@@ -179,8 +189,8 @@
 TEST_F(IfStatementTest, ToStr) {
   auto* cond = create<IdentifierExpression>(Source{},
                                             mod.RegisterSymbol("cond"), "cond");
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
   IfStatement stmt(Source{}, cond, body, ElseStatementList{});
 
@@ -200,23 +210,24 @@
 TEST_F(IfStatementTest, ToStr_WithElseStatements) {
   auto* cond = create<IdentifierExpression>(Source{},
                                             mod.RegisterSymbol("cond"), "cond");
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
-  auto* else_if_body = create<BlockStatement>();
-  else_if_body->append(create<DiscardStatement>());
+  auto* else_if_body = create<BlockStatement>(Source{});
+  else_if_body->append(create<DiscardStatement>(Source{}));
 
-  auto* else_body = create<BlockStatement>();
-  else_body->append(create<DiscardStatement>());
-  else_body->append(create<DiscardStatement>());
+  auto* else_body = create<BlockStatement>(Source{});
+  else_body->append(create<DiscardStatement>(Source{}));
+  else_body->append(create<DiscardStatement>(Source{}));
 
   IfStatement stmt(Source{}, cond, body,
                    {
                        create<ElseStatement>(
+                           Source{},
                            create<IdentifierExpression>(
                                Source{}, mod.RegisterSymbol("ident"), "ident"),
                            else_if_body),
-                       create<ElseStatement>(else_body),
+                       create<ElseStatement>(Source{}, nullptr, else_body),
                    });
 
   std::ostringstream out;
diff --git a/src/ast/loop_statement.cc b/src/ast/loop_statement.cc
index 014d0ae..9549cc0 100644
--- a/src/ast/loop_statement.cc
+++ b/src/ast/loop_statement.cc
@@ -22,9 +22,6 @@
 namespace tint {
 namespace ast {
 
-LoopStatement::LoopStatement(BlockStatement* body, BlockStatement* continuing)
-    : Base(), body_(body), continuing_(continuing) {}
-
 LoopStatement::LoopStatement(const Source& source,
                              BlockStatement* body,
                              BlockStatement* continuing)
diff --git a/src/ast/loop_statement.h b/src/ast/loop_statement.h
index 64e1140..6eb4b39 100644
--- a/src/ast/loop_statement.h
+++ b/src/ast/loop_statement.h
@@ -28,10 +28,6 @@
 class LoopStatement : public Castable<LoopStatement, Statement> {
  public:
   /// Constructor
-  /// @param body the body statements
-  /// @param continuing the continuing statements
-  LoopStatement(BlockStatement* body, BlockStatement* continuing);
-  /// Constructor
   /// @param source the loop statement source
   /// @param body the body statements
   /// @param continuing the continuing statements
diff --git a/src/ast/loop_statement_test.cc b/src/ast/loop_statement_test.cc
index 63d4e13..4588d01 100644
--- a/src/ast/loop_statement_test.cc
+++ b/src/ast/loop_statement_test.cc
@@ -28,14 +28,14 @@
 using LoopStatementTest = TestHelper;
 
 TEST_F(LoopStatementTest, Creation) {
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
   auto* b = body->last();
 
-  auto* continuing = create<BlockStatement>();
-  continuing->append(create<DiscardStatement>());
+  auto* continuing = create<BlockStatement>(Source{});
+  continuing->append(create<DiscardStatement>(Source{}));
 
-  LoopStatement l(body, continuing);
+  LoopStatement l(Source{}, body, continuing);
   ASSERT_EQ(l.body()->size(), 1u);
   EXPECT_EQ(l.body()->get(0), b);
   ASSERT_EQ(l.continuing()->size(), 1u);
@@ -43,11 +43,11 @@
 }
 
 TEST_F(LoopStatementTest, Creation_WithSource) {
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
-  auto* continuing = create<BlockStatement>();
-  continuing->append(create<DiscardStatement>());
+  auto* continuing = create<BlockStatement>(Source{});
+  continuing->append(create<DiscardStatement>(Source{}));
 
   LoopStatement l(Source{Source::Location{20, 2}}, body, continuing);
   auto src = l.source();
@@ -56,108 +56,112 @@
 }
 
 TEST_F(LoopStatementTest, IsLoop) {
-  LoopStatement l(create<BlockStatement>(), create<BlockStatement>());
+  LoopStatement l(Source{}, create<BlockStatement>(Source{}),
+                  create<BlockStatement>(Source{}));
   EXPECT_TRUE(l.Is<LoopStatement>());
 }
 
 TEST_F(LoopStatementTest, HasContinuing_WithoutContinuing) {
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
-  LoopStatement l(body, {});
+  LoopStatement l(Source{}, body, {});
   EXPECT_FALSE(l.has_continuing());
 }
 
 TEST_F(LoopStatementTest, HasContinuing_WithContinuing) {
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
-  auto* continuing = create<BlockStatement>();
-  continuing->append(create<DiscardStatement>());
+  auto* continuing = create<BlockStatement>(Source{});
+  continuing->append(create<DiscardStatement>(Source{}));
 
-  LoopStatement l(body, continuing);
+  LoopStatement l(Source{}, body, continuing);
   EXPECT_TRUE(l.has_continuing());
 }
 
 TEST_F(LoopStatementTest, IsValid) {
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
-  auto* continuing = create<BlockStatement>();
-  continuing->append(create<DiscardStatement>());
+  auto* continuing = create<BlockStatement>(Source{});
+  continuing->append(create<DiscardStatement>(Source{}));
 
-  LoopStatement l(body, continuing);
+  LoopStatement l(Source{}, body, continuing);
   EXPECT_TRUE(l.IsValid());
 }
 
 TEST_F(LoopStatementTest, IsValid_WithoutContinuing) {
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
-  LoopStatement l(body, create<BlockStatement>());
+  LoopStatement l(Source{}, body, create<BlockStatement>(Source{}));
   EXPECT_TRUE(l.IsValid());
 }
 
 TEST_F(LoopStatementTest, IsValid_WithoutBody) {
-  LoopStatement l(create<BlockStatement>(), create<BlockStatement>());
+  LoopStatement l(Source{}, create<BlockStatement>(Source{}),
+                  create<BlockStatement>(Source{}));
   EXPECT_TRUE(l.IsValid());
 }
 
 TEST_F(LoopStatementTest, IsValid_NullBodyStatement) {
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
   body->append(nullptr);
 
-  auto* continuing = create<BlockStatement>();
-  continuing->append(create<DiscardStatement>());
+  auto* continuing = create<BlockStatement>(Source{});
+  continuing->append(create<DiscardStatement>(Source{}));
 
-  LoopStatement l(body, continuing);
+  LoopStatement l(Source{}, body, continuing);
   EXPECT_FALSE(l.IsValid());
 }
 
 TEST_F(LoopStatementTest, IsValid_InvalidBodyStatement) {
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
-  body->append(create<IfStatement>(Source{}, nullptr, create<BlockStatement>(),
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
+  body->append(create<IfStatement>(Source{}, nullptr,
+                                   create<BlockStatement>(Source{}),
                                    ElseStatementList{}));
 
-  auto* continuing = create<BlockStatement>();
-  continuing->append(create<DiscardStatement>());
+  auto* continuing = create<BlockStatement>(Source{});
+  continuing->append(create<DiscardStatement>(Source{}));
 
-  LoopStatement l(body, continuing);
+  LoopStatement l(Source{}, body, continuing);
   EXPECT_FALSE(l.IsValid());
 }
 
 TEST_F(LoopStatementTest, IsValid_NullContinuingStatement) {
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
-  auto* continuing = create<BlockStatement>();
-  continuing->append(create<DiscardStatement>());
+  auto* continuing = create<BlockStatement>(Source{});
+  continuing->append(create<DiscardStatement>(Source{}));
   continuing->append(nullptr);
 
-  LoopStatement l(body, continuing);
+  LoopStatement l(Source{}, body, continuing);
   EXPECT_FALSE(l.IsValid());
 }
 
 TEST_F(LoopStatementTest, IsValid_InvalidContinuingStatement) {
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
-  auto* continuing = create<BlockStatement>();
-  continuing->append(create<DiscardStatement>());
-  continuing->append(create<IfStatement>(
-      Source{}, nullptr, create<BlockStatement>(), ElseStatementList{}));
+  auto* continuing = create<BlockStatement>(Source{});
+  continuing->append(create<DiscardStatement>(Source{}));
+  continuing->append(create<IfStatement>(Source{}, nullptr,
+                                         create<BlockStatement>(Source{}),
+                                         ElseStatementList{}));
 
-  LoopStatement l(body, continuing);
+  LoopStatement l(Source{}, body, continuing);
   EXPECT_FALSE(l.IsValid());
 }
 
 TEST_F(LoopStatementTest, ToStr) {
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
-  LoopStatement l(body, {});
+  LoopStatement l(Source{}, body, {});
   std::ostringstream out;
   l.to_str(out, 2);
   EXPECT_EQ(out.str(), R"(  Loop{
@@ -167,13 +171,13 @@
 }
 
 TEST_F(LoopStatementTest, ToStr_WithContinuing) {
-  auto* body = create<BlockStatement>();
-  body->append(create<DiscardStatement>());
+  auto* body = create<BlockStatement>(Source{});
+  body->append(create<DiscardStatement>(Source{}));
 
-  auto* continuing = create<BlockStatement>();
-  continuing->append(create<DiscardStatement>());
+  auto* continuing = create<BlockStatement>(Source{});
+  continuing->append(create<DiscardStatement>(Source{}));
 
-  LoopStatement l(body, continuing);
+  LoopStatement l(Source{}, body, continuing);
   std::ostringstream out;
   l.to_str(out, 2);
   EXPECT_EQ(out.str(), R"(  Loop{
diff --git a/src/ast/module_test.cc b/src/ast/module_test.cc
index 534a258..cab119b 100644
--- a/src/ast/module_test.cc
+++ b/src/ast/module_test.cc
@@ -49,9 +49,9 @@
   Module m;
 
   auto func_sym = m.RegisterSymbol("main");
-  auto* func =
-      create<Function>(Source{}, func_sym, "main", VariableList{}, &f32,
-                       create<BlockStatement>(), ast::FunctionDecorationList{});
+  auto* func = create<Function>(Source{}, func_sym, "main", VariableList{},
+                                &f32, create<BlockStatement>(Source{}),
+                                ast::FunctionDecorationList{});
   m.AddFunction(func);
   EXPECT_EQ(func, m.FindFunctionBySymbol(func_sym));
 }
@@ -131,9 +131,9 @@
 
   Module m;
 
-  auto* func = create<Function>(Source{}, m.RegisterSymbol("main"), "main",
-                                VariableList(), &f32, create<BlockStatement>(),
-                                ast::FunctionDecorationList{});
+  auto* func = create<Function>(
+      Source{}, m.RegisterSymbol("main"), "main", VariableList(), &f32,
+      create<BlockStatement>(Source{}), ast::FunctionDecorationList{});
   m.AddFunction(func);
   EXPECT_TRUE(m.IsValid());
 }
diff --git a/src/ast/statement.cc b/src/ast/statement.cc
index 9abbba0..cef7a9a 100644
--- a/src/ast/statement.cc
+++ b/src/ast/statement.cc
@@ -36,8 +36,6 @@
 namespace tint {
 namespace ast {
 
-Statement::Statement() = default;
-
 Statement::Statement(const Source& source) : Base(source) {}
 
 Statement::Statement(Statement&&) = default;
diff --git a/src/ast/statement.h b/src/ast/statement.h
index b38c74c..baff8d9 100644
--- a/src/ast/statement.h
+++ b/src/ast/statement.h
@@ -33,8 +33,6 @@
 
  protected:
   /// Constructor
-  Statement();
-  /// Constructor
   /// @param source the source of the expression
   explicit Statement(const Source& source);
   /// Move constructor
diff --git a/src/ast/switch_statement.cc b/src/ast/switch_statement.cc
index 8634ed4..51cc0bf 100644
--- a/src/ast/switch_statement.cc
+++ b/src/ast/switch_statement.cc
@@ -23,9 +23,6 @@
 namespace tint {
 namespace ast {
 
-SwitchStatement::SwitchStatement(Expression* condition, CaseStatementList body)
-    : condition_(condition), body_(body) {}
-
 SwitchStatement::SwitchStatement(const Source& source,
                                  Expression* condition,
                                  CaseStatementList body)
diff --git a/src/ast/switch_statement.h b/src/ast/switch_statement.h
index 22f0b3e..917d6aa 100644
--- a/src/ast/switch_statement.h
+++ b/src/ast/switch_statement.h
@@ -30,10 +30,6 @@
 class SwitchStatement : public Castable<SwitchStatement, Statement> {
  public:
   /// Constructor
-  /// @param condition the switch condition
-  /// @param body the switch body
-  SwitchStatement(Expression* condition, CaseStatementList body);
-  /// Constructor
   /// @param source the source information
   /// @param condition the switch condition
   /// @param body the switch body
diff --git a/src/ast/switch_statement_test.cc b/src/ast/switch_statement_test.cc
index e0746f0..9a73e39 100644
--- a/src/ast/switch_statement_test.cc
+++ b/src/ast/switch_statement_test.cc
@@ -37,10 +37,11 @@
   auto* ident = create<IdentifierExpression>(
       Source{}, mod.RegisterSymbol("ident"), "ident");
   CaseStatementList body;
-  auto* case_stmt = create<CaseStatement>(lit, create<BlockStatement>());
+  auto* case_stmt =
+      create<CaseStatement>(Source{}, lit, create<BlockStatement>(Source{}));
   body.push_back(case_stmt);
 
-  SwitchStatement stmt(ident, body);
+  SwitchStatement stmt(Source{}, ident, body);
   EXPECT_EQ(stmt.condition(), ident);
   ASSERT_EQ(stmt.body().size(), 1u);
   EXPECT_EQ(stmt.body()[0], case_stmt);
@@ -66,9 +67,10 @@
   auto* ident = create<IdentifierExpression>(
       Source{}, mod.RegisterSymbol("ident"), "ident");
   CaseStatementList body;
-  body.push_back(create<CaseStatement>(lit, create<BlockStatement>()));
+  body.push_back(
+      create<CaseStatement>(Source{}, lit, create<BlockStatement>(Source{})));
 
-  SwitchStatement stmt(ident, body);
+  SwitchStatement stmt(Source{}, ident, body);
   EXPECT_TRUE(stmt.Is<SwitchStatement>());
 }
 
@@ -81,9 +83,10 @@
   auto* ident = create<IdentifierExpression>(
       Source{}, mod.RegisterSymbol("ident"), "ident");
   CaseStatementList body;
-  body.push_back(create<CaseStatement>(lit, create<BlockStatement>()));
+  body.push_back(
+      create<CaseStatement>(Source{}, lit, create<BlockStatement>(Source{})));
 
-  SwitchStatement stmt(ident, body);
+  SwitchStatement stmt(Source{}, ident, body);
   EXPECT_TRUE(stmt.IsValid());
 }
 
@@ -94,9 +97,10 @@
   lit.push_back(create<SintLiteral>(Source{}, &i32, 2));
 
   CaseStatementList body;
-  body.push_back(create<CaseStatement>(lit, create<BlockStatement>()));
+  body.push_back(
+      create<CaseStatement>(Source{}, lit, create<BlockStatement>(Source{})));
 
-  SwitchStatement stmt(nullptr, body);
+  SwitchStatement stmt(Source{}, nullptr, body);
   EXPECT_FALSE(stmt.IsValid());
 }
 
@@ -109,9 +113,10 @@
   auto* ident =
       create<IdentifierExpression>(Source{}, mod.RegisterSymbol(""), "");
   CaseStatementList body;
-  body.push_back(create<CaseStatement>(lit, create<BlockStatement>()));
+  body.push_back(
+      create<CaseStatement>(Source{}, lit, create<BlockStatement>(Source{})));
 
-  SwitchStatement stmt(ident, body);
+  SwitchStatement stmt(Source{}, ident, body);
   EXPECT_FALSE(stmt.IsValid());
 }
 
@@ -124,10 +129,11 @@
   auto* ident = create<IdentifierExpression>(
       Source{}, mod.RegisterSymbol("ident"), "ident");
   CaseStatementList body;
-  body.push_back(create<CaseStatement>(lit, create<BlockStatement>()));
+  body.push_back(
+      create<CaseStatement>(Source{}, lit, create<BlockStatement>(Source{})));
   body.push_back(nullptr);
 
-  SwitchStatement stmt(ident, body);
+  SwitchStatement stmt(Source{}, ident, body);
   EXPECT_FALSE(stmt.IsValid());
 }
 
@@ -135,13 +141,14 @@
   auto* ident = create<IdentifierExpression>(
       Source{}, mod.RegisterSymbol("ident"), "ident");
 
-  auto* case_body = create<BlockStatement>();
+  auto* case_body = create<BlockStatement>(Source{});
   case_body->append(nullptr);
 
   CaseStatementList body;
-  body.push_back(create<CaseStatement>(CaseSelectorList{}, case_body));
+  body.push_back(
+      create<CaseStatement>(Source{}, CaseSelectorList{}, case_body));
 
-  SwitchStatement stmt(ident, body);
+  SwitchStatement stmt(Source{}, ident, body);
   EXPECT_FALSE(stmt.IsValid());
 }
 
@@ -149,7 +156,7 @@
   auto* ident = create<IdentifierExpression>(
       Source{}, mod.RegisterSymbol("ident"), "ident");
 
-  SwitchStatement stmt(ident, {});
+  SwitchStatement stmt(Source{}, ident, {});
   std::ostringstream out;
   stmt.to_str(out, 2);
   EXPECT_EQ(demangle(out.str()), R"(  Switch{
@@ -169,9 +176,10 @@
   auto* ident = create<IdentifierExpression>(
       Source{}, mod.RegisterSymbol("ident"), "ident");
   CaseStatementList body;
-  body.push_back(create<CaseStatement>(lit, create<BlockStatement>()));
+  body.push_back(
+      create<CaseStatement>(Source{}, lit, create<BlockStatement>(Source{})));
 
-  SwitchStatement stmt(ident, body);
+  SwitchStatement stmt(Source{}, ident, body);
   std::ostringstream out;
   stmt.to_str(out, 2);
   EXPECT_EQ(demangle(out.str()), R"(  Switch{
diff --git a/src/ast/variable_decl_statement.cc b/src/ast/variable_decl_statement.cc
index 83b4b7c..f5eb50f 100644
--- a/src/ast/variable_decl_statement.cc
+++ b/src/ast/variable_decl_statement.cc
@@ -22,9 +22,6 @@
 namespace tint {
 namespace ast {
 
-VariableDeclStatement::VariableDeclStatement(Variable* variable)
-    : Base(), variable_(variable) {}
-
 VariableDeclStatement::VariableDeclStatement(const Source& source,
                                              Variable* variable)
     : Base(source), variable_(variable) {}
diff --git a/src/ast/variable_decl_statement.h b/src/ast/variable_decl_statement.h
index 6ec3748..88bef80 100644
--- a/src/ast/variable_decl_statement.h
+++ b/src/ast/variable_decl_statement.h
@@ -30,9 +30,6 @@
     : public Castable<VariableDeclStatement, Statement> {
  public:
   /// Constructor
-  /// @param variable the variable
-  explicit VariableDeclStatement(Variable* variable);
-  /// Constructor
   /// @param source the variable statement source
   /// @param variable the variable
   VariableDeclStatement(const Source& source, Variable* variable);
diff --git a/src/ast/variable_decl_statement_test.cc b/src/ast/variable_decl_statement_test.cc
index 3ef7a4b..edc7d97 100644
--- a/src/ast/variable_decl_statement_test.cc
+++ b/src/ast/variable_decl_statement_test.cc
@@ -29,7 +29,7 @@
   auto* var = create<Variable>(Source{}, "a", StorageClass::kNone, &f32, false,
                                nullptr, ast::VariableDecorationList{});
 
-  VariableDeclStatement stmt(var);
+  VariableDeclStatement stmt(Source{}, var);
   EXPECT_EQ(stmt.variable(), var);
 }
 
@@ -49,15 +49,15 @@
   auto* var = create<Variable>(Source{}, "a", StorageClass::kNone, &f32, false,
                                nullptr, ast::VariableDecorationList{});
 
-  VariableDeclStatement s(var);
-  EXPECT_TRUE(s.Is<VariableDeclStatement>());
+  VariableDeclStatement stmt(Source{}, var);
+  EXPECT_TRUE(stmt.Is<VariableDeclStatement>());
 }
 
 TEST_F(VariableDeclStatementTest, IsValid) {
   type::F32 f32;
   auto* var = create<Variable>(Source{}, "a", StorageClass::kNone, &f32, false,
                                nullptr, ast::VariableDecorationList{});
-  VariableDeclStatement stmt(var);
+  VariableDeclStatement stmt(Source{}, var);
   EXPECT_TRUE(stmt.IsValid());
 }
 
@@ -65,12 +65,12 @@
   type::F32 f32;
   auto* var = create<Variable>(Source{}, "", StorageClass::kNone, &f32, false,
                                nullptr, ast::VariableDecorationList{});
-  VariableDeclStatement stmt(var);
+  VariableDeclStatement stmt(Source{}, var);
   EXPECT_FALSE(stmt.IsValid());
 }
 
 TEST_F(VariableDeclStatementTest, IsValid_NullVariable) {
-  VariableDeclStatement stmt(nullptr);
+  VariableDeclStatement stmt(Source{}, nullptr);
   EXPECT_FALSE(stmt.IsValid());
 }
 
diff --git a/src/inspector/inspector_test.cc b/src/inspector/inspector_test.cc
index 6600f73..5c7904e 100644
--- a/src/inspector/inspector_test.cc
+++ b/src/inspector/inspector_test.cc
@@ -81,7 +81,7 @@
   ast::Function* MakeEmptyBodyFunction(
       std::string name,
       ast::FunctionDecorationList decorations = {}) {
-    auto* body = create<ast::BlockStatement>();
+    auto* body = create<ast::BlockStatement>(Source{});
     body->append(create<ast::ReturnStatement>(Source{}));
     return create<ast::Function>(Source{}, mod()->RegisterSymbol(name), name,
                                  ast::VariableList(), void_type(), body,
@@ -97,12 +97,12 @@
       std::string caller,
       std::string callee,
       ast::FunctionDecorationList decorations = {}) {
-    auto* body = create<ast::BlockStatement>();
+    auto* body = create<ast::BlockStatement>(Source{});
     auto* ident_expr = create<ast::IdentifierExpression>(
         Source{}, mod()->RegisterSymbol(callee), callee);
     auto* call_expr = create<ast::CallExpression>(Source{}, ident_expr,
                                                   ast::ExpressionList());
-    body->append(create<ast::CallStatement>(call_expr));
+    body->append(create<ast::CallStatement>(Source{}, call_expr));
     body->append(create<ast::ReturnStatement>(Source{}));
     return create<ast::Function>(Source{}, mod()->RegisterSymbol(caller),
                                  caller, ast::VariableList(), void_type(), body,
@@ -148,11 +148,12 @@
       std::string name,
       std::vector<std::tuple<std::string, std::string>> inout_vars,
       ast::FunctionDecorationList decorations = {}) {
-    auto* body = create<ast::BlockStatement>();
+    auto* body = create<ast::BlockStatement>(Source{});
     for (auto inout : inout_vars) {
       std::string in, out;
       std::tie(in, out) = inout;
       body->append(create<ast::AssignmentStatement>(
+          Source{},
           create<ast::IdentifierExpression>(Source{},
                                             mod()->RegisterSymbol(out), out),
           create<ast::IdentifierExpression>(Source{}, mod()->RegisterSymbol(in),
@@ -177,11 +178,12 @@
       std::string callee,
       std::vector<std::tuple<std::string, std::string>> inout_vars,
       ast::FunctionDecorationList decorations = {}) {
-    auto* body = create<ast::BlockStatement>();
+    auto* body = create<ast::BlockStatement>(Source{});
     for (auto inout : inout_vars) {
       std::string in, out;
       std::tie(in, out) = inout;
       body->append(create<ast::AssignmentStatement>(
+          Source{},
           create<ast::IdentifierExpression>(Source{},
                                             mod()->RegisterSymbol(out), out),
           create<ast::IdentifierExpression>(Source{}, mod()->RegisterSymbol(in),
@@ -191,7 +193,7 @@
         Source{}, mod()->RegisterSymbol(callee), callee);
     auto* call_expr = create<ast::CallExpression>(Source{}, ident_expr,
                                                   ast::ExpressionList());
-    body->append(create<ast::CallStatement>(call_expr));
+    body->append(create<ast::CallStatement>(Source{}, call_expr));
     body->append(create<ast::ReturnStatement>(Source{}));
     return create<ast::Function>(Source{}, mod()->RegisterSymbol(caller),
                                  caller, ast::VariableList(), void_type(), body,
@@ -425,21 +427,22 @@
       std::string func_name,
       std::string struct_name,
       std::vector<std::tuple<size_t, ast::type::Type*>> members) {
-    auto* body = create<ast::BlockStatement>();
+    auto* body = create<ast::BlockStatement>(Source{});
 
     for (auto member : members) {
       size_t member_idx;
       ast::type::Type* member_type;
       std::tie(member_idx, member_type) = member;
       std::string member_name = StructMemberName(member_idx, member_type);
-      body->append(create<ast::VariableDeclStatement>(create<ast::Variable>(
-          Source{},                          // source
-          "local" + member_name,             // name
-          ast::StorageClass::kNone,          // storage_class
-          member_type,                       // type
-          false,                             // is_const
-          nullptr,                           // constructor
-          ast::VariableDecorationList{})));  // decorations
+      body->append(create<ast::VariableDeclStatement>(
+          Source{}, create<ast::Variable>(
+                        Source{},                          // source
+                        "local" + member_name,             // name
+                        ast::StorageClass::kNone,          // storage_class
+                        member_type,                       // type
+                        false,                             // is_const
+                        nullptr,                           // constructor
+                        ast::VariableDecorationList{})));  // decorations
     }
 
     for (auto member : members) {
@@ -448,10 +451,12 @@
       std::tie(member_idx, member_type) = member;
       std::string member_name = StructMemberName(member_idx, member_type);
       body->append(create<ast::AssignmentStatement>(
+          Source{},
           create<ast::IdentifierExpression>(
               Source{}, mod()->RegisterSymbol("local" + member_name),
               "local" + member_name),
-          create<ast::MemberAccessorExpression>(Source{},
+          create<ast::MemberAccessorExpression>(
+              Source{},
               create<ast::IdentifierExpression>(
                   Source{}, mod()->RegisterSymbol(struct_name), struct_name),
               create<ast::IdentifierExpression>(
@@ -578,7 +583,7 @@
       ast::FunctionDecorationList decorations = {}) {
     std::string result_name = "sampler_result";
 
-    auto* body = create<ast::BlockStatement>();
+    auto* body = create<ast::BlockStatement>(Source{});
 
     auto* call_result =
         create<ast::Variable>(Source{},                        // source
@@ -588,7 +593,7 @@
                               false,                           // is_const
                               nullptr,                         // constructor
                               ast::VariableDecorationList{});  // decorations
-    body->append(create<ast::VariableDeclStatement>(call_result));
+    body->append(create<ast::VariableDeclStatement>(Source{}, call_result));
 
     ast::ExpressionList call_params;
     call_params.push_back(create<ast::IdentifierExpression>(
@@ -604,6 +609,7 @@
         call_params);
 
     body->append(create<ast::AssignmentStatement>(
+        Source{},
         create<ast::IdentifierExpression>(
             Source{}, mod()->RegisterSymbol("sampler_result"),
             "sampler_result"),
@@ -634,7 +640,7 @@
       ast::FunctionDecorationList decorations = {}) {
     std::string result_name = "sampler_result";
 
-    auto* body = create<ast::BlockStatement>();
+    auto* body = create<ast::BlockStatement>(Source{});
 
     auto* call_result =
         create<ast::Variable>(Source{},                        // source
@@ -644,7 +650,7 @@
                               false,                           // is_const
                               nullptr,                         // constructor
                               ast::VariableDecorationList{});  // decorations
-    body->append(create<ast::VariableDeclStatement>(call_result));
+    body->append(create<ast::VariableDeclStatement>(Source{}, call_result));
 
     ast::ExpressionList call_params;
     call_params.push_back(create<ast::IdentifierExpression>(
@@ -662,6 +668,7 @@
         call_params);
 
     body->append(create<ast::AssignmentStatement>(
+        Source{},
         create<ast::IdentifierExpression>(
             Source{}, mod()->RegisterSymbol("sampler_result"),
             "sampler_result"),
@@ -693,7 +700,7 @@
       ast::FunctionDecorationList decorations = {}) {
     std::string result_name = "sampler_result";
 
-    auto* body = create<ast::BlockStatement>();
+    auto* body = create<ast::BlockStatement>(Source{});
 
     auto* call_result =
         create<ast::Variable>(Source{},                        // source
@@ -703,7 +710,7 @@
                               false,                           // is_const
                               nullptr,                         // constructor
                               ast::VariableDecorationList{});  // decorations
-    body->append(create<ast::VariableDeclStatement>(call_result));
+    body->append(create<ast::VariableDeclStatement>(Source{}, call_result));
 
     ast::ExpressionList call_params;
     call_params.push_back(create<ast::IdentifierExpression>(
@@ -722,6 +729,7 @@
         call_params);
 
     body->append(create<ast::AssignmentStatement>(
+        Source{},
         create<ast::IdentifierExpression>(
             Source{}, mod()->RegisterSymbol("sampler_result"),
             "sampler_result"),
@@ -1551,9 +1559,9 @@
         Source{}, mod()->RegisterSymbol(callee), callee);
     auto* call_expr = create<ast::CallExpression>(Source{}, ident_expr,
                                                   ast::ExpressionList());
-    body->append(create<ast::CallStatement>(call_expr));
+    body->append(create<ast::CallStatement>(Source{}, call_expr));
   };
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
 
   AddFuncCall(body, "ub_foo_func");
   AddFuncCall(body, "ub_bar_func");
@@ -1699,9 +1707,9 @@
         Source{}, mod()->RegisterSymbol(callee), callee);
     auto* call_expr = create<ast::CallExpression>(Source{}, ident_expr,
                                                   ast::ExpressionList());
-    body->append(create<ast::CallStatement>(call_expr));
+    body->append(create<ast::CallStatement>(Source{}, call_expr));
   };
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
 
   AddFuncCall(body, "sb_foo_func");
   AddFuncCall(body, "sb_bar_func");
@@ -1874,9 +1882,9 @@
         Source{}, mod()->RegisterSymbol(callee), callee);
     auto* call_expr = create<ast::CallExpression>(Source{}, ident_expr,
                                                   ast::ExpressionList());
-    body->append(create<ast::CallStatement>(call_expr));
+    body->append(create<ast::CallStatement>(Source{}, call_expr));
   };
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
 
   AddFuncCall(body, "sb_foo_func");
   AddFuncCall(body, "sb_bar_func");
diff --git a/src/reader/spirv/function.cc b/src/reader/spirv/function.cc
index cd2cb54..9f24f00 100644
--- a/src/reader/spirv/function.cc
+++ b/src/reader/spirv/function.cc
@@ -667,7 +667,7 @@
                                             ast::CaseStatementList* cases,
                                             CompletionAction action) {
   if (block == nullptr) {
-    block = create<ast::BlockStatement>();
+    block = create<ast::BlockStatement>(Source{});
   }
 
   statements_stack_.emplace_back(
@@ -685,7 +685,7 @@
 
   auto* cond = create<ast::IdentifierExpression>(
       Source{}, ast_module_.RegisterSymbol(guard_name), guard_name);
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   AddStatement(
       create<ast::IfStatement>(Source{}, cond, body, ast::ElseStatementList{}));
   PushNewStatementBlock(top.construct_, end_id, body, nullptr, nullptr);
@@ -696,7 +696,7 @@
   const auto& top = statements_stack_.back();
 
   auto* cond = MakeTrue(Source{});
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   AddStatement(
       create<ast::IfStatement>(Source{}, cond, body, ast::ElseStatementList{}));
   PushNewStatementBlock(top.construct_, end_id, body, nullptr, nullptr);
@@ -1865,7 +1865,7 @@
     auto* var = parser_impl_.MakeVariable(
         inst.result_id(), ast::StorageClass::kFunction, var_store_type, false,
         constructor, ast::VariableDecorationList{});
-    auto* var_decl_stmt = create<ast::VariableDeclStatement>(var);
+    auto* var_decl_stmt = create<ast::VariableDeclStatement>(Source{}, var);
     AddStatement(var_decl_stmt);
     // Save this as an already-named value.
     identifier_values_.insert(inst.result_id());
@@ -2145,14 +2145,14 @@
                               false,                           // is_const
                               MakeTrue(Source{}),              // constructor
                               ast::VariableDecorationList{});  // decorations
-    auto* guard_decl = create<ast::VariableDeclStatement>(guard_var);
+    auto* guard_decl = create<ast::VariableDeclStatement>(Source{}, guard_var);
     AddStatement(guard_decl);
   }
 
   const auto condition_id =
       block_info.basic_block->terminator()->GetSingleWordInOperand(0);
   auto* cond = MakeExpression(condition_id).expr;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
 
   // Generate the code for the condition.
   // Use the IfBuilder to create the if-statement. The IfBuilder is constructed
@@ -2227,7 +2227,7 @@
   // But make sure we do it in the right order.
   auto push_else = [this, if_builder, else_end, construct]() {
     // Push the else clause onto the stack first.
-    auto* else_body = create<ast::BlockStatement>();
+    auto* else_body = create<ast::BlockStatement>(Source{});
     PushNewStatementBlock(
         construct, else_end, else_body, nullptr,
         [this, if_builder, else_body]() {
@@ -2236,7 +2236,7 @@
             // The "else" consists of the statement list from the top of
             // statements stack, without an elseif condition.
             if_builder->else_stmts_.emplace_back(
-                create<ast::ElseStatement>(nullptr, else_body));
+                create<ast::ElseStatement>(Source{}, nullptr, else_body));
           }
         });
   };
@@ -2294,7 +2294,7 @@
 
   // First, push the statement block for the entire switch.
   ast::CaseStatementList case_list;
-  auto* swch = create<ast::SwitchStatement>(selector.expr, case_list);
+  auto* swch = create<ast::SwitchStatement>(Source{}, selector.expr, case_list);
   AddStatement(swch)->As<ast::SwitchStatement>();
 
   // Grab a pointer to the case list.  It will get buried in the statement block
@@ -2369,17 +2369,18 @@
 
     // Create the case clause.  Temporarily put it in the wrong order
     // on the case statement list.
-    auto* body = create<ast::BlockStatement>();
-    cases->emplace_back(create<ast::CaseStatement>(selectors, body));
+    auto* body = create<ast::BlockStatement>(Source{});
+    cases->emplace_back(create<ast::CaseStatement>(Source{}, selectors, body));
 
     PushNewStatementBlock(construct, end_id, body, nullptr, nullptr);
 
     if ((default_info == clause_heads[i]) && has_selectors &&
         construct->ContainsPos(default_info->pos)) {
       // Generate a default clause with a just fallthrough.
-      auto* stmts = create<ast::BlockStatement>();
-      stmts->append(create<ast::FallthroughStatement>());
-      auto* case_stmt = create<ast::CaseStatement>(stmts);
+      auto* stmts = create<ast::BlockStatement>(Source{});
+      stmts->append(create<ast::FallthroughStatement>(Source{}));
+      auto* case_stmt =
+          create<ast::CaseStatement>(Source{}, ast::CaseSelectorList{}, stmts);
       cases->emplace_back(case_stmt);
     }
 
@@ -2396,8 +2397,9 @@
 }
 
 bool FunctionEmitter::EmitLoopStart(const Construct* construct) {
-  auto* body = create<ast::BlockStatement>();
-  AddStatement(create<ast::LoopStatement>(body, create<ast::BlockStatement>()));
+  auto* body = create<ast::BlockStatement>(Source{});
+  AddStatement(create<ast::LoopStatement>(
+      Source{}, body, create<ast::BlockStatement>(Source{})));
   PushNewStatementBlock(construct, construct->end_id, body, nullptr, nullptr);
   return success();
 }
@@ -2431,7 +2433,7 @@
     case SpvOpKill:
       // For now, assume SPIR-V OpKill has same semantics as WGSL discard.
       // TODO(dneto): https://github.com/gpuweb/gpuweb/issues/676
-      AddStatement(create<ast::DiscardStatement>());
+      AddStatement(create<ast::DiscardStatement>(Source{}));
       return true;
     case SpvOpUnreachable:
       // Translate as if it's a return. This avoids the problem where WGSL
@@ -2525,7 +2527,7 @@
       break;
     case EdgeKind::kSwitchBreak: {
       if (forced) {
-        return create<ast::BreakStatement>();
+        return create<ast::BreakStatement>(Source{});
       }
       // Unless forced, don't bother with a break at the end of a case/default
       // clause.
@@ -2550,10 +2552,10 @@
         }
       }
       // We need a break.
-      return create<ast::BreakStatement>();
+      return create<ast::BreakStatement>(Source{});
     }
     case EdgeKind::kLoopBreak:
-      return create<ast::BreakStatement>();
+      return create<ast::BreakStatement>(Source{});
     case EdgeKind::kLoopContinue:
       // An unconditional continue to the next block is redundant and ugly.
       // Skip it in that case.
@@ -2561,7 +2563,7 @@
         break;
       }
       // Otherwise, emit a regular continue statement.
-      return create<ast::ContinueStatement>();
+      return create<ast::ContinueStatement>(Source{});
     case EdgeKind::kIfBreak: {
       const auto& flow_guard =
           GetBlockInfo(dest_info.header_for_merge)->flow_guard_name;
@@ -2571,6 +2573,7 @@
         }
         // Signal an exit from the branch.
         return create<ast::AssignmentStatement>(
+            Source{},
             create<ast::IdentifierExpression>(
                 Source{}, ast_module_.RegisterSymbol(flow_guard), flow_guard),
             MakeFalse(Source{}));
@@ -2581,7 +2584,7 @@
       break;
     }
     case EdgeKind::kCaseFallThrough:
-      return create<ast::FallthroughStatement>();
+      return create<ast::FallthroughStatement>(Source{});
     case EdgeKind::kForward:
       // Unconditional forward branch is implicit.
       break;
@@ -2597,11 +2600,12 @@
   }
   ast::ElseStatementList else_stmts;
   if (else_stmt != nullptr) {
-    auto* stmts = create<ast::BlockStatement>();
+    auto* stmts = create<ast::BlockStatement>(Source{});
     stmts->append(else_stmt);
-    else_stmts.emplace_back(create<ast::ElseStatement>(nullptr, stmts));
+    else_stmts.emplace_back(
+        create<ast::ElseStatement>(Source{}, nullptr, stmts));
   }
-  auto* if_block = create<ast::BlockStatement>();
+  auto* if_block = create<ast::BlockStatement>(Source{});
   auto* if_stmt =
       create<ast::IfStatement>(Source{}, condition, if_block, else_stmts);
   if (then_stmt != nullptr) {
@@ -2649,7 +2653,7 @@
   } else {
     AddStatement(MakeSimpleIf(cond, other_branch, nullptr));
   }
-  AddStatement(create<ast::FallthroughStatement>());
+  AddStatement(create<ast::FallthroughStatement>(Source{}));
 
   return success();
 }
@@ -2676,9 +2680,10 @@
     assert(def_inst);
     auto* ast_type =
         RemapStorageClass(parser_impl_.ConvertType(def_inst->type_id()), id);
-    AddStatement(create<ast::VariableDeclStatement>(parser_impl_.MakeVariable(
-        id, ast::StorageClass::kFunction, ast_type, false, nullptr,
-        ast::VariableDecorationList{})));
+    AddStatement(create<ast::VariableDeclStatement>(
+        Source{}, parser_impl_.MakeVariable(id, ast::StorageClass::kFunction,
+                                            ast_type, false, nullptr,
+                                            ast::VariableDecorationList{})));
     // Save this as an already-named value.
     identifier_values_.insert(id);
   }
@@ -2696,7 +2701,7 @@
         false,                                          // is_const
         nullptr,                                        // constructor
         ast::VariableDecorationList{});                 // decorations
-    AddStatement(create<ast::VariableDeclStatement>(var));
+    AddStatement(create<ast::VariableDeclStatement>(Source{}, var));
   }
 
   // Emit regular statements.
@@ -2727,6 +2732,7 @@
       const auto var_name = GetDefInfo(assignment.phi_id)->phi_var;
       auto expr = MakeExpression(assignment.value);
       AddStatement(create<ast::AssignmentStatement>(
+          Source{},
           create<ast::IdentifierExpression>(
               Source{}, ast_module_.RegisterSymbol(var_name), var_name),
           expr.expr));
@@ -2749,7 +2755,7 @@
   if (!ast_const) {
     return false;
   }
-  AddStatement(create<ast::VariableDeclStatement>(ast_const));
+  AddStatement(create<ast::VariableDeclStatement>(Source{}, ast_const));
   // Save this as an already-named value.
   identifier_values_.insert(inst.result_id());
   return success();
@@ -2764,6 +2770,7 @@
     auto name = namer_.Name(result_id);
     // Emit an assignment of the expression to the hoisted variable.
     AddStatement(create<ast::AssignmentStatement>(
+        Source{},
         create<ast::IdentifierExpression>(
             Source{}, ast_module_.RegisterSymbol(name), namer_.Name(result_id)),
         ast_expr.expr));
@@ -2833,7 +2840,8 @@
       // TODO(dneto): Order of evaluation?
       auto lhs = MakeExpression(ptr_id);
       auto rhs = MakeExpression(value_id);
-      AddStatement(create<ast::AssignmentStatement>(lhs.expr, rhs.expr));
+      AddStatement(
+          create<ast::AssignmentStatement>(Source{}, lhs.expr, rhs.expr));
       return success();
     }
     case SpvOpLoad: {
@@ -3743,7 +3751,8 @@
   }
 
   if (result_type->Is<ast::type::Void>()) {
-    return nullptr != AddStatement(create<ast::CallStatement>(call_expr));
+    return nullptr !=
+           AddStatement(create<ast::CallStatement>(Source{}, call_expr));
   }
 
   return EmitConstDefOrWriteToHoistedVar(inst, {result_type, call_expr});
@@ -3800,7 +3809,8 @@
     // The condition goes last.
     params.push_back(condition.expr);
     return {operand1.type,
-            create<ast::CallExpression>(Source{},
+            create<ast::CallExpression>(
+                Source{},
                 create<ast::IdentifierExpression>(
                     Source{}, ast_module_.RegisterSymbol("select"), "select"),
                 std::move(params))};
@@ -4014,7 +4024,7 @@
   } else {
     // It's an image write. No value is returned, so make a statement out
     // of the call.
-    AddStatement(create<ast::CallStatement>(call_expr));
+    AddStatement(create<ast::CallStatement>(Source{}, call_expr));
   }
   return success();
 }
@@ -4182,10 +4192,11 @@
   }
   // If the texel has more components than necessary, then we will ignore the
   // higher-numbered components.
-  auto* texel_prefix = (src_count == dest_count)
-                           ? texel.expr
-                           : create<ast::MemberAccessorExpression>(Source{},
-                                 texel.expr, PrefixSwizzle(dest_count));
+  auto* texel_prefix =
+      (src_count == dest_count)
+          ? texel.expr
+          : create<ast::MemberAccessorExpression>(Source{}, texel.expr,
+                                                  PrefixSwizzle(dest_count));
 
   if (!(dest_type->is_float_scalar_or_vector() ||
         dest_type->is_unsigned_scalar_or_vector() ||
diff --git a/src/reader/wgsl/parser_impl.cc b/src/reader/wgsl/parser_impl.cc
index 7061875..65fb63a 100644
--- a/src/reader/wgsl/parser_impl.cc
+++ b/src/reader/wgsl/parser_impl.cc
@@ -1438,7 +1438,7 @@
 //   : statement*
 Expect<ast::BlockStatement*> ParserImpl::expect_statements() {
   bool errored = false;
-  auto* ret = create<ast::BlockStatement>();
+  auto* ret = create<ast::BlockStatement>(Source{});
 
   while (synchronized_) {
     auto stmt = statement();
@@ -1724,7 +1724,7 @@
   if (body.errored)
     return Failure::kErrored;
 
-  return create<ast::ElseStatement>(source, body.value);
+  return create<ast::ElseStatement>(source, nullptr, body.value);
 }
 
 // switch_stmt
@@ -1827,7 +1827,7 @@
 //   | statement case_body
 //   | FALLTHROUGH SEMICOLON
 Maybe<ast::BlockStatement*> ParserImpl::case_body() {
-  auto* ret = create<ast::BlockStatement>();
+  auto* ret = create<ast::BlockStatement>(Source{});
   for (;;) {
     Source source;
     if (match(Token::Type::kFallthrough, &source)) {
@@ -2026,11 +2026,12 @@
   if (!expect("call statement", Token::Type::kParenRight))
     return Failure::kErrored;
 
-  return create<ast::CallStatement>(create<ast::CallExpression>(
-      source,
-      create<ast::IdentifierExpression>(Source{}, module_.RegisterSymbol(name),
-                                        name),
-      std::move(params)));
+  return create<ast::CallStatement>(
+      Source{}, create<ast::CallExpression>(
+                    source,
+                    create<ast::IdentifierExpression>(
+                        source, module_.RegisterSymbol(name), name),
+                    std::move(params)));
 }
 
 // break_stmt
@@ -2057,7 +2058,7 @@
 //   : CONTINUING body_stmt
 Maybe<ast::BlockStatement*> ParserImpl::continuing_stmt() {
   if (!match(Token::Type::kContinuing))
-    return create<ast::BlockStatement>();
+    return create<ast::BlockStatement>(Source{});
 
   return expect_body_stmt();
 }
diff --git a/src/transform/bound_array_accessors_test.cc b/src/transform/bound_array_accessors_test.cc
index 24a7242..2f878d0 100644
--- a/src/transform/bound_array_accessors_test.cc
+++ b/src/transform/bound_array_accessors_test.cc
@@ -91,7 +91,7 @@
 };
 
 struct ModuleBuilder : public ast::BuilderWithModule {
-  ModuleBuilder() : body_(create<ast::BlockStatement>()) {
+  ModuleBuilder() : body_(create<ast::BlockStatement>(Source{})) {
     mod->AddFunction(create<ast::Function>(
         Source{}, mod->RegisterSymbol("func"), "func", ast::VariableList{},
         ty.void_, body_, ast::FunctionDecorationList{}));
@@ -106,7 +106,7 @@
   virtual void Build() = 0;
   void OnVariableBuilt(ast::Variable* var) override {
     ASSERT_NE(body_, nullptr);
-    body_->append(create<ast::VariableDeclStatement>(var));
+    body_->append(create<ast::VariableDeclStatement>(Source{}, var));
   }
   ast::BlockStatement* body_ = nullptr;
 };
diff --git a/src/transform/emit_vertex_point_size.cc b/src/transform/emit_vertex_point_size.cc
index 14d79e2..1d22a26 100644
--- a/src/transform/emit_vertex_point_size.cc
+++ b/src/transform/emit_vertex_point_size.cc
@@ -65,12 +65,12 @@
   mod->AddGlobalVariable(pointsize_var);
 
   // Build the AST expression & statement for assigning pointsize one.
-  auto* one = mod->create<ast::ScalarConstructorExpression>(Source{},
-      mod->create<ast::FloatLiteral>(Source{}, f32, 1.0f));
+  auto* one = mod->create<ast::ScalarConstructorExpression>(
+      Source{}, mod->create<ast::FloatLiteral>(Source{}, f32, 1.0f));
   auto* pointsize_ident = mod->create<ast::IdentifierExpression>(
       Source{}, mod->RegisterSymbol(kPointSizeVar), kPointSizeVar);
   auto* pointsize_assign =
-      mod->create<ast::AssignmentStatement>(pointsize_ident, one);
+      mod->create<ast::AssignmentStatement>(Source{}, pointsize_ident, one);
 
   // Add the pointsize assignment statement to the front of all vertex stages.
   for (auto* func : mod->functions()) {
diff --git a/src/transform/emit_vertex_point_size_test.cc b/src/transform/emit_vertex_point_size_test.cc
index f0d6ba8..d6f5627 100644
--- a/src/transform/emit_vertex_point_size_test.cc
+++ b/src/transform/emit_vertex_point_size_test.cc
@@ -56,8 +56,8 @@
       auto* block = create<ast::BlockStatement>(Source{});
 
       block->append(create<ast::VariableDeclStatement>(
-          Var("builtin_assignments_should_happen_before_this",
-              tint::ast::StorageClass::kFunction, ty.f32)));
+          Source{}, Var("builtin_assignments_should_happen_before_this",
+                        tint::ast::StorageClass::kFunction, ty.f32)));
 
       auto a_sym = mod->RegisterSymbol("non_entry_a");
       mod->AddFunction(create<ast::Function>(
diff --git a/src/transform/first_index_offset.cc b/src/transform/first_index_offset.cc
index 5f1e026..81e9bc3 100644
--- a/src/transform/first_index_offset.cc
+++ b/src/transform/first_index_offset.cc
@@ -270,7 +270,7 @@
                                  true,                            // is_const
                                  constructor,                     // constructor
                                  ast::VariableDecorationList{});  // decorations
-  return mod->create<ast::VariableDeclStatement>(var);
+  return mod->create<ast::VariableDeclStatement>(Source{}, var);
 }
 
 }  // namespace transform
diff --git a/src/transform/first_index_offset_test.cc b/src/transform/first_index_offset_test.cc
index 0ac7cfc..88196b3 100644
--- a/src/transform/first_index_offset_test.cc
+++ b/src/transform/first_index_offset_test.cc
@@ -61,7 +61,7 @@
                              ast::VariableList params = {}) {
     auto* func = create<ast::Function>(
         Source{}, mod->RegisterSymbol(name), name, std::move(params), ty.u32,
-        create<ast::BlockStatement>(), ast::FunctionDecorationList());
+        create<ast::BlockStatement>(Source{}), ast::FunctionDecorationList());
     mod->AddFunction(func);
     return func;
   }
diff --git a/src/transform/vertex_pulling.cc b/src/transform/vertex_pulling.cc
index 96f7588..41a42c2 100644
--- a/src/transform/vertex_pulling.cc
+++ b/src/transform/vertex_pulling.cc
@@ -292,18 +292,18 @@
   // location.
 
   // A block statement allowing us to use append instead of insert
-  auto* block = mod->create<ast::BlockStatement>();
+  auto* block = mod->create<ast::BlockStatement>(Source{});
 
   // Declare the |kPullingPosVarName| variable in the shader
-  auto* pos_declaration =
-      mod->create<ast::VariableDeclStatement>(mod->create<ast::Variable>(
-          Source{},                         // source
-          kPullingPosVarName,               // name
-          ast::StorageClass::kFunction,     // storage_class
-          GetI32Type(),                     // type
-          false,                            // is_const
-          nullptr,                          // constructor
-          ast::VariableDecorationList{}));  // decorations
+  auto* pos_declaration = mod->create<ast::VariableDeclStatement>(
+      Source{}, mod->create<ast::Variable>(
+                    Source{},                         // source
+                    kPullingPosVarName,               // name
+                    ast::StorageClass::kFunction,     // storage_class
+                    GetI32Type(),                     // type
+                    false,                            // is_const
+                    nullptr,                          // constructor
+                    ast::VariableDecorationList{}));  // decorations
 
   // |kPullingPosVarName| refers to the byte location of the current read. We
   // declare a variable in the shader to avoid having to reuse Expression
@@ -338,10 +338,11 @@
 
       // Update position of the read
       auto* set_pos_expr = mod->create<ast::AssignmentStatement>(
-          CreatePullingPositionIdent(), pos_value);
+          Source{}, CreatePullingPositionIdent(), pos_value);
       block->append(set_pos_expr);
 
       block->append(mod->create<ast::AssignmentStatement>(
+          Source{},
           mod->create<ast::IdentifierExpression>(
               Source{}, mod->RegisterSymbol(v->name()), v->name()),
           AccessByFormat(i, attribute_desc.format)));
diff --git a/src/transform/vertex_pulling_test.cc b/src/transform/vertex_pulling_test.cc
index 8d950d5..b066e16 100644
--- a/src/transform/vertex_pulling_test.cc
+++ b/src/transform/vertex_pulling_test.cc
@@ -48,7 +48,7 @@
   void InitBasicModule() {
     auto* func = create<ast::Function>(
         Source{}, mod_->RegisterSymbol("main"), "main", ast::VariableList{},
-        mod_->create<ast::type::Void>(), create<ast::BlockStatement>(),
+        mod_->create<ast::type::Void>(), create<ast::BlockStatement>(Source{}),
         ast::FunctionDecorationList{create<ast::StageDecoration>(
             ast::PipelineStage::kVertex, Source{})});
     mod()->AddFunction(func);
@@ -135,7 +135,7 @@
 TEST_F(VertexPullingTest, Error_EntryPointWrongStage) {
   auto* func = create<ast::Function>(
       Source{}, mod()->RegisterSymbol("main"), "main", ast::VariableList{},
-      mod()->create<ast::type::Void>(), create<ast::BlockStatement>(),
+      mod()->create<ast::type::Void>(), create<ast::BlockStatement>(Source{}),
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
       });
diff --git a/src/type_determiner_test.cc b/src/type_determiner_test.cc
index db2bed6..182f77b 100644
--- a/src/type_determiner_test.cc
+++ b/src/type_determiner_test.cc
@@ -132,7 +132,7 @@
   auto* rhs = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 2.3f));
 
-  ast::AssignmentStatement assign(lhs, rhs);
+  ast::AssignmentStatement assign(Source{}, lhs, rhs);
 
   EXPECT_TRUE(td()->DetermineResultType(&assign));
   ASSERT_NE(lhs->result_type(), nullptr);
@@ -151,12 +151,12 @@
   auto* rhs = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 2.3f));
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::AssignmentStatement>(lhs, rhs));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::AssignmentStatement>(Source{}, lhs, rhs));
 
   ast::CaseSelectorList lit;
   lit.push_back(create<ast::SintLiteral>(Source{}, &i32, 3));
-  ast::CaseStatement cse(lit, body);
+  ast::CaseStatement cse(Source{}, lit, body);
 
   EXPECT_TRUE(td()->DetermineResultType(&cse));
   ASSERT_NE(lhs->result_type(), nullptr);
@@ -174,8 +174,8 @@
   auto* rhs = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 2.3f));
 
-  ast::BlockStatement block;
-  block.append(create<ast::AssignmentStatement>(lhs, rhs));
+  ast::BlockStatement block(Source{});
+  block.append(create<ast::AssignmentStatement>(Source{}, lhs, rhs));
 
   EXPECT_TRUE(td()->DetermineResultType(&block));
   ASSERT_NE(lhs->result_type(), nullptr);
@@ -193,10 +193,11 @@
   auto* rhs = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 2.3f));
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::AssignmentStatement>(lhs, rhs));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::AssignmentStatement>(Source{}, lhs, rhs));
 
   ast::ElseStatement stmt(
+      Source{},
       create<ast::ScalarConstructorExpression>(
           Source{}, create<ast::SintLiteral>(Source{}, &i32, 3)),
       body);
@@ -219,10 +220,12 @@
   auto* else_rhs = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 2.3f));
 
-  auto* else_body = create<ast::BlockStatement>();
-  else_body->append(create<ast::AssignmentStatement>(else_lhs, else_rhs));
+  auto* else_body = create<ast::BlockStatement>(Source{});
+  else_body->append(
+      create<ast::AssignmentStatement>(Source{}, else_lhs, else_rhs));
 
   auto* else_stmt = create<ast::ElseStatement>(
+      Source{},
       create<ast::ScalarConstructorExpression>(
           Source{}, create<ast::SintLiteral>(Source{}, &i32, 3)),
       else_body);
@@ -232,8 +235,8 @@
   auto* rhs = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 2.3f));
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::AssignmentStatement>(lhs, rhs));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::AssignmentStatement>(Source{}, lhs, rhs));
 
   ast::IfStatement stmt(
       Source{},
@@ -263,19 +266,19 @@
   auto* body_rhs = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 2.3f));
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::AssignmentStatement>(body_lhs, body_rhs));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::AssignmentStatement>(Source{}, body_lhs, body_rhs));
 
   auto* continuing_lhs = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::SintLiteral>(Source{}, &i32, 2));
   auto* continuing_rhs = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 2.3f));
 
-  auto* continuing = create<ast::BlockStatement>();
-  continuing->append(
-      create<ast::AssignmentStatement>(continuing_lhs, continuing_rhs));
+  auto* continuing = create<ast::BlockStatement>(Source{});
+  continuing->append(create<ast::AssignmentStatement>(Source{}, continuing_lhs,
+                                                      continuing_rhs));
 
-  ast::LoopStatement stmt(body, continuing);
+  ast::LoopStatement stmt(Source{}, body, continuing);
 
   EXPECT_TRUE(td()->DetermineResultType(&stmt));
   ASSERT_NE(body_lhs->result_type(), nullptr);
@@ -316,16 +319,17 @@
   auto* rhs = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 2.3f));
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::AssignmentStatement>(lhs, rhs));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::AssignmentStatement>(Source{}, lhs, rhs));
 
   ast::CaseSelectorList lit;
   lit.push_back(create<ast::SintLiteral>(Source{}, &i32, 3));
 
   ast::CaseStatementList cases;
-  cases.push_back(create<ast::CaseStatement>(lit, body));
+  cases.push_back(create<ast::CaseStatement>(Source{}, lit, body));
 
   ast::SwitchStatement stmt(
+      Source{},
       create<ast::ScalarConstructorExpression>(
           Source{}, create<ast::SintLiteral>(Source{}, &i32, 2)),
       cases);
@@ -346,7 +350,7 @@
   ast::VariableList params;
   auto* func = create<ast::Function>(
       Source{}, mod->RegisterSymbol("my_func"), "my_func", params, &f32,
-      create<ast::BlockStatement>(), ast::FunctionDecorationList{});
+      create<ast::BlockStatement>(Source{}), ast::FunctionDecorationList{});
   mod->AddFunction(func);
 
   // Register the function
@@ -359,7 +363,7 @@
           Source{}, mod->RegisterSymbol("my_func"), "my_func"),
       call_params);
 
-  ast::CallStatement call(expr);
+  ast::CallStatement call(Source{}, expr);
   EXPECT_TRUE(td()->DetermineResultType(&call));
   ASSERT_NE(expr->result_type(), nullptr);
   EXPECT_TRUE(expr->result_type()->Is<ast::type::F32>());
@@ -376,15 +380,15 @@
                                         mod->RegisterSymbol("func"), "func"),
       call_params);
   ast::VariableList params0;
-  auto* main_body = create<ast::BlockStatement>();
-  main_body->append(create<ast::CallStatement>(call_expr));
+  auto* main_body = create<ast::BlockStatement>(Source{});
+  main_body->append(create<ast::CallStatement>(Source{}, call_expr));
   main_body->append(create<ast::ReturnStatement>(Source{}));
   auto* func_main = create<ast::Function>(Source{}, mod->RegisterSymbol("main"),
                                           "main", params0, &f32, main_body,
                                           ast::FunctionDecorationList{});
   mod->AddFunction(func_main);
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
   auto* func =
       create<ast::Function>(Source{}, mod->RegisterSymbol("func"), "func",
@@ -410,7 +414,7 @@
       ast::VariableDecorationList{});                    // decorations
   auto* init = var->constructor();
 
-  ast::VariableDeclStatement decl(var);
+  ast::VariableDeclStatement decl(Source{}, var);
 
   EXPECT_TRUE(td()->DetermineResultType(&decl));
   ASSERT_NE(init->result_type(), nullptr);
@@ -671,7 +675,7 @@
   ast::VariableList params;
   auto* func = create<ast::Function>(
       Source{}, mod->RegisterSymbol("my_func"), "my_func", params, &f32,
-      create<ast::BlockStatement>(), ast::FunctionDecorationList{});
+      create<ast::BlockStatement>(Source{}), ast::FunctionDecorationList{});
   mod->AddFunction(func);
 
   // Register the function
@@ -694,7 +698,7 @@
   ast::VariableList params;
   auto* func = create<ast::Function>(
       Source{}, mod->RegisterSymbol("my_func"), "my_func", params, &f32,
-      create<ast::BlockStatement>(), ast::FunctionDecorationList{});
+      create<ast::BlockStatement>(Source{}), ast::FunctionDecorationList{});
   mod->AddFunction(func);
 
   // Register the function
@@ -847,11 +851,12 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
   body->append(create<ast::AssignmentStatement>(
-      my_var, create<ast::IdentifierExpression>(
-                  Source{}, mod->RegisterSymbol("my_var"), "my_var")));
+      Source{}, my_var,
+      create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("my_var"),
+                                        "my_var")));
 
   ast::Function f(Source{}, mod->RegisterSymbol("my_func"), "my_func", {}, &f32,
                   body, ast::FunctionDecorationList{});
@@ -868,8 +873,9 @@
   auto* my_var = create<ast::IdentifierExpression>(
       Source{}, mod->RegisterSymbol("my_var"), "my_var");
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::VariableDeclStatement>(
+      Source{},
       create<ast::Variable>(Source{},                          // source
                             "my_var",                          // name
                             ast::StorageClass::kNone,          // storage_class
@@ -879,8 +885,9 @@
                             ast::VariableDecorationList{})));  // decorations
 
   body->append(create<ast::AssignmentStatement>(
-      my_var, create<ast::IdentifierExpression>(
-                  Source{}, mod->RegisterSymbol("my_var"), "my_var")));
+      Source{}, my_var,
+      create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("my_var"),
+                                        "my_var")));
 
   ast::Function f(Source{}, mod->RegisterSymbol("myfunc"), "my_func", {}, &f32,
                   body, ast::FunctionDecorationList{});
@@ -902,8 +909,9 @@
   auto* my_var = create<ast::IdentifierExpression>(
       Source{}, mod->RegisterSymbol("my_var"), "my_var");
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::VariableDeclStatement>(
+      Source{},
       create<ast::Variable>(Source{},                          // source
                             "my_var",                          // name
                             ast::StorageClass::kNone,          // storage_class
@@ -913,8 +921,9 @@
                             ast::VariableDecorationList{})));  // decorations
 
   body->append(create<ast::AssignmentStatement>(
-      my_var, create<ast::IdentifierExpression>(
-                  Source{}, mod->RegisterSymbol("my_var"), "my_var")));
+      Source{}, my_var,
+      create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("my_var"),
+                                        "my_var")));
 
   ast::Function f(Source{}, mod->RegisterSymbol("my_func"), "my_func", {}, &f32,
                   body, ast::FunctionDecorationList{});
@@ -935,7 +944,7 @@
   ast::VariableList params;
   auto* func = create<ast::Function>(
       Source{}, mod->RegisterSymbol("my_func"), "my_func", params, &f32,
-      create<ast::BlockStatement>(), ast::FunctionDecorationList{});
+      create<ast::BlockStatement>(Source{}), ast::FunctionDecorationList{});
   mod->AddFunction(func);
 
   // Register the function
@@ -1004,23 +1013,27 @@
   mod->AddGlobalVariable(priv_var);
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(
           Source{}, mod->RegisterSymbol("out_var"), "out_var"),
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("in_var"),
                                         "in_var")));
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("wg_var"),
                                         "wg_var"),
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("wg_var"),
                                         "wg_var")));
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("sb_var"),
                                         "sb_var"),
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("sb_var"),
                                         "sb_var")));
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(
           Source{}, mod->RegisterSymbol("priv_var"), "priv_var"),
       create<ast::IdentifierExpression>(
@@ -1093,23 +1106,27 @@
   mod->AddGlobalVariable(wg_var);
   mod->AddGlobalVariable(priv_var);
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(
           Source{}, mod->RegisterSymbol("out_var"), "out_var"),
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("in_var"),
                                         "in_var")));
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("wg_var"),
                                         "wg_var"),
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("wg_var"),
                                         "wg_var")));
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("sb_var"),
                                         "sb_var"),
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("sb_var"),
                                         "sb_var")));
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(
           Source{}, mod->RegisterSymbol("priv_var"), "priv_var"),
       create<ast::IdentifierExpression>(
@@ -1121,8 +1138,9 @@
 
   mod->AddFunction(func);
 
-  body = create<ast::BlockStatement>();
+  body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(
           Source{}, mod->RegisterSymbol("out_var"), "out_var"),
       create<ast::CallExpression>(
@@ -1160,9 +1178,10 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("var"),
                                         "var"),
       create<ast::ScalarConstructorExpression>(
@@ -2839,9 +2858,9 @@
                             false,                           // is_const
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
-  auto* stmt = create<ast::VariableDeclStatement>(var);
+  auto* stmt = create<ast::VariableDeclStatement>(Source{}, var);
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(stmt);
   auto* func = create<ast::Function>(Source{}, mod->RegisterSymbol("func"),
                                      "func", ast::VariableList{}, &i32, body,
@@ -2864,9 +2883,9 @@
                             true,                            // is_const
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
-  auto* stmt = create<ast::VariableDeclStatement>(var);
+  auto* stmt = create<ast::VariableDeclStatement>(Source{}, var);
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(stmt);
   auto* func = create<ast::Function>(Source{}, mod->RegisterSymbol("func"),
                                      "func", ast::VariableList{}, &i32, body,
@@ -2889,9 +2908,9 @@
                             false,                           // is_const
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
-  auto* stmt = create<ast::VariableDeclStatement>(var);
+  auto* stmt = create<ast::VariableDeclStatement>(Source{}, var);
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(stmt);
   auto* func = create<ast::Function>(Source{}, mod->RegisterSymbol("func"),
                                      "func", ast::VariableList{}, &i32, body,
@@ -5209,13 +5228,14 @@
   // ep_2 -> {}
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   auto* func_b =
       create<ast::Function>(Source{}, mod->RegisterSymbol("b"), "b", params,
                             &f32, body, ast::FunctionDecorationList{});
 
-  body = create<ast::BlockStatement>();
+  body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("second"),
                                         "second"),
       create<ast::CallExpression>(Source{},
@@ -5226,8 +5246,9 @@
       create<ast::Function>(Source{}, mod->RegisterSymbol("c"), "c", params,
                             &f32, body, ast::FunctionDecorationList{});
 
-  body = create<ast::BlockStatement>();
+  body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("first"),
                                         "first"),
       create<ast::CallExpression>(Source{},
@@ -5238,8 +5259,9 @@
       create<ast::Function>(Source{}, mod->RegisterSymbol("a"), "a", params,
                             &f32, body, ast::FunctionDecorationList{});
 
-  body = create<ast::BlockStatement>();
+  body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("call_a"),
                                         "call_a"),
       create<ast::CallExpression>(Source{},
@@ -5247,6 +5269,7 @@
                                       Source{}, mod->RegisterSymbol("a"), "a"),
                                   ast::ExpressionList{})));
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("call_b"),
                                         "call_b"),
       create<ast::CallExpression>(Source{},
@@ -5259,8 +5282,9 @@
           create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
       });
 
-  body = create<ast::BlockStatement>();
+  body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("call_c"),
                                         "call_c"),
       create<ast::CallExpression>(Source{},
diff --git a/src/validator/validator_control_block_test.cc b/src/validator/validator_control_block_test.cc
index 4076fba..55a44ac 100644
--- a/src/validator/validator_control_block_test.cc
+++ b/src/validator/validator_control_block_test.cc
@@ -57,13 +57,14 @@
   auto* cond = create<ast::IdentifierExpression>(
       Source{Source::Location{12, 34}}, mod()->RegisterSymbol("a"), "a");
   ast::CaseSelectorList default_csl;
-  auto* block_default = create<ast::BlockStatement>();
+  auto* block_default = create<ast::BlockStatement>(Source{});
   ast::CaseStatementList body;
-  body.push_back(create<ast::CaseStatement>(default_csl, block_default));
+  body.push_back(
+      create<ast::CaseStatement>(Source{}, default_csl, block_default));
 
-  auto* block = create<ast::BlockStatement>();
-  block->append(create<ast::VariableDeclStatement>(var));
-  block->append(create<ast::SwitchStatement>(cond, body));
+  auto* block = create<ast::BlockStatement>(Source{});
+  block->append(create<ast::VariableDeclStatement>(Source{}, var));
+  block->append(create<ast::SwitchStatement>(Source{}, cond, body));
 
   EXPECT_TRUE(td()->DetermineStatements(block)) << td()->error();
   EXPECT_FALSE(v()->ValidateStatements(block));
@@ -94,11 +95,11 @@
   ast::CaseSelectorList csl;
   csl.push_back(create<ast::SintLiteral>(Source{}, &i32, 1));
   ast::CaseStatementList body;
-  body.push_back(
-      create<ast::CaseStatement>(csl, create<ast::BlockStatement>()));
+  body.push_back(create<ast::CaseStatement>(
+      Source{}, csl, create<ast::BlockStatement>(Source{})));
 
-  auto* block = create<ast::BlockStatement>();
-  block->append(create<ast::VariableDeclStatement>(var));
+  auto* block = create<ast::BlockStatement>(Source{});
+  block->append(create<ast::VariableDeclStatement>(Source{}, var));
   block->append(create<ast::SwitchStatement>(Source{Source::Location{12, 34}},
                                              cond, body));
 
@@ -133,22 +134,23 @@
       Source{}, mod()->RegisterSymbol("a"), "a");
 
   ast::CaseSelectorList default_csl_1;
-  auto* block_default_1 = create<ast::BlockStatement>();
+  auto* block_default_1 = create<ast::BlockStatement>(Source{});
   switch_body.push_back(
-      create<ast::CaseStatement>(default_csl_1, block_default_1));
+      create<ast::CaseStatement>(Source{}, default_csl_1, block_default_1));
 
   ast::CaseSelectorList csl_case_1;
   csl_case_1.push_back(create<ast::SintLiteral>(Source{}, &i32, 1));
-  auto* block_case_1 = create<ast::BlockStatement>();
-  switch_body.push_back(create<ast::CaseStatement>(csl_case_1, block_case_1));
+  auto* block_case_1 = create<ast::BlockStatement>(Source{});
+  switch_body.push_back(
+      create<ast::CaseStatement>(Source{}, csl_case_1, block_case_1));
 
   ast::CaseSelectorList default_csl_2;
-  auto* block_default_2 = create<ast::BlockStatement>();
+  auto* block_default_2 = create<ast::BlockStatement>(Source{});
   switch_body.push_back(
-      create<ast::CaseStatement>(default_csl_2, block_default_2));
+      create<ast::CaseStatement>(Source{}, default_csl_2, block_default_2));
 
-  auto* block = create<ast::BlockStatement>();
-  block->append(create<ast::VariableDeclStatement>(var));
+  auto* block = create<ast::BlockStatement>(Source{});
+  block->append(create<ast::VariableDeclStatement>(Source{}, var));
   block->append(create<ast::SwitchStatement>(Source{Source::Location{12, 34}},
                                              cond, switch_body));
 
@@ -185,16 +187,18 @@
 
   ast::CaseSelectorList csl;
   csl.push_back(create<ast::UintLiteral>(Source{}, &u32, 1));
-  switch_body.push_back(create<ast::CaseStatement>(
-      Source{Source::Location{12, 34}}, csl, create<ast::BlockStatement>()));
+  switch_body.push_back(
+      create<ast::CaseStatement>(Source{Source::Location{12, 34}}, csl,
+                                 create<ast::BlockStatement>(Source{})));
 
   ast::CaseSelectorList default_csl;
-  auto* block_default = create<ast::BlockStatement>();
-  switch_body.push_back(create<ast::CaseStatement>(default_csl, block_default));
+  auto* block_default = create<ast::BlockStatement>(Source{});
+  switch_body.push_back(
+      create<ast::CaseStatement>(Source{}, default_csl, block_default));
 
-  auto* block = create<ast::BlockStatement>();
-  block->append(create<ast::VariableDeclStatement>(var));
-  block->append(create<ast::SwitchStatement>(cond, switch_body));
+  auto* block = create<ast::BlockStatement>(Source{});
+  block->append(create<ast::VariableDeclStatement>(Source{}, var));
+  block->append(create<ast::SwitchStatement>(Source{}, cond, switch_body));
 
   EXPECT_TRUE(td()->DetermineStatements(block)) << td()->error();
   EXPECT_FALSE(v()->ValidateStatements(block));
@@ -229,16 +233,18 @@
 
   ast::CaseSelectorList csl;
   csl.push_back(create<ast::SintLiteral>(Source{}, &i32, -1));
-  switch_body.push_back(create<ast::CaseStatement>(
-      Source{Source::Location{12, 34}}, csl, create<ast::BlockStatement>()));
+  switch_body.push_back(
+      create<ast::CaseStatement>(Source{Source::Location{12, 34}}, csl,
+                                 create<ast::BlockStatement>(Source{})));
 
   ast::CaseSelectorList default_csl;
-  auto* block_default = create<ast::BlockStatement>();
-  switch_body.push_back(create<ast::CaseStatement>(default_csl, block_default));
+  auto* block_default = create<ast::BlockStatement>(Source{});
+  switch_body.push_back(
+      create<ast::CaseStatement>(Source{}, default_csl, block_default));
 
-  auto* block = create<ast::BlockStatement>();
-  block->append(create<ast::VariableDeclStatement>(var));
-  block->append(create<ast::SwitchStatement>(cond, switch_body));
+  auto* block = create<ast::BlockStatement>(Source{});
+  block->append(create<ast::VariableDeclStatement>(Source{}, var));
+  block->append(create<ast::SwitchStatement>(Source{}, cond, switch_body));
 
   EXPECT_TRUE(td()->DetermineStatements(block)) << td()->error();
   EXPECT_FALSE(v()->ValidateStatements(block));
@@ -272,22 +278,24 @@
 
   ast::CaseSelectorList csl_1;
   csl_1.push_back(create<ast::UintLiteral>(Source{}, &u32, 0));
-  switch_body.push_back(
-      create<ast::CaseStatement>(csl_1, create<ast::BlockStatement>()));
+  switch_body.push_back(create<ast::CaseStatement>(
+      Source{}, csl_1, create<ast::BlockStatement>(Source{})));
 
   ast::CaseSelectorList csl_2;
   csl_2.push_back(create<ast::UintLiteral>(Source{}, &u32, 2));
   csl_2.push_back(create<ast::UintLiteral>(Source{}, &u32, 2));
-  switch_body.push_back(create<ast::CaseStatement>(
-      Source{Source::Location{12, 34}}, csl_2, create<ast::BlockStatement>()));
+  switch_body.push_back(
+      create<ast::CaseStatement>(Source{Source::Location{12, 34}}, csl_2,
+                                 create<ast::BlockStatement>(Source{})));
 
   ast::CaseSelectorList default_csl;
-  auto* block_default = create<ast::BlockStatement>();
-  switch_body.push_back(create<ast::CaseStatement>(default_csl, block_default));
+  auto* block_default = create<ast::BlockStatement>(Source{});
+  switch_body.push_back(
+      create<ast::CaseStatement>(Source{}, default_csl, block_default));
 
-  auto* block = create<ast::BlockStatement>();
-  block->append(create<ast::VariableDeclStatement>(var));
-  block->append(create<ast::SwitchStatement>(cond, switch_body));
+  auto* block = create<ast::BlockStatement>(Source{});
+  block->append(create<ast::VariableDeclStatement>(Source{}, var));
+  block->append(create<ast::SwitchStatement>(Source{}, cond, switch_body));
 
   EXPECT_TRUE(td()->DetermineStatements(block)) << td()->error();
   EXPECT_FALSE(v()->ValidateStatements(block));
@@ -321,24 +329,26 @@
 
   ast::CaseSelectorList csl_1;
   csl_1.push_back(create<ast::SintLiteral>(Source{}, &i32, 10));
-  switch_body.push_back(
-      create<ast::CaseStatement>(csl_1, create<ast::BlockStatement>()));
+  switch_body.push_back(create<ast::CaseStatement>(
+      Source{}, csl_1, create<ast::BlockStatement>(Source{})));
 
   ast::CaseSelectorList csl_2;
   csl_2.push_back(create<ast::SintLiteral>(Source{}, &i32, 0));
   csl_2.push_back(create<ast::SintLiteral>(Source{}, &i32, 1));
   csl_2.push_back(create<ast::SintLiteral>(Source{}, &i32, 2));
   csl_2.push_back(create<ast::SintLiteral>(Source{}, &i32, 10));
-  switch_body.push_back(create<ast::CaseStatement>(
-      Source{Source::Location{12, 34}}, csl_2, create<ast::BlockStatement>()));
+  switch_body.push_back(
+      create<ast::CaseStatement>(Source{Source::Location{12, 34}}, csl_2,
+                                 create<ast::BlockStatement>(Source{})));
 
   ast::CaseSelectorList default_csl;
-  auto* block_default = create<ast::BlockStatement>();
-  switch_body.push_back(create<ast::CaseStatement>(default_csl, block_default));
+  auto* block_default = create<ast::BlockStatement>(Source{});
+  switch_body.push_back(
+      create<ast::CaseStatement>(Source{}, default_csl, block_default));
 
-  auto* block = create<ast::BlockStatement>();
-  block->append(create<ast::VariableDeclStatement>(var));
-  block->append(create<ast::SwitchStatement>(cond, switch_body));
+  auto* block = create<ast::BlockStatement>(Source{});
+  block->append(create<ast::VariableDeclStatement>(Source{}, var));
+  block->append(create<ast::SwitchStatement>(Source{}, cond, switch_body));
 
   EXPECT_TRUE(td()->DetermineStatements(block)) << td()->error();
   EXPECT_FALSE(v()->ValidateStatements(block));
@@ -367,15 +377,16 @@
   auto* cond = create<ast::IdentifierExpression>(
       Source{}, mod()->RegisterSymbol("a"), "a");
   ast::CaseSelectorList default_csl;
-  auto* block_default = create<ast::BlockStatement>();
+  auto* block_default = create<ast::BlockStatement>(Source{});
   block_default->append(
       create<ast::FallthroughStatement>(Source{Source::Location{12, 34}}));
   ast::CaseStatementList body;
-  body.push_back(create<ast::CaseStatement>(default_csl, block_default));
+  body.push_back(
+      create<ast::CaseStatement>(Source{}, default_csl, block_default));
 
-  auto* block = create<ast::BlockStatement>();
-  block->append(create<ast::VariableDeclStatement>(var));
-  block->append(create<ast::SwitchStatement>(cond, body));
+  auto* block = create<ast::BlockStatement>(Source{});
+  block->append(create<ast::VariableDeclStatement>(Source{}, var));
+  block->append(create<ast::SwitchStatement>(Source{}, cond, body));
 
   EXPECT_TRUE(td()->DetermineStatements(block)) << td()->error();
   EXPECT_FALSE(v()->ValidateStatements(block));
@@ -405,18 +416,18 @@
   auto* cond = create<ast::IdentifierExpression>(
       Source{}, mod()->RegisterSymbol("a"), "a");
   ast::CaseSelectorList default_csl;
-  auto* block_default = create<ast::BlockStatement>();
+  auto* block_default = create<ast::BlockStatement>(Source{});
   ast::CaseStatementList body;
   body.push_back(create<ast::CaseStatement>(Source{Source::Location{12, 34}},
                                             default_csl, block_default));
   ast::CaseSelectorList case_csl;
   case_csl.push_back(create<ast::SintLiteral>(Source{}, &i32, 5));
-  auto* block_case = create<ast::BlockStatement>();
-  body.push_back(create<ast::CaseStatement>(case_csl, block_case));
+  auto* block_case = create<ast::BlockStatement>(Source{});
+  body.push_back(create<ast::CaseStatement>(Source{}, case_csl, block_case));
 
-  auto* block = create<ast::BlockStatement>();
-  block->append(create<ast::VariableDeclStatement>(var));
-  block->append(create<ast::SwitchStatement>(cond, body));
+  auto* block = create<ast::BlockStatement>(Source{});
+  block->append(create<ast::VariableDeclStatement>(Source{}, var));
+  block->append(create<ast::SwitchStatement>(Source{}, cond, body));
 
   EXPECT_TRUE(td()->DetermineStatements(block)) << td()->error();
   EXPECT_TRUE(v()->ValidateStatements(block)) << v()->error();
@@ -446,14 +457,14 @@
   auto* cond = create<ast::IdentifierExpression>(
       Source{}, mod()->RegisterSymbol("a"), "a");
   ast::CaseSelectorList default_csl;
-  auto* block_default = create<ast::BlockStatement>();
+  auto* block_default = create<ast::BlockStatement>(Source{});
   ast::CaseStatementList body;
   body.push_back(create<ast::CaseStatement>(Source{Source::Location{12, 34}},
                                             default_csl, block_default));
 
-  auto* block = create<ast::BlockStatement>();
-  block->append(create<ast::VariableDeclStatement>(var));
-  block->append(create<ast::SwitchStatement>(cond, body));
+  auto* block = create<ast::BlockStatement>(Source{});
+  block->append(create<ast::VariableDeclStatement>(Source{}, var));
+  block->append(create<ast::SwitchStatement>(Source{}, cond, body));
 
   mod()->AddConstructedType(&my_int);
 
diff --git a/src/validator/validator_function_test.cc b/src/validator/validator_function_test.cc
index 2078a1a..50420bc 100644
--- a/src/validator/validator_function_test.cc
+++ b/src/validator/validator_function_test.cc
@@ -52,8 +52,8 @@
 
   ast::VariableList params;
   ast::type::Void void_type;
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
   auto* func = create<ast::Function>(
       Source{Source::Location{12, 34}}, mod()->RegisterSymbol("func"), "func",
       params, &void_type, body,
@@ -74,7 +74,7 @@
   ast::VariableList params;
   auto* func = create<ast::Function>(
       Source{Source::Location{12, 34}}, mod()->RegisterSymbol("func"), "func",
-      params, &void_type, create<ast::BlockStatement>(),
+      params, &void_type, create<ast::BlockStatement>(Source{}),
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
       });
@@ -101,8 +101,8 @@
 
   ast::VariableList params;
   ast::type::Void void_type;
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
   auto* func = create<ast::Function>(
       Source{Source::Location{12, 34}}, mod()->RegisterSymbol("func"), "func",
       params, &i32, body, ast::FunctionDecorationList{});
@@ -121,7 +121,7 @@
   ast::VariableList params;
   auto* func = create<ast::Function>(
       Source{Source::Location{12, 34}}, mod()->RegisterSymbol("func"), "func",
-      params, &i32, create<ast::BlockStatement>(),
+      params, &i32, create<ast::BlockStatement>(Source{}),
       ast::FunctionDecorationList{});
   mod()->AddFunction(func);
 
@@ -137,7 +137,7 @@
   ast::type::Void void_type;
   ast::VariableList params;
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
   auto* func = create<ast::Function>(
       Source{}, mod()->RegisterSymbol("func"), "func", params, &void_type, body,
@@ -155,7 +155,7 @@
   ast::type::Void void_type;
   ast::type::I32 i32;
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   auto* return_expr = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::SintLiteral>(Source{}, &i32, 2));
 
@@ -179,7 +179,7 @@
   ast::type::I32 i32;
   ast::type::F32 f32;
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   auto* return_expr = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::SintLiteral>(Source{}, &i32, 2));
 
@@ -205,7 +205,7 @@
   ast::type::I32 i32;
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   auto* return_expr = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::SintLiteral>(Source{}, &i32, 2));
 
@@ -215,7 +215,7 @@
                             params, &i32, body, ast::FunctionDecorationList{});
 
   ast::VariableList params_copy;
-  auto* body_copy = create<ast::BlockStatement>();
+  auto* body_copy = create<ast::BlockStatement>(Source{});
   auto* return_expr_copy = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::SintLiteral>(Source{}, &i32, 2));
 
@@ -243,8 +243,8 @@
                                         "func"),
       call_params);
   ast::VariableList params0;
-  auto* body0 = create<ast::BlockStatement>();
-  body0->append(create<ast::CallStatement>(call_expr));
+  auto* body0 = create<ast::BlockStatement>(Source{});
+  body0->append(create<ast::CallStatement>(Source{}, call_expr));
   body0->append(create<ast::ReturnStatement>(Source{}));
   auto* func0 = create<ast::Function>(Source{}, mod()->RegisterSymbol("func"),
                                       "func", params0, &f32, body0,
@@ -275,8 +275,8 @@
                             ast::VariableDecorationList{});  // decorations
 
   ast::VariableList params0;
-  auto* body0 = create<ast::BlockStatement>();
-  body0->append(create<ast::VariableDeclStatement>(var));
+  auto* body0 = create<ast::BlockStatement>(Source{});
+  body0->append(create<ast::VariableDeclStatement>(Source{}, var));
   auto* return_expr = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::SintLiteral>(Source{}, &i32, 2));
 
@@ -299,7 +299,7 @@
   auto* return_expr = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::SintLiteral>(Source{}, &i32, 0));
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}, return_expr));
   auto* func = create<ast::Function>(
       Source{Source::Location{12, 34}}, mod()->RegisterSymbol("vtx_main"),
@@ -329,7 +329,7 @@
                             false,                            // is_const
                             nullptr,                          // constructor
                             ast::VariableDecorationList{}));  // decorations
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
   auto* func = create<ast::Function>(
       Source{Source::Location{12, 34}}, mod()->RegisterSymbol("vtx_func"),
@@ -352,7 +352,7 @@
   // fn main() -> void { return; }
   ast::type::Void void_type;
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
   auto* func = create<ast::Function>(
       Source{Source::Location{12, 34}}, mod()->RegisterSymbol("main"), "main",
@@ -375,7 +375,7 @@
   // fn vtx_func() -> void { return; }
   ast::type::Void void_type;
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
   auto* func = create<ast::Function>(
       Source{}, mod()->RegisterSymbol("vtx_func"), "vtx_func", params,
@@ -393,7 +393,7 @@
   // fn vtx_func() -> void { return; }
   ast::type::Void void_type;
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
   auto* func = create<ast::Function>(
       Source{}, mod()->RegisterSymbol("vtx_func"), "vtx_func", params,
diff --git a/src/validator/validator_test.cc b/src/validator/validator_test.cc
index a3cac0e..765ebee 100644
--- a/src/validator/validator_test.cc
+++ b/src/validator/validator_test.cc
@@ -103,7 +103,7 @@
   auto* rhs = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::SintLiteral>(Source{}, &i32, 2));
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
       Source{Source::Location{12, 34}}, lhs, rhs));
 
@@ -199,8 +199,8 @@
   auto* rhs = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::SintLiteral>(Source{}, &i32, 2));
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
   body->append(create<ast::AssignmentStatement>(
       Source{Source::Location{12, 34}}, lhs, rhs));
 
@@ -234,8 +234,8 @@
   auto* rhs = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 2.3f));
 
-  ast::BlockStatement block;
-  block.append(create<ast::VariableDeclStatement>(var));
+  ast::BlockStatement block(Source{});
+  block.append(create<ast::VariableDeclStatement>(Source{}, var));
   block.append(create<ast::AssignmentStatement>(
       Source{Source::Location{12, 34}}, lhs, rhs));
 
@@ -339,7 +339,7 @@
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 3.14f));
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
       Source{Source::Location{12, 34}}, lhs, rhs));
 
@@ -379,7 +379,7 @@
 
   ast::VariableList params;
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
       Source{Source::Location{12, 34}}, lhs, rhs));
   body->append(create<ast::ReturnStatement>(Source{}));
@@ -415,15 +415,15 @@
   ast::type::Bool bool_type;
   auto* cond = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::BoolLiteral>(Source{}, &bool_type, true));
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
 
   auto* lhs = create<ast::IdentifierExpression>(
       Source{Source::Location{12, 34}}, mod()->RegisterSymbol("a"), "a");
   auto* rhs = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 3.14f));
 
-  auto* outer_body = create<ast::BlockStatement>();
+  auto* outer_body = create<ast::BlockStatement>(Source{});
   outer_body->append(
       create<ast::IfStatement>(Source{}, cond, body, ast::ElseStatementList{}));
   outer_body->append(create<ast::AssignmentStatement>(
@@ -461,12 +461,12 @@
   ast::type::Bool bool_type;
   auto* cond = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::BoolLiteral>(Source{}, &bool_type, true));
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
       Source{Source::Location{12, 34}}, lhs, rhs));
 
-  auto* outer_body = create<ast::BlockStatement>();
-  outer_body->append(create<ast::VariableDeclStatement>(var));
+  auto* outer_body = create<ast::BlockStatement>(Source{});
+  outer_body->append(create<ast::VariableDeclStatement>(Source{}, var));
   outer_body->append(
       create<ast::IfStatement>(Source{}, cond, body, ast::ElseStatementList{}));
   EXPECT_TRUE(td()->DetermineStatements(outer_body)) << td()->error();
@@ -564,8 +564,8 @@
   auto* rhs = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::SintLiteral>(Source{}, &i32, 2));
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
   body->append(create<ast::AssignmentStatement>(
       Source{Source::Location{12, 34}}, lhs, rhs));
 
@@ -609,7 +609,7 @@
           create<ast::FloatLiteral>(Source{}, &f32, 2.0)),  // constructor
       ast::VariableDecorationList{});                       // decorations
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::VariableDeclStatement>(
       Source{Source::Location{12, 34}}, var));
   auto* func = create<ast::Function>(Source{}, mod()->RegisterSymbol("my_func"),
@@ -655,8 +655,8 @@
       ast::VariableDecorationList{});                       // decorations
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
   body->append(create<ast::VariableDeclStatement>(
       Source{Source::Location{12, 34}}, var_a_float));
   auto* func = create<ast::Function>(Source{}, mod()->RegisterSymbol("my_func"),
@@ -691,8 +691,8 @@
   ast::type::Bool bool_type;
   auto* cond = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::BoolLiteral>(Source{}, &bool_type, true));
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
 
   auto* var_a_float = create<ast::Variable>(
       Source{},                  // source
@@ -705,7 +705,7 @@
           create<ast::FloatLiteral>(Source{}, &f32, 3.14)),  // constructor
       ast::VariableDecorationList{});                        // decorations
 
-  auto* outer_body = create<ast::BlockStatement>();
+  auto* outer_body = create<ast::BlockStatement>(Source{});
   outer_body->append(
       create<ast::IfStatement>(Source{}, cond, body, ast::ElseStatementList{}));
   outer_body->append(create<ast::VariableDeclStatement>(
@@ -748,12 +748,12 @@
   ast::type::Bool bool_type;
   auto* cond = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::BoolLiteral>(Source{}, &bool_type, true));
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::VariableDeclStatement>(
       Source{Source::Location{12, 34}}, var));
 
-  auto* outer_body = create<ast::BlockStatement>();
-  outer_body->append(create<ast::VariableDeclStatement>(var_a_float));
+  auto* outer_body = create<ast::BlockStatement>(Source{});
+  outer_body->append(create<ast::VariableDeclStatement>(Source{}, var_a_float));
   outer_body->append(
       create<ast::IfStatement>(Source{}, cond, body, ast::ElseStatementList{}));
 
@@ -790,7 +790,7 @@
       ast::VariableDecorationList{});                       // decorations
 
   ast::VariableList params0;
-  auto* body0 = create<ast::BlockStatement>();
+  auto* body0 = create<ast::BlockStatement>(Source{});
   body0->append(create<ast::VariableDeclStatement>(
       Source{Source::Location{12, 34}}, var0));
   body0->append(create<ast::ReturnStatement>(Source{}));
@@ -799,7 +799,7 @@
                                       ast::FunctionDecorationList{});
 
   ast::VariableList params1;
-  auto* body1 = create<ast::BlockStatement>();
+  auto* body1 = create<ast::BlockStatement>(Source{});
   body1->append(create<ast::VariableDeclStatement>(
       Source{Source::Location{13, 34}}, var1));
   body1->append(create<ast::ReturnStatement>(Source{}));
@@ -838,8 +838,8 @@
   auto* rhs = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::SintLiteral>(Source{}, &i32, 2));
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
   body->append(create<ast::AssignmentStatement>(
       Source{Source::Location{12, 34}}, lhs, rhs));
 
diff --git a/src/validator/validator_type_test.cc b/src/validator/validator_type_test.cc
index 0687ed9..6cb0a7c 100644
--- a/src/validator/validator_type_test.cc
+++ b/src/validator/validator_type_test.cc
@@ -203,7 +203,7 @@
                             ast::VariableDecorationList{});  // decorations
   ast::VariableList params;
   ast::type::Void void_type;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::VariableDeclStatement>(
       Source{Source::Location{12, 34}}, var));
 
diff --git a/src/writer/hlsl/generator_impl_assign_test.cc b/src/writer/hlsl/generator_impl_assign_test.cc
index 46e08bb..fcf37e8 100644
--- a/src/writer/hlsl/generator_impl_assign_test.cc
+++ b/src/writer/hlsl/generator_impl_assign_test.cc
@@ -32,7 +32,7 @@
       Source{}, mod.RegisterSymbol("lhs"), "lhs");
   auto* rhs = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("rhs"), "rhs");
-  ast::AssignmentStatement assign(lhs, rhs);
+  ast::AssignmentStatement assign(Source{}, lhs, rhs);
 
   gen.increment_indent();
 
diff --git a/src/writer/hlsl/generator_impl_binary_test.cc b/src/writer/hlsl/generator_impl_binary_test.cc
index b32ae91..3c52f9d 100644
--- a/src/writer/hlsl/generator_impl_binary_test.cc
+++ b/src/writer/hlsl/generator_impl_binary_test.cc
@@ -464,17 +464,18 @@
 
   ast::type::I32 i32;
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(
       Source{}, create<ast::ScalarConstructorExpression>(
                     Source{}, create<ast::SintLiteral>(Source{}, &i32, 3))));
-  auto* else_stmt = create<ast::ElseStatement>(body);
+  auto* else_stmt = create<ast::ElseStatement>(Source{}, nullptr, body);
 
-  body = create<ast::BlockStatement>();
+  body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(
       Source{}, create<ast::ScalarConstructorExpression>(
                     Source{}, create<ast::SintLiteral>(Source{}, &i32, 2))));
   auto* else_if_stmt = create<ast::ElseStatement>(
+      Source{},
       create<ast::BinaryExpression>(
           Source{}, ast::BinaryOp::kLogicalOr,
           create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("b"),
@@ -483,7 +484,7 @@
                                             "c")),
       body);
 
-  body = create<ast::BlockStatement>();
+  body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(
       Source{}, create<ast::ScalarConstructorExpression>(
                     Source{}, create<ast::SintLiteral>(Source{}, &i32, 1))));
@@ -563,11 +564,12 @@
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("d"), "d");
 
   ast::AssignmentStatement expr(
-      a, create<ast::BinaryExpression>(
-             Source{}, ast::BinaryOp::kLogicalAnd,
-             create<ast::BinaryExpression>(Source{}, ast::BinaryOp::kLogicalOr,
-                                           b, c),
-             d));
+      Source{}, a,
+      create<ast::BinaryExpression>(
+          Source{}, ast::BinaryOp::kLogicalAnd,
+          create<ast::BinaryExpression>(Source{}, ast::BinaryOp::kLogicalOr, b,
+                                        c),
+          d));
 
   ASSERT_TRUE(gen.EmitStatement(out, &expr)) << gen.error();
   EXPECT_EQ(result(), R"(bool _tint_tmp = b;
@@ -606,7 +608,7 @@
                                 d),                          // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  ast::VariableDeclStatement expr(var);
+  ast::VariableDeclStatement expr(Source{}, var);
 
   ASSERT_TRUE(gen.EmitStatement(out, &expr)) << gen.error();
   EXPECT_EQ(result(), R"(bool _tint_tmp = b;
@@ -657,9 +659,10 @@
 
   ast::type::Void void_type;
 
-  auto* func = create<ast::Function>(
-      Source{}, mod.RegisterSymbol("foo"), "foo", ast::VariableList{},
-      &void_type, create<ast::BlockStatement>(), ast::FunctionDecorationList{});
+  auto* func = create<ast::Function>(Source{}, mod.RegisterSymbol("foo"), "foo",
+                                     ast::VariableList{}, &void_type,
+                                     create<ast::BlockStatement>(Source{}),
+                                     ast::FunctionDecorationList{});
   mod.AddFunction(func);
 
   ast::ExpressionList params;
@@ -688,11 +691,12 @@
           create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("d"),
                                             "d"))));
 
-  ast::CallStatement expr(create<ast::CallExpression>(
-      Source{},
-      create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
-                                        "foo"),
-      params));
+  ast::CallStatement expr(Source{},
+                          create<ast::CallExpression>(
+                              Source{},
+                              create<ast::IdentifierExpression>(
+                                  Source{}, mod.RegisterSymbol("foo"), "foo"),
+                              params));
 
   ASSERT_TRUE(gen.EmitStatement(out, &expr)) << gen.error();
   EXPECT_EQ(result(), R"(bool _tint_tmp = a;
diff --git a/src/writer/hlsl/generator_impl_block_test.cc b/src/writer/hlsl/generator_impl_block_test.cc
index 7f0194e..0186588 100644
--- a/src/writer/hlsl/generator_impl_block_test.cc
+++ b/src/writer/hlsl/generator_impl_block_test.cc
@@ -26,8 +26,8 @@
 using HlslGeneratorImplTest_Block = TestHelper;
 
 TEST_F(HlslGeneratorImplTest_Block, Emit_Block) {
-  ast::BlockStatement b;
-  b.append(create<ast::DiscardStatement>());
+  ast::BlockStatement b(Source{});
+  b.append(create<ast::DiscardStatement>(Source{}));
 
   gen.increment_indent();
 
@@ -39,8 +39,8 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Block, Emit_Block_WithoutNewline) {
-  ast::BlockStatement b;
-  b.append(create<ast::DiscardStatement>());
+  ast::BlockStatement b(Source{});
+  b.append(create<ast::DiscardStatement>(Source{}));
 
   gen.increment_indent();
 
diff --git a/src/writer/hlsl/generator_impl_break_test.cc b/src/writer/hlsl/generator_impl_break_test.cc
index 3eb2f7f..d5a6e34 100644
--- a/src/writer/hlsl/generator_impl_break_test.cc
+++ b/src/writer/hlsl/generator_impl_break_test.cc
@@ -27,7 +27,7 @@
 using HlslGeneratorImplTest_Break = TestHelper;
 
 TEST_F(HlslGeneratorImplTest_Break, Emit_Break) {
-  ast::BreakStatement b;
+  ast::BreakStatement b(Source{});
 
   gen.increment_indent();
 
diff --git a/src/writer/hlsl/generator_impl_call_test.cc b/src/writer/hlsl/generator_impl_call_test.cc
index 60b9c22..50d06d6 100644
--- a/src/writer/hlsl/generator_impl_call_test.cc
+++ b/src/writer/hlsl/generator_impl_call_test.cc
@@ -36,9 +36,10 @@
       Source{}, mod.RegisterSymbol("my_func"), "my_func");
   ast::CallExpression call(Source{}, id, {});
 
-  auto* func = create<ast::Function>(
-      Source{}, mod.RegisterSymbol("my_func"), "my_func", ast::VariableList{},
-      &void_type, create<ast::BlockStatement>(), ast::FunctionDecorationList{});
+  auto* func = create<ast::Function>(Source{}, mod.RegisterSymbol("my_func"),
+                                     "my_func", ast::VariableList{}, &void_type,
+                                     create<ast::BlockStatement>(Source{}),
+                                     ast::FunctionDecorationList{});
   mod.AddFunction(func);
 
   ASSERT_TRUE(gen.EmitExpression(pre, out, &call)) << gen.error();
@@ -57,9 +58,10 @@
       Source{}, mod.RegisterSymbol("param2"), "param2"));
   ast::CallExpression call(Source{}, id, params);
 
-  auto* func = create<ast::Function>(
-      Source{}, mod.RegisterSymbol("my_func"), "my_func", ast::VariableList{},
-      &void_type, create<ast::BlockStatement>(), ast::FunctionDecorationList{});
+  auto* func = create<ast::Function>(Source{}, mod.RegisterSymbol("my_func"),
+                                     "my_func", ast::VariableList{}, &void_type,
+                                     create<ast::BlockStatement>(Source{}),
+                                     ast::FunctionDecorationList{});
   mod.AddFunction(func);
 
   ASSERT_TRUE(gen.EmitExpression(pre, out, &call)) << gen.error();
@@ -76,11 +78,13 @@
       Source{}, mod.RegisterSymbol("param1"), "param1"));
   params.push_back(create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("param2"), "param2"));
-  ast::CallStatement call(create<ast::CallExpression>(Source{}, id, params));
+  ast::CallStatement call(Source{},
+                          create<ast::CallExpression>(Source{}, id, params));
 
-  auto* func = create<ast::Function>(
-      Source{}, mod.RegisterSymbol("my_func"), "my_func", ast::VariableList{},
-      &void_type, create<ast::BlockStatement>(), ast::FunctionDecorationList{});
+  auto* func = create<ast::Function>(Source{}, mod.RegisterSymbol("my_func"),
+                                     "my_func", ast::VariableList{}, &void_type,
+                                     create<ast::BlockStatement>(Source{}),
+                                     ast::FunctionDecorationList{});
   mod.AddFunction(func);
   gen.increment_indent();
   ASSERT_TRUE(gen.EmitStatement(out, &call)) << gen.error();
diff --git a/src/writer/hlsl/generator_impl_case_test.cc b/src/writer/hlsl/generator_impl_case_test.cc
index c6117bb..55105f8 100644
--- a/src/writer/hlsl/generator_impl_case_test.cc
+++ b/src/writer/hlsl/generator_impl_case_test.cc
@@ -33,12 +33,12 @@
 TEST_F(HlslGeneratorImplTest_Case, Emit_Case) {
   ast::type::I32 i32;
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::BreakStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::BreakStatement>(Source{}));
 
   ast::CaseSelectorList lit;
   lit.push_back(create<ast::SintLiteral>(Source{}, &i32, 5));
-  ast::CaseStatement c(lit, body);
+  ast::CaseStatement c(Source{}, lit, body);
 
   gen.increment_indent();
 
@@ -54,7 +54,7 @@
 
   ast::CaseSelectorList lit;
   lit.push_back(create<ast::SintLiteral>(Source{}, &i32, 5));
-  ast::CaseStatement c(lit, create<ast::BlockStatement>());
+  ast::CaseStatement c(Source{}, lit, create<ast::BlockStatement>(Source{}));
 
   gen.increment_indent();
 
@@ -68,12 +68,12 @@
 TEST_F(HlslGeneratorImplTest_Case, Emit_Case_WithFallthrough) {
   ast::type::I32 i32;
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::FallthroughStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::FallthroughStatement>(Source{}));
 
   ast::CaseSelectorList lit;
   lit.push_back(create<ast::SintLiteral>(Source{}, &i32, 5));
-  ast::CaseStatement c(lit, body);
+  ast::CaseStatement c(Source{}, lit, body);
 
   gen.increment_indent();
 
@@ -87,13 +87,13 @@
 TEST_F(HlslGeneratorImplTest_Case, Emit_Case_MultipleSelectors) {
   ast::type::I32 i32;
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::BreakStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::BreakStatement>(Source{}));
 
   ast::CaseSelectorList lit;
   lit.push_back(create<ast::SintLiteral>(Source{}, &i32, 5));
   lit.push_back(create<ast::SintLiteral>(Source{}, &i32, 6));
-  ast::CaseStatement c(lit, body);
+  ast::CaseStatement c(Source{}, lit, body);
 
   gen.increment_indent();
 
@@ -106,9 +106,9 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Case, Emit_Case_Default) {
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::BreakStatement>());
-  ast::CaseStatement c(body);
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::BreakStatement>(Source{}));
+  ast::CaseStatement c(Source{}, ast::CaseSelectorList{}, body);
 
   gen.increment_indent();
 
diff --git a/src/writer/hlsl/generator_impl_continue_test.cc b/src/writer/hlsl/generator_impl_continue_test.cc
index 7b548b9..0502ea6 100644
--- a/src/writer/hlsl/generator_impl_continue_test.cc
+++ b/src/writer/hlsl/generator_impl_continue_test.cc
@@ -27,7 +27,7 @@
 using HlslGeneratorImplTest_Continue = TestHelper;
 
 TEST_F(HlslGeneratorImplTest_Continue, Emit_Continue) {
-  ast::ContinueStatement c;
+  ast::ContinueStatement c(Source{});
 
   gen.increment_indent();
 
diff --git a/src/writer/hlsl/generator_impl_discard_test.cc b/src/writer/hlsl/generator_impl_discard_test.cc
index 422d39c..5e7a13c 100644
--- a/src/writer/hlsl/generator_impl_discard_test.cc
+++ b/src/writer/hlsl/generator_impl_discard_test.cc
@@ -24,7 +24,7 @@
 using HlslGeneratorImplTest_Discard = TestHelper;
 
 TEST_F(HlslGeneratorImplTest_Discard, Emit_Discard) {
-  ast::DiscardStatement stmt;
+  ast::DiscardStatement stmt(Source{});
 
   gen.increment_indent();
 
diff --git a/src/writer/hlsl/generator_impl_function_entry_point_data_test.cc b/src/writer/hlsl/generator_impl_function_entry_point_data_test.cc
index a61d366..2deaf62 100644
--- a/src/writer/hlsl/generator_impl_function_entry_point_data_test.cc
+++ b/src/writer/hlsl/generator_impl_function_entry_point_data_test.cc
@@ -82,13 +82,15 @@
   mod.AddGlobalVariable(bar_var);
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo")));
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
                                         "bar"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
@@ -159,13 +161,15 @@
 
   ast::VariableList params;
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo")));
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
                                         "bar"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
@@ -236,13 +240,15 @@
 
   ast::VariableList params;
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo")));
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
                                         "bar"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
@@ -312,13 +318,15 @@
   mod.AddGlobalVariable(bar_var);
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo")));
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
                                         "bar"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
@@ -385,13 +393,15 @@
   mod.AddGlobalVariable(bar_var);
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo")));
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
                                         "bar"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
@@ -453,13 +463,15 @@
   mod.AddGlobalVariable(bar_var);
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo")));
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
                                         "bar"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
@@ -528,8 +540,9 @@
   mod.AddGlobalVariable(depth_var);
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("depth"),
                                         "depth"),
       create<ast::MemberAccessorExpression>(
diff --git a/src/writer/hlsl/generator_impl_function_test.cc b/src/writer/hlsl/generator_impl_function_test.cc
index 619b7ec..6a5cecc 100644
--- a/src/writer/hlsl/generator_impl_function_test.cc
+++ b/src/writer/hlsl/generator_impl_function_test.cc
@@ -55,7 +55,7 @@
 TEST_F(HlslGeneratorImplTest_Function, Emit_Function) {
   ast::type::Void void_type;
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
   auto* func = create<ast::Function>(Source{}, mod.RegisterSymbol("my_func"),
                                      "my_func", ast::VariableList{}, &void_type,
@@ -75,7 +75,7 @@
 TEST_F(HlslGeneratorImplTest_Function, Emit_Function_Name_Collision) {
   ast::type::Void void_type;
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("GeometryShader"), "GeometryShader",
@@ -116,7 +116,7 @@
 
   ast::type::Void void_type;
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
   auto* func = create<ast::Function>(Source{}, mod.RegisterSymbol("my_func"),
                                      "my_func", params, &void_type, body,
@@ -169,8 +169,9 @@
   mod.AddGlobalVariable(bar_var);
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
                                         "bar"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
@@ -241,8 +242,9 @@
   mod.AddGlobalVariable(depth_var);
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("depth"),
                                         "depth"),
       create<ast::MemberAccessorExpression>(
@@ -317,8 +319,8 @@
                                             "x")),  // constructor
       ast::VariableDecorationList{});               // decorations
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
   body->append(create<ast::ReturnStatement>(Source{}));
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params,
@@ -394,8 +396,8 @@
                                             "x")),  // constructor
       ast::VariableDecorationList{});               // decorations
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
   body->append(create<ast::ReturnStatement>(Source{}));
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params,
@@ -473,8 +475,8 @@
                                             "b")),  // constructor
       ast::VariableDecorationList{});               // decorations
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
   body->append(create<ast::ReturnStatement>(Source{}));
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params,
@@ -548,8 +550,8 @@
                                             "b")),  // constructor
       ast::VariableDecorationList{});               // decorations
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
   body->append(create<ast::ReturnStatement>(Source{}));
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params,
@@ -621,7 +623,7 @@
       create<ast::ScalarConstructorExpression>(
           Source{}, create<ast::FloatLiteral>(Source{}, &f32, 2.0f)));
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(assign);
   body->append(create<ast::ReturnStatement>(Source{}));
   auto* func = create<ast::Function>(
@@ -705,13 +707,15 @@
                             nullptr,                          // constructor
                             ast::VariableDecorationList{}));  // decorations
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
                                         "bar"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo")));
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("val"),
                                         "val"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("param"),
@@ -729,8 +733,9 @@
   expr.push_back(create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.0f)));
 
-  body = create<ast::BlockStatement>();
+  body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
                                         "bar"),
       create<ast::CallExpression>(
@@ -805,7 +810,7 @@
                             nullptr,                          // constructor
                             ast::VariableDecorationList{}));  // decorations
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(
       Source{}, create<ast::IdentifierExpression>(
                     Source{}, mod.RegisterSymbol("param"), "param")));
@@ -819,8 +824,9 @@
   expr.push_back(create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.0f)));
 
-  body = create<ast::BlockStatement>();
+  body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("depth"),
                                         "depth"),
       create<ast::CallExpression>(
@@ -903,8 +909,9 @@
                             nullptr,                          // constructor
                             ast::VariableDecorationList{}));  // decorations
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("depth"),
                                         "depth"),
       create<ast::MemberAccessorExpression>(
@@ -926,8 +933,9 @@
   expr.push_back(create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.0f)));
 
-  body = create<ast::BlockStatement>();
+  body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("depth"),
                                         "depth"),
       create<ast::CallExpression>(
@@ -1001,7 +1009,7 @@
                             nullptr,                          // constructor
                             ast::VariableDecorationList{}));  // decorations
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(
       Source{}, create<ast::MemberAccessorExpression>(
                     Source{},
@@ -1032,8 +1040,8 @@
           expr),                       // constructor
       ast::VariableDecorationList{});  // decorations
 
-  body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
   body->append(create<ast::ReturnStatement>(Source{}));
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params,
@@ -1095,7 +1103,7 @@
                             nullptr,                          // constructor
                             ast::VariableDecorationList{}));  // decorations
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(
       Source{}, create<ast::MemberAccessorExpression>(
                     Source{},
@@ -1126,8 +1134,8 @@
           expr),                       // constructor
       ast::VariableDecorationList{});  // decorations
 
-  body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
   body->append(create<ast::ReturnStatement>(Source{}));
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params,
@@ -1176,14 +1184,15 @@
   mod.AddGlobalVariable(bar_var);
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
                                         "bar"),
       create<ast::ScalarConstructorExpression>(
           Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.0f))));
 
-  auto* list = create<ast::BlockStatement>();
+  auto* list = create<ast::BlockStatement>(Source{});
   list->append(create<ast::ReturnStatement>(Source{}));
 
   body->append(create<ast::IfStatement>(
@@ -1229,7 +1238,7 @@
 
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("GeometryShader"), "GeometryShader",
-      ast::VariableList{}, &void_type, create<ast::BlockStatement>(),
+      ast::VariableList{}, &void_type, create<ast::BlockStatement>(Source{}),
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
       });
@@ -1248,7 +1257,7 @@
   ast::type::Void void_type;
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("main"), "main", params, &void_type, body,
@@ -1273,7 +1282,7 @@
   ast::type::Void void_type;
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("main"), "main", params, &void_type, body,
@@ -1310,7 +1319,7 @@
 
   ast::type::Void void_type;
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
   auto* func = create<ast::Function>(Source{}, mod.RegisterSymbol("my_func"),
                                      "my_func", params, &void_type, body,
@@ -1394,8 +1403,8 @@
                                               "d")),  // constructor
         ast::VariableDecorationList{});               // decorations
 
-    auto* body = create<ast::BlockStatement>();
-    body->append(create<ast::VariableDeclStatement>(var));
+    auto* body = create<ast::BlockStatement>(Source{});
+    body->append(create<ast::VariableDeclStatement>(Source{}, var));
     body->append(create<ast::ReturnStatement>(Source{}));
     auto* func = create<ast::Function>(
         Source{}, mod.RegisterSymbol("a"), "a", params, &void_type, body,
@@ -1423,8 +1432,8 @@
                                               "d")),  // constructor
         ast::VariableDecorationList{});               // decorations
 
-    auto* body = create<ast::BlockStatement>();
-    body->append(create<ast::VariableDeclStatement>(var));
+    auto* body = create<ast::BlockStatement>(Source{});
+    body->append(create<ast::VariableDeclStatement>(Source{}, var));
     body->append(create<ast::ReturnStatement>(Source{}));
     auto* func = create<ast::Function>(
         Source{}, mod.RegisterSymbol("b"), "b", params, &void_type, body,
diff --git a/src/writer/hlsl/generator_impl_if_test.cc b/src/writer/hlsl/generator_impl_if_test.cc
index 6da8512..664a76a 100644
--- a/src/writer/hlsl/generator_impl_if_test.cc
+++ b/src/writer/hlsl/generator_impl_if_test.cc
@@ -29,7 +29,7 @@
 TEST_F(HlslGeneratorImplTest_If, Emit_If) {
   auto* cond = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("cond"), "cond");
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
 
   ast::IfStatement i(Source{}, cond, body, ast::ElseStatementList{});
@@ -45,16 +45,17 @@
 TEST_F(HlslGeneratorImplTest_If, Emit_IfWithElseIf) {
   auto* else_cond = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("else_cond"), "else_cond");
-  auto* else_body = create<ast::BlockStatement>();
+  auto* else_body = create<ast::BlockStatement>(Source{});
   else_body->append(create<ast::ReturnStatement>(Source{}));
 
   auto* cond = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("cond"), "cond");
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
 
-  ast::IfStatement i(Source{}, cond, body,
-                     {create<ast::ElseStatement>(else_cond, else_body)});
+  ast::IfStatement i(
+      Source{}, cond, body,
+      {create<ast::ElseStatement>(Source{}, else_cond, else_body)});
 
   gen.increment_indent();
 
@@ -70,16 +71,17 @@
 }
 
 TEST_F(HlslGeneratorImplTest_If, Emit_IfWithElse) {
-  auto* else_body = create<ast::BlockStatement>();
+  auto* else_body = create<ast::BlockStatement>(Source{});
   else_body->append(create<ast::ReturnStatement>(Source{}));
 
   auto* cond = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("cond"), "cond");
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
 
-  ast::IfStatement i(Source{}, cond, body,
-                     {create<ast::ElseStatement>(else_body)});
+  ast::IfStatement i(
+      Source{}, cond, body,
+      {create<ast::ElseStatement>(Source{}, nullptr, else_body)});
 
   gen.increment_indent();
 
@@ -96,22 +98,23 @@
   auto* else_cond = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("else_cond"), "else_cond");
 
-  auto* else_body = create<ast::BlockStatement>();
+  auto* else_body = create<ast::BlockStatement>(Source{});
   else_body->append(create<ast::ReturnStatement>(Source{}));
 
-  auto* else_body_2 = create<ast::BlockStatement>();
+  auto* else_body_2 = create<ast::BlockStatement>(Source{});
   else_body_2->append(create<ast::ReturnStatement>(Source{}));
 
   auto* cond = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("cond"), "cond");
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
 
-  ast::IfStatement i(Source{}, cond, body,
-                     {
-                         create<ast::ElseStatement>(else_cond, else_body),
-                         create<ast::ElseStatement>(else_body_2),
-                     });
+  ast::IfStatement i(
+      Source{}, cond, body,
+      {
+          create<ast::ElseStatement>(Source{}, else_cond, else_body),
+          create<ast::ElseStatement>(Source{}, nullptr, else_body_2),
+      });
 
   gen.increment_indent();
 
diff --git a/src/writer/hlsl/generator_impl_loop_test.cc b/src/writer/hlsl/generator_impl_loop_test.cc
index 6afc947..c413a52 100644
--- a/src/writer/hlsl/generator_impl_loop_test.cc
+++ b/src/writer/hlsl/generator_impl_loop_test.cc
@@ -34,10 +34,10 @@
 using HlslGeneratorImplTest_Loop = TestHelper;
 
 TEST_F(HlslGeneratorImplTest_Loop, Emit_Loop) {
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::DiscardStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::DiscardStatement>(Source{}));
 
-  ast::LoopStatement l(body, {});
+  ast::LoopStatement l(Source{}, body, {});
   gen.increment_indent();
 
   ASSERT_TRUE(gen.EmitStatement(out, &l)) << gen.error();
@@ -48,13 +48,13 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Loop, Emit_LoopWithContinuing) {
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::DiscardStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::DiscardStatement>(Source{}));
 
-  auto* continuing = create<ast::BlockStatement>();
+  auto* continuing = create<ast::BlockStatement>(Source{});
   continuing->append(create<ast::ReturnStatement>(Source{}));
 
-  ast::LoopStatement l(body, continuing);
+  ast::LoopStatement l(Source{}, body, continuing);
   gen.increment_indent();
 
   ASSERT_TRUE(gen.EmitStatement(out, &l)) << gen.error();
@@ -75,15 +75,15 @@
 TEST_F(HlslGeneratorImplTest_Loop, Emit_LoopNestedWithContinuing) {
   ast::type::F32 f32;
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::DiscardStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::DiscardStatement>(Source{}));
 
-  auto* continuing = create<ast::BlockStatement>();
+  auto* continuing = create<ast::BlockStatement>(Source{});
   continuing->append(create<ast::ReturnStatement>(Source{}));
 
-  auto* inner = create<ast::LoopStatement>(body, continuing);
+  auto* inner = create<ast::LoopStatement>(Source{}, body, continuing);
 
-  body = create<ast::BlockStatement>();
+  body = create<ast::BlockStatement>(Source{});
   body->append(inner);
 
   auto* lhs = create<ast::IdentifierExpression>(
@@ -91,10 +91,10 @@
   auto* rhs = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("rhs"), "rhs");
 
-  continuing = create<ast::BlockStatement>();
-  continuing->append(create<ast::AssignmentStatement>(lhs, rhs));
+  continuing = create<ast::BlockStatement>(Source{});
+  continuing->append(create<ast::AssignmentStatement>(Source{}, lhs, rhs));
 
-  ast::LoopStatement outer(body, continuing);
+  ast::LoopStatement outer(Source{}, body, continuing);
   gen.increment_indent();
 
   ASSERT_TRUE(gen.EmitStatement(out, &outer)) << gen.error();
@@ -157,9 +157,10 @@
           create<ast::FloatLiteral>(Source{}, &f32, 2.4)),  // constructor
       ast::VariableDecorationList{});                       // decorations
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
   body->append(create<ast::VariableDeclStatement>(
+      Source{},
       create<ast::Variable>(Source{},                          // source
                             "other",                           // name
                             ast::StorageClass::kFunction,      // storage_class
@@ -173,10 +174,10 @@
   auto* rhs = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("rhs"), "rhs");
 
-  auto* continuing = create<ast::BlockStatement>();
-  continuing->append(create<ast::AssignmentStatement>(lhs, rhs));
+  auto* continuing = create<ast::BlockStatement>(Source{});
+  continuing->append(create<ast::AssignmentStatement>(Source{}, lhs, rhs));
 
-  ast::LoopStatement outer(body, continuing);
+  ast::LoopStatement outer(Source{}, body, continuing);
   gen.increment_indent();
 
   ASSERT_TRUE(gen.EmitStatement(out, &outer)) << gen.error();
diff --git a/src/writer/hlsl/generator_impl_member_accessor_test.cc b/src/writer/hlsl/generator_impl_member_accessor_test.cc
index f689fb6..e21b210 100644
--- a/src/writer/hlsl/generator_impl_member_accessor_test.cc
+++ b/src/writer/hlsl/generator_impl_member_accessor_test.cc
@@ -244,7 +244,7 @@
   auto* rhs =
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("b"), "b");
 
-  ast::AssignmentStatement assign(lhs, rhs);
+  ast::AssignmentStatement assign(Source{}, lhs, rhs);
 
   td.RegisterVariableForTesting(coord_var);
   td.RegisterVariableForTesting(b_var);
@@ -311,7 +311,7 @@
   auto* rhs = create<ast::TypeConstructorExpression>(Source{}, &mat,
                                                      ast::ExpressionList{});
 
-  ast::AssignmentStatement assign(lhs, rhs);
+  ast::AssignmentStatement assign(Source{}, lhs, rhs);
 
   td.RegisterVariableForTesting(coord_var);
   gen.register_global(coord_var);
@@ -730,7 +730,7 @@
                                         "b"));
   auto* rhs = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 2.0f));
-  ast::AssignmentStatement assign(lhs, rhs);
+  ast::AssignmentStatement assign(Source{}, lhs, rhs);
 
   ASSERT_TRUE(td.DetermineResultType(&assign));
   ASSERT_TRUE(gen.EmitStatement(out, &assign)) << gen.error();
@@ -791,7 +791,7 @@
           Source{}, create<ast::SintLiteral>(Source{}, &i32, 2)));
   auto* rhs = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::SintLiteral>(Source{}, &i32, 2));
-  ast::AssignmentStatement assign(lhs, rhs);
+  ast::AssignmentStatement assign(Source{}, lhs, rhs);
 
   ASSERT_TRUE(td.DetermineResultType(&assign)) << td.error();
   ASSERT_TRUE(gen.EmitStatement(out, &assign)) << gen.error();
@@ -849,7 +849,7 @@
                                         "a"));
   auto* rhs = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::SintLiteral>(Source{}, &i32, 2));
-  ast::AssignmentStatement assign(lhs, rhs);
+  ast::AssignmentStatement assign(Source{}, lhs, rhs);
 
   ASSERT_TRUE(td.DetermineResultType(&assign));
   ASSERT_TRUE(gen.EmitStatement(out, &assign)) << gen.error();
@@ -973,7 +973,7 @@
                                         "b"));
   auto* rhs = create<ast::TypeConstructorExpression>(Source{}, &fvec3, values);
 
-  ast::AssignmentStatement assign(lhs, rhs);
+  ast::AssignmentStatement assign(Source{}, lhs, rhs);
 
   ASSERT_TRUE(td.DetermineResultType(&assign));
   ASSERT_TRUE(gen.EmitStatement(out, &assign)) << gen.error();
@@ -1408,7 +1408,7 @@
 
   auto* rhs = create<ast::TypeConstructorExpression>(Source{}, &fvec3, values);
 
-  ast::AssignmentStatement assign(lhs, rhs);
+  ast::AssignmentStatement assign(Source{}, lhs, rhs);
 
   ASSERT_TRUE(td.DetermineResultType(&assign));
   ASSERT_TRUE(gen.EmitStatement(out, &assign)) << gen.error();
@@ -1500,7 +1500,7 @@
   auto* rhs = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &i32, 1.f));
 
-  ast::AssignmentStatement assign(lhs, rhs);
+  ast::AssignmentStatement assign(Source{}, lhs, rhs);
 
   ASSERT_TRUE(td.DetermineResultType(&assign));
   ASSERT_TRUE(gen.EmitStatement(out, &assign)) << gen.error();
diff --git a/src/writer/hlsl/generator_impl_switch_test.cc b/src/writer/hlsl/generator_impl_switch_test.cc
index e2b053d..aed1833 100644
--- a/src/writer/hlsl/generator_impl_switch_test.cc
+++ b/src/writer/hlsl/generator_impl_switch_test.cc
@@ -31,18 +31,19 @@
 using HlslGeneratorImplTest_Switch = TestHelper;
 
 TEST_F(HlslGeneratorImplTest_Switch, Emit_Switch) {
-  auto* def_body = create<ast::BlockStatement>();
-  def_body->append(create<ast::BreakStatement>());
-  auto* def = create<ast::CaseStatement>(def_body);
+  auto* def_body = create<ast::BlockStatement>(Source{});
+  def_body->append(create<ast::BreakStatement>(Source{}));
+  auto* def =
+      create<ast::CaseStatement>(Source{}, ast::CaseSelectorList{}, def_body);
 
   ast::type::I32 i32;
   ast::CaseSelectorList case_val;
   case_val.push_back(create<ast::SintLiteral>(Source{}, &i32, 5));
 
-  auto* case_body = create<ast::BlockStatement>();
-  case_body->append(create<ast::BreakStatement>());
+  auto* case_body = create<ast::BlockStatement>(Source{});
+  case_body->append(create<ast::BreakStatement>(Source{}));
 
-  auto* case_stmt = create<ast::CaseStatement>(case_val, case_body);
+  auto* case_stmt = create<ast::CaseStatement>(Source{}, case_val, case_body);
 
   ast::CaseStatementList body;
   body.push_back(case_stmt);
@@ -50,7 +51,7 @@
 
   auto* cond = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("cond"), "cond");
-  ast::SwitchStatement s(cond, body);
+  ast::SwitchStatement s(Source{}, cond, body);
   gen.increment_indent();
 
   ASSERT_TRUE(gen.EmitStatement(out, &s)) << gen.error();
diff --git a/src/writer/hlsl/generator_impl_test.cc b/src/writer/hlsl/generator_impl_test.cc
index b7bb46a..19931af 100644
--- a/src/writer/hlsl/generator_impl_test.cc
+++ b/src/writer/hlsl/generator_impl_test.cc
@@ -29,9 +29,10 @@
 
 TEST_F(HlslGeneratorImplTest, Generate) {
   ast::type::Void void_type;
-  auto* func = create<ast::Function>(
-      Source{}, mod.RegisterSymbol("my_func"), "my_func", ast::VariableList{},
-      &void_type, create<ast::BlockStatement>(), ast::FunctionDecorationList{});
+  auto* func = create<ast::Function>(Source{}, mod.RegisterSymbol("my_func"),
+                                     "my_func", ast::VariableList{}, &void_type,
+                                     create<ast::BlockStatement>(Source{}),
+                                     ast::FunctionDecorationList{});
   mod.AddFunction(func);
 
   ASSERT_TRUE(gen.Generate(out)) << gen.error();
diff --git a/src/writer/hlsl/generator_impl_variable_decl_statement_test.cc b/src/writer/hlsl/generator_impl_variable_decl_statement_test.cc
index 469725f..b0a21e9 100644
--- a/src/writer/hlsl/generator_impl_variable_decl_statement_test.cc
+++ b/src/writer/hlsl/generator_impl_variable_decl_statement_test.cc
@@ -43,7 +43,7 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  ast::VariableDeclStatement stmt(var);
+  ast::VariableDeclStatement stmt(Source{}, var);
   gen.increment_indent();
 
   ASSERT_TRUE(gen.EmitStatement(out, &stmt)) << gen.error();
@@ -61,7 +61,7 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  ast::VariableDeclStatement stmt(var);
+  ast::VariableDeclStatement stmt(Source{}, var);
   gen.increment_indent();
 
   ASSERT_TRUE(gen.EmitStatement(out, &stmt)) << gen.error();
@@ -81,7 +81,7 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  ast::VariableDeclStatement stmt(var);
+  ast::VariableDeclStatement stmt(Source{}, var);
   gen.increment_indent();
 
   ASSERT_TRUE(gen.EmitStatement(out, &stmt)) << gen.error();
@@ -100,7 +100,7 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  ast::VariableDeclStatement stmt(var);
+  ast::VariableDeclStatement stmt(Source{}, var);
   gen.increment_indent();
 
   ASSERT_TRUE(gen.EmitStatement(out, &stmt)) << gen.error();
@@ -118,7 +118,7 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  ast::VariableDeclStatement stmt(var);
+  ast::VariableDeclStatement stmt(Source{}, var);
   gen.increment_indent();
 
   ASSERT_TRUE(gen.EmitStatement(out, &stmt)) << gen.error();
@@ -140,7 +140,7 @@
                             ident,                           // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  ast::VariableDeclStatement stmt(var);
+  ast::VariableDeclStatement stmt(Source{}, var);
   ASSERT_TRUE(gen.EmitStatement(out, &stmt)) << gen.error();
   EXPECT_EQ(result(), R"(float a = initializer;
 )");
@@ -164,7 +164,7 @@
                             zero_vec,                        // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  ast::VariableDeclStatement stmt(var);
+  ast::VariableDeclStatement stmt(Source{}, var);
   ASSERT_TRUE(gen.EmitStatement(out, &stmt)) << gen.error();
   EXPECT_EQ(result(), R"(float3 a = float3(0.0f);
 )");
@@ -188,7 +188,7 @@
                             zero_mat,                        // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  ast::VariableDeclStatement stmt(var);
+  ast::VariableDeclStatement stmt(Source{}, var);
   ASSERT_TRUE(gen.EmitStatement(out, &stmt)) << gen.error();
   EXPECT_EQ(result(),
             R"(float3x2 a = float3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
diff --git a/src/writer/msl/generator_impl_assign_test.cc b/src/writer/msl/generator_impl_assign_test.cc
index 9fcdddf..2db16f4 100644
--- a/src/writer/msl/generator_impl_assign_test.cc
+++ b/src/writer/msl/generator_impl_assign_test.cc
@@ -34,7 +34,7 @@
       Source{}, mod.RegisterSymbol("lhs"), "lhs");
   auto* rhs = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("rhs"), "rhs");
-  ast::AssignmentStatement assign(lhs, rhs);
+  ast::AssignmentStatement assign(Source{}, lhs, rhs);
 
   gen.increment_indent();
 
diff --git a/src/writer/msl/generator_impl_block_test.cc b/src/writer/msl/generator_impl_block_test.cc
index 4e4cf2b..a7b8ec3 100644
--- a/src/writer/msl/generator_impl_block_test.cc
+++ b/src/writer/msl/generator_impl_block_test.cc
@@ -28,8 +28,8 @@
 using MslGeneratorImplTest = TestHelper;
 
 TEST_F(MslGeneratorImplTest, Emit_Block) {
-  ast::BlockStatement b;
-  b.append(create<ast::DiscardStatement>());
+  ast::BlockStatement b(Source{});
+  b.append(create<ast::DiscardStatement>(Source{}));
 
   gen.increment_indent();
 
@@ -41,8 +41,8 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_Block_WithoutNewline) {
-  ast::BlockStatement b;
-  b.append(create<ast::DiscardStatement>());
+  ast::BlockStatement b(Source{});
+  b.append(create<ast::DiscardStatement>(Source{}));
 
   gen.increment_indent();
 
diff --git a/src/writer/msl/generator_impl_break_test.cc b/src/writer/msl/generator_impl_break_test.cc
index daf276c..1860910 100644
--- a/src/writer/msl/generator_impl_break_test.cc
+++ b/src/writer/msl/generator_impl_break_test.cc
@@ -29,7 +29,7 @@
 using MslGeneratorImplTest = TestHelper;
 
 TEST_F(MslGeneratorImplTest, Emit_Break) {
-  ast::BreakStatement b;
+  ast::BreakStatement b(Source{});
 
   gen.increment_indent();
 
diff --git a/src/writer/msl/generator_impl_call_test.cc b/src/writer/msl/generator_impl_call_test.cc
index 5562381..4092f73 100644
--- a/src/writer/msl/generator_impl_call_test.cc
+++ b/src/writer/msl/generator_impl_call_test.cc
@@ -38,9 +38,10 @@
       Source{}, mod.RegisterSymbol("my_func"), "my_func");
   ast::CallExpression call(Source{}, id, {});
 
-  auto* func = create<ast::Function>(
-      Source{}, mod.RegisterSymbol("my_func"), "my_func", ast::VariableList{},
-      &void_type, create<ast::BlockStatement>(), ast::FunctionDecorationList{});
+  auto* func = create<ast::Function>(Source{}, mod.RegisterSymbol("my_func"),
+                                     "my_func", ast::VariableList{}, &void_type,
+                                     create<ast::BlockStatement>(Source{}),
+                                     ast::FunctionDecorationList{});
   mod.AddFunction(func);
 
   ASSERT_TRUE(gen.EmitExpression(&call)) << gen.error();
@@ -59,9 +60,10 @@
       Source{}, mod.RegisterSymbol("param2"), "param2"));
   ast::CallExpression call(Source{}, id, params);
 
-  auto* func = create<ast::Function>(
-      Source{}, mod.RegisterSymbol("my_func"), "my_func", ast::VariableList{},
-      &void_type, create<ast::BlockStatement>(), ast::FunctionDecorationList{});
+  auto* func = create<ast::Function>(Source{}, mod.RegisterSymbol("my_func"),
+                                     "my_func", ast::VariableList{}, &void_type,
+                                     create<ast::BlockStatement>(Source{}),
+                                     ast::FunctionDecorationList{});
   mod.AddFunction(func);
 
   ASSERT_TRUE(gen.EmitExpression(&call)) << gen.error();
@@ -78,11 +80,13 @@
       Source{}, mod.RegisterSymbol("param1"), "param1"));
   params.push_back(create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("param2"), "param2"));
-  ast::CallStatement call(create<ast::CallExpression>(Source{}, id, params));
+  ast::CallStatement call(Source{},
+                          create<ast::CallExpression>(Source{}, id, params));
 
-  auto* func = create<ast::Function>(
-      Source{}, mod.RegisterSymbol("my_func"), "my_func", ast::VariableList{},
-      &void_type, create<ast::BlockStatement>(), ast::FunctionDecorationList{});
+  auto* func = create<ast::Function>(Source{}, mod.RegisterSymbol("my_func"),
+                                     "my_func", ast::VariableList{}, &void_type,
+                                     create<ast::BlockStatement>(Source{}),
+                                     ast::FunctionDecorationList{});
   mod.AddFunction(func);
 
   gen.increment_indent();
diff --git a/src/writer/msl/generator_impl_case_test.cc b/src/writer/msl/generator_impl_case_test.cc
index 5740d2a..f8570c6 100644
--- a/src/writer/msl/generator_impl_case_test.cc
+++ b/src/writer/msl/generator_impl_case_test.cc
@@ -35,12 +35,12 @@
 TEST_F(MslGeneratorImplTest, Emit_Case) {
   ast::type::I32 i32;
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::BreakStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::BreakStatement>(Source{}));
 
   ast::CaseSelectorList lit;
   lit.push_back(create<ast::SintLiteral>(Source{}, &i32, 5));
-  ast::CaseStatement c(lit, body);
+  ast::CaseStatement c(Source{}, lit, body);
 
   gen.increment_indent();
 
@@ -56,7 +56,7 @@
 
   ast::CaseSelectorList lit;
   lit.push_back(create<ast::SintLiteral>(Source{}, &i32, 5));
-  ast::CaseStatement c(lit, create<ast::BlockStatement>());
+  ast::CaseStatement c(Source{}, lit, create<ast::BlockStatement>(Source{}));
 
   gen.increment_indent();
 
@@ -70,12 +70,12 @@
 TEST_F(MslGeneratorImplTest, Emit_Case_WithFallthrough) {
   ast::type::I32 i32;
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::FallthroughStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::FallthroughStatement>(Source{}));
 
   ast::CaseSelectorList lit;
   lit.push_back(create<ast::SintLiteral>(Source{}, &i32, 5));
-  ast::CaseStatement c(lit, body);
+  ast::CaseStatement c(Source{}, lit, body);
 
   gen.increment_indent();
 
@@ -89,13 +89,13 @@
 TEST_F(MslGeneratorImplTest, Emit_Case_MultipleSelectors) {
   ast::type::I32 i32;
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::BreakStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::BreakStatement>(Source{}));
 
   ast::CaseSelectorList lit;
   lit.push_back(create<ast::SintLiteral>(Source{}, &i32, 5));
   lit.push_back(create<ast::SintLiteral>(Source{}, &i32, 6));
-  ast::CaseStatement c(lit, body);
+  ast::CaseStatement c(Source{}, lit, body);
 
   gen.increment_indent();
 
@@ -108,9 +108,9 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_Case_Default) {
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::BreakStatement>());
-  ast::CaseStatement c(body);
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::BreakStatement>(Source{}));
+  ast::CaseStatement c(Source{}, ast::CaseSelectorList{}, body);
 
   gen.increment_indent();
 
diff --git a/src/writer/msl/generator_impl_continue_test.cc b/src/writer/msl/generator_impl_continue_test.cc
index 95220bc..2edb073 100644
--- a/src/writer/msl/generator_impl_continue_test.cc
+++ b/src/writer/msl/generator_impl_continue_test.cc
@@ -29,7 +29,7 @@
 using MslGeneratorImplTest = TestHelper;
 
 TEST_F(MslGeneratorImplTest, Emit_Continue) {
-  ast::ContinueStatement c;
+  ast::ContinueStatement c(Source{});
 
   gen.increment_indent();
 
diff --git a/src/writer/msl/generator_impl_discard_test.cc b/src/writer/msl/generator_impl_discard_test.cc
index 182dc10..1aefa7d 100644
--- a/src/writer/msl/generator_impl_discard_test.cc
+++ b/src/writer/msl/generator_impl_discard_test.cc
@@ -26,7 +26,7 @@
 using MslGeneratorImplTest = TestHelper;
 
 TEST_F(MslGeneratorImplTest, Emit_Discard) {
-  ast::DiscardStatement stmt;
+  ast::DiscardStatement stmt(Source{});
 
   gen.increment_indent();
 
diff --git a/src/writer/msl/generator_impl_function_entry_point_data_test.cc b/src/writer/msl/generator_impl_function_entry_point_data_test.cc
index e6bf9f6..2d2c628 100644
--- a/src/writer/msl/generator_impl_function_entry_point_data_test.cc
+++ b/src/writer/msl/generator_impl_function_entry_point_data_test.cc
@@ -81,13 +81,15 @@
   mod.AddGlobalVariable(bar_var);
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo")));
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
                                         "bar"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
@@ -155,13 +157,15 @@
   mod.AddGlobalVariable(bar_var);
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo")));
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
                                         "bar"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
@@ -229,13 +233,15 @@
   mod.AddGlobalVariable(bar_var);
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo")));
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
                                         "bar"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
@@ -302,13 +308,15 @@
   mod.AddGlobalVariable(bar_var);
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo")));
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
                                         "bar"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
@@ -373,13 +381,15 @@
   mod.AddGlobalVariable(bar_var);
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo")));
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
                                         "bar"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
@@ -439,13 +449,15 @@
   mod.AddGlobalVariable(bar_var);
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo")));
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
                                         "bar"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
@@ -512,8 +524,9 @@
 
   ast::VariableList params;
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("depth"),
                                         "depth"),
       create<ast::MemberAccessorExpression>(
diff --git a/src/writer/msl/generator_impl_function_test.cc b/src/writer/msl/generator_impl_function_test.cc
index 66b3143..7155a10 100644
--- a/src/writer/msl/generator_impl_function_test.cc
+++ b/src/writer/msl/generator_impl_function_test.cc
@@ -58,7 +58,7 @@
 TEST_F(MslGeneratorImplTest, Emit_Function) {
   ast::type::Void void_type;
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
   auto* func = create<ast::Function>(Source{}, mod.RegisterSymbol("my_func"),
                                      "my_func", ast::VariableList{}, &void_type,
@@ -80,7 +80,7 @@
 TEST_F(MslGeneratorImplTest, Emit_Function_Name_Collision) {
   ast::type::Void void_type;
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
   auto* func = create<ast::Function>(Source{}, mod.RegisterSymbol("main"),
                                      "main", ast::VariableList{}, &void_type,
@@ -123,7 +123,7 @@
 
   ast::type::Void void_type;
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
   auto* func = create<ast::Function>(Source{}, mod.RegisterSymbol("my_func"),
                                      "my_func", params, &void_type, body,
@@ -177,8 +177,9 @@
   mod.AddGlobalVariable(bar_var);
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
                                         "bar"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
@@ -252,8 +253,9 @@
   mod.AddGlobalVariable(depth_var);
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("depth"),
                                         "depth"),
       create<ast::MemberAccessorExpression>(
@@ -328,8 +330,8 @@
                                             "x")),  // constructor
       ast::VariableDecorationList{});               // decorations
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
   body->append(create<ast::ReturnStatement>(Source{}));
 
   auto* func = create<ast::Function>(
@@ -408,8 +410,8 @@
                                             "b")),  // constructor
       ast::VariableDecorationList{});               // decorations
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
   body->append(create<ast::ReturnStatement>(Source{}));
 
   auto* func = create<ast::Function>(
@@ -493,8 +495,8 @@
                                             "b")),  // constructor
       ast::VariableDecorationList{});               // decorations
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
   body->append(create<ast::ReturnStatement>(Source{}));
 
   auto* func = create<ast::Function>(
@@ -584,13 +586,15 @@
                             nullptr,                          // constructor
                             ast::VariableDecorationList{}));  // decorations
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
                                         "bar"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("foo"),
                                         "foo")));
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("val"),
                                         "val"),
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("param"),
@@ -608,8 +612,9 @@
   expr.push_back(create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.0f)));
 
-  body = create<ast::BlockStatement>();
+  body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
                                         "bar"),
       create<ast::CallExpression>(
@@ -687,7 +692,7 @@
                             nullptr,                          // constructor
                             ast::VariableDecorationList{}));  // decorations
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(
       Source{}, create<ast::IdentifierExpression>(
                     Source{}, mod.RegisterSymbol("param"), "param")));
@@ -701,8 +706,9 @@
   expr.push_back(create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.0f)));
 
-  body = create<ast::BlockStatement>();
+  body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("depth"),
                                         "depth"),
       create<ast::CallExpression>(
@@ -789,8 +795,9 @@
                             nullptr,                          // constructor
                             ast::VariableDecorationList{}));  // decorations
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("depth"),
                                         "depth"),
       create<ast::MemberAccessorExpression>(
@@ -812,8 +819,9 @@
   expr.push_back(create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.0f)));
 
-  body = create<ast::BlockStatement>();
+  body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("depth"),
                                         "depth"),
       create<ast::CallExpression>(
@@ -885,7 +893,7 @@
                             nullptr,                          // constructor
                             ast::VariableDecorationList{}));  // decorations
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(
       Source{}, create<ast::MemberAccessorExpression>(
                     Source{},
@@ -916,8 +924,8 @@
           expr),                       // constructor
       ast::VariableDecorationList{});  // decorations
 
-  body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
   body->append(create<ast::ReturnStatement>(Source{}));
 
   auto* func = create<ast::Function>(
@@ -993,7 +1001,7 @@
                             nullptr,                          // constructor
                             ast::VariableDecorationList{}));  // decorations
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(
       Source{}, create<ast::MemberAccessorExpression>(
                     Source{},
@@ -1024,8 +1032,8 @@
           expr),                       // constructor
       ast::VariableDecorationList{});  // decorations
 
-  body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
   body->append(create<ast::ReturnStatement>(Source{}));
 
   auto* func = create<ast::Function>(
@@ -1107,7 +1115,7 @@
                             nullptr,                          // constructor
                             ast::VariableDecorationList{}));  // decorations
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(
       Source{}, create<ast::MemberAccessorExpression>(
                     Source{},
@@ -1138,8 +1146,8 @@
           expr),                       // constructor
       ast::VariableDecorationList{});  // decorations
 
-  body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
   body->append(create<ast::ReturnStatement>(Source{}));
 
   auto* func = create<ast::Function>(
@@ -1195,14 +1203,15 @@
   mod.AddGlobalVariable(bar_var);
 
   ast::VariableList params;
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("bar"),
                                         "bar"),
       create<ast::ScalarConstructorExpression>(
           Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.0f))));
 
-  auto* list = create<ast::BlockStatement>();
+  auto* list = create<ast::BlockStatement>(Source{});
   list->append(create<ast::ReturnStatement>(Source{}));
 
   body->append(create<ast::IfStatement>(
@@ -1251,7 +1260,7 @@
 
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("main"), "main", ast::VariableList{},
-      &void_type, create<ast::BlockStatement>(),
+      &void_type, create<ast::BlockStatement>(Source{}),
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}),
       });
@@ -1283,7 +1292,7 @@
 
   ast::type::Void void_type;
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
   auto* func = create<ast::Function>(Source{}, mod.RegisterSymbol("my_func"),
                                      "my_func", params, &void_type, body,
@@ -1371,8 +1380,8 @@
                                               "d")),  // constructor
         ast::VariableDecorationList{});               // decorations
 
-    auto* body = create<ast::BlockStatement>();
-    body->append(create<ast::VariableDeclStatement>(var));
+    auto* body = create<ast::BlockStatement>(Source{});
+    body->append(create<ast::VariableDeclStatement>(Source{}, var));
     body->append(create<ast::ReturnStatement>(Source{}));
 
     auto* func = create<ast::Function>(
@@ -1401,8 +1410,8 @@
                                               "d")),  // constructor
         ast::VariableDecorationList{});               // decorations
 
-    auto* body = create<ast::BlockStatement>();
-    body->append(create<ast::VariableDeclStatement>(var));
+    auto* body = create<ast::BlockStatement>(Source{});
+    body->append(create<ast::VariableDeclStatement>(Source{}, var));
     body->append(create<ast::ReturnStatement>(Source{}));
 
     auto* func = create<ast::Function>(
diff --git a/src/writer/msl/generator_impl_if_test.cc b/src/writer/msl/generator_impl_if_test.cc
index 603698d..3ded7e3 100644
--- a/src/writer/msl/generator_impl_if_test.cc
+++ b/src/writer/msl/generator_impl_if_test.cc
@@ -31,7 +31,7 @@
 TEST_F(MslGeneratorImplTest, Emit_If) {
   auto* cond = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("cond"), "cond");
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
 
   ast::IfStatement i(Source{}, cond, body, ast::ElseStatementList{});
@@ -48,16 +48,17 @@
 TEST_F(MslGeneratorImplTest, Emit_IfWithElseIf) {
   auto* else_cond = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("else_cond"), "else_cond");
-  auto* else_body = create<ast::BlockStatement>();
+  auto* else_body = create<ast::BlockStatement>(Source{});
   else_body->append(create<ast::ReturnStatement>(Source{}));
 
   auto* cond = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("cond"), "cond");
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
 
-  ast::IfStatement i(Source{}, cond, body,
-                     {create<ast::ElseStatement>(else_cond, else_body)});
+  ast::IfStatement i(
+      Source{}, cond, body,
+      {create<ast::ElseStatement>(Source{}, else_cond, else_body)});
 
   gen.increment_indent();
 
@@ -71,16 +72,17 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_IfWithElse) {
-  auto* else_body = create<ast::BlockStatement>();
+  auto* else_body = create<ast::BlockStatement>(Source{});
   else_body->append(create<ast::ReturnStatement>(Source{}));
 
   auto* cond = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("cond"), "cond");
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
 
-  ast::IfStatement i(Source{}, cond, body,
-                     {create<ast::ElseStatement>(else_body)});
+  ast::IfStatement i(
+      Source{}, cond, body,
+      {create<ast::ElseStatement>(Source{}, nullptr, else_body)});
 
   gen.increment_indent();
 
@@ -97,22 +99,23 @@
   auto* else_cond = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("else_cond"), "else_cond");
 
-  auto* else_body = create<ast::BlockStatement>();
+  auto* else_body = create<ast::BlockStatement>(Source{});
   else_body->append(create<ast::ReturnStatement>(Source{}));
 
-  auto* else_body_2 = create<ast::BlockStatement>();
+  auto* else_body_2 = create<ast::BlockStatement>(Source{});
   else_body_2->append(create<ast::ReturnStatement>(Source{}));
 
   auto* cond = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("cond"), "cond");
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
 
-  ast::IfStatement i(Source{}, cond, body,
-                     {
-                         create<ast::ElseStatement>(else_cond, else_body),
-                         create<ast::ElseStatement>(else_body_2),
-                     });
+  ast::IfStatement i(
+      Source{}, cond, body,
+      {
+          create<ast::ElseStatement>(Source{}, else_cond, else_body),
+          create<ast::ElseStatement>(Source{}, nullptr, else_body_2),
+      });
 
   gen.increment_indent();
 
diff --git a/src/writer/msl/generator_impl_loop_test.cc b/src/writer/msl/generator_impl_loop_test.cc
index cf0f375..94ecdb5 100644
--- a/src/writer/msl/generator_impl_loop_test.cc
+++ b/src/writer/msl/generator_impl_loop_test.cc
@@ -36,10 +36,10 @@
 using MslGeneratorImplTest = TestHelper;
 
 TEST_F(MslGeneratorImplTest, Emit_Loop) {
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::DiscardStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::DiscardStatement>(Source{}));
 
-  ast::LoopStatement l(body, {});
+  ast::LoopStatement l(Source{}, body, {});
 
   gen.increment_indent();
 
@@ -51,13 +51,13 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_LoopWithContinuing) {
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::DiscardStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::DiscardStatement>(Source{}));
 
-  auto* continuing = create<ast::BlockStatement>();
+  auto* continuing = create<ast::BlockStatement>(Source{});
   continuing->append(create<ast::ReturnStatement>(Source{}));
 
-  ast::LoopStatement l(body, continuing);
+  ast::LoopStatement l(Source{}, body, continuing);
 
   gen.increment_indent();
 
@@ -79,15 +79,15 @@
 TEST_F(MslGeneratorImplTest, Emit_LoopNestedWithContinuing) {
   ast::type::F32 f32;
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::DiscardStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::DiscardStatement>(Source{}));
 
-  auto* continuing = create<ast::BlockStatement>();
+  auto* continuing = create<ast::BlockStatement>(Source{});
   continuing->append(create<ast::ReturnStatement>(Source{}));
 
-  auto* inner = create<ast::LoopStatement>(body, continuing);
+  auto* inner = create<ast::LoopStatement>(Source{}, body, continuing);
 
-  body = create<ast::BlockStatement>();
+  body = create<ast::BlockStatement>(Source{});
   body->append(inner);
 
   auto* lhs = create<ast::IdentifierExpression>(
@@ -95,10 +95,10 @@
   auto* rhs = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("rhs"), "rhs");
 
-  continuing = create<ast::BlockStatement>();
-  continuing->append(create<ast::AssignmentStatement>(lhs, rhs));
+  continuing = create<ast::BlockStatement>(Source{});
+  continuing->append(create<ast::AssignmentStatement>(Source{}, lhs, rhs));
 
-  ast::LoopStatement outer(body, continuing);
+  ast::LoopStatement outer(Source{}, body, continuing);
 
   gen.increment_indent();
 
@@ -162,9 +162,10 @@
           create<ast::FloatLiteral>(Source{}, &f32, 2.4)),  // constructor
       ast::VariableDecorationList{});                       // decorations
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(var));
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::VariableDeclStatement>(Source{}, var));
   body->append(create<ast::VariableDeclStatement>(
+      Source{},
       create<ast::Variable>(Source{},                          // source
                             "other",                           // name
                             ast::StorageClass::kFunction,      // storage_class
@@ -178,12 +179,12 @@
   auto* rhs = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("rhs"), "rhs");
 
-  auto* continuing = create<ast::BlockStatement>();
-  continuing->append(create<ast::AssignmentStatement>(lhs, rhs));
+  auto* continuing = create<ast::BlockStatement>(Source{});
+  continuing->append(create<ast::AssignmentStatement>(Source{}, lhs, rhs));
 
   gen.increment_indent();
 
-  ast::LoopStatement outer(body, continuing);
+  ast::LoopStatement outer(Source{}, body, continuing);
 
   ASSERT_TRUE(gen.EmitStatement(&outer)) << gen.error();
   EXPECT_EQ(gen.result(), R"(  {
diff --git a/src/writer/msl/generator_impl_switch_test.cc b/src/writer/msl/generator_impl_switch_test.cc
index 56f3b82..0b82567 100644
--- a/src/writer/msl/generator_impl_switch_test.cc
+++ b/src/writer/msl/generator_impl_switch_test.cc
@@ -33,18 +33,19 @@
 using MslGeneratorImplTest = TestHelper;
 
 TEST_F(MslGeneratorImplTest, Emit_Switch) {
-  auto* def_body = create<ast::BlockStatement>();
-  def_body->append(create<ast::BreakStatement>());
-  auto* def = create<ast::CaseStatement>(def_body);
+  auto* def_body = create<ast::BlockStatement>(Source{});
+  def_body->append(create<ast::BreakStatement>(Source{}));
+  auto* def =
+      create<ast::CaseStatement>(Source{}, ast::CaseSelectorList{}, def_body);
 
   ast::type::I32 i32;
   ast::CaseSelectorList case_val;
   case_val.push_back(create<ast::SintLiteral>(Source{}, &i32, 5));
 
-  auto* case_body = create<ast::BlockStatement>();
-  case_body->append(create<ast::BreakStatement>());
+  auto* case_body = create<ast::BlockStatement>(Source{});
+  case_body->append(create<ast::BreakStatement>(Source{}));
 
-  auto* case_stmt = create<ast::CaseStatement>(case_val, case_body);
+  auto* case_stmt = create<ast::CaseStatement>(Source{}, case_val, case_body);
 
   ast::CaseStatementList body;
   body.push_back(case_stmt);
@@ -52,7 +53,7 @@
 
   auto* cond = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("cond"), "cond");
-  ast::SwitchStatement s(cond, body);
+  ast::SwitchStatement s(Source{}, cond, body);
 
   gen.increment_indent();
 
diff --git a/src/writer/msl/generator_impl_test.cc b/src/writer/msl/generator_impl_test.cc
index 0910b78..c22568c 100644
--- a/src/writer/msl/generator_impl_test.cc
+++ b/src/writer/msl/generator_impl_test.cc
@@ -52,7 +52,7 @@
 
   auto* func = create<ast::Function>(
       Source{}, mod.RegisterSymbol("my_func"), "my_func", ast::VariableList{},
-      &void_type, create<ast::BlockStatement>(),
+      &void_type, create<ast::BlockStatement>(Source{}),
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kCompute, 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 0119490..23b9147 100644
--- a/src/writer/msl/generator_impl_variable_decl_statement_test.cc
+++ b/src/writer/msl/generator_impl_variable_decl_statement_test.cc
@@ -51,7 +51,7 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  ast::VariableDeclStatement stmt(var);
+  ast::VariableDeclStatement stmt(Source{}, var);
 
   gen.increment_indent();
 
@@ -70,7 +70,7 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  ast::VariableDeclStatement stmt(var);
+  ast::VariableDeclStatement stmt(Source{}, var);
 
   gen.increment_indent();
 
@@ -91,7 +91,7 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  ast::VariableDeclStatement stmt(var);
+  ast::VariableDeclStatement stmt(Source{}, var);
 
   gen.increment_indent();
 
@@ -123,7 +123,7 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  ast::VariableDeclStatement stmt(var);
+  ast::VariableDeclStatement stmt(Source{}, var);
 
   gen.increment_indent();
 
@@ -145,7 +145,7 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  ast::VariableDeclStatement stmt(var);
+  ast::VariableDeclStatement stmt(Source{}, var);
 
   gen.increment_indent();
 
@@ -165,7 +165,7 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  ast::VariableDeclStatement stmt(var);
+  ast::VariableDeclStatement stmt(Source{}, var);
 
   gen.increment_indent();
 
@@ -184,7 +184,7 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  ast::VariableDeclStatement stmt(var);
+  ast::VariableDeclStatement stmt(Source{}, var);
 
   gen.increment_indent();
 
@@ -206,7 +206,7 @@
                             ident,                           // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  ast::VariableDeclStatement stmt(var);
+  ast::VariableDeclStatement stmt(Source{}, var);
 
   ASSERT_TRUE(gen.EmitStatement(&stmt)) << gen.error();
   EXPECT_EQ(gen.result(), R"(float a = initializer;
@@ -230,7 +230,7 @@
                             zero_vec,                        // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  ast::VariableDeclStatement stmt(var);
+  ast::VariableDeclStatement stmt(Source{}, var);
 
   ASSERT_TRUE(gen.EmitStatement(&stmt)) << gen.error();
   EXPECT_EQ(gen.result(), R"(float3 a = float3(0.0f);
diff --git a/src/writer/spirv/builder_accessor_expression_test.cc b/src/writer/spirv/builder_accessor_expression_test.cc
index a1ce040..82f100e 100644
--- a/src/writer/spirv/builder_accessor_expression_test.cc
+++ b/src/writer/spirv/builder_accessor_expression_test.cc
@@ -514,7 +514,7 @@
   auto* rhs = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 2.f));
 
-  ast::AssignmentStatement expr(lhs, rhs);
+  ast::AssignmentStatement expr(Source{}, lhs, rhs);
 
   td.RegisterVariableForTesting(&var);
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
@@ -588,7 +588,7 @@
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("a"),
                                         "a"));
 
-  ast::AssignmentStatement expr(lhs, rhs);
+  ast::AssignmentStatement expr(Source{}, lhs, rhs);
 
   td.RegisterVariableForTesting(&var);
   td.RegisterVariableForTesting(&store);
diff --git a/src/writer/spirv/builder_assign_test.cc b/src/writer/spirv/builder_assign_test.cc
index 6f557e9..96fe75e 100644
--- a/src/writer/spirv/builder_assign_test.cc
+++ b/src/writer/spirv/builder_assign_test.cc
@@ -52,7 +52,7 @@
   auto* val = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.0f));
 
-  ast::AssignmentStatement assign(ident, val);
+  ast::AssignmentStatement assign(Source{}, ident, val);
 
   td.RegisterVariableForTesting(&v);
 
@@ -88,7 +88,7 @@
   ast::ExpressionList vals;
   auto* val = create<ast::TypeConstructorExpression>(Source{}, &vec, vals);
 
-  ast::AssignmentStatement assign(ident, val);
+  ast::AssignmentStatement assign(Source{}, ident, val);
 
   td.RegisterVariableForTesting(&v);
 
@@ -138,6 +138,7 @@
                   nullptr, ast::VariableDecorationList{});
 
   ast::AssignmentStatement assign(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("var"),
                                         "var"),
       init);
@@ -189,6 +190,7 @@
                   nullptr, ast::VariableDecorationList{});
 
   ast::AssignmentStatement assign(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("var"),
                                         "var"),
       init);
@@ -248,7 +250,7 @@
   auto* val = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 4.0f));
 
-  ast::AssignmentStatement assign(ident, val);
+  ast::AssignmentStatement assign(Source{}, ident, val);
 
   td.RegisterVariableForTesting(&v);
 
@@ -297,7 +299,7 @@
 
   auto* val = create<ast::TypeConstructorExpression>(Source{}, &vec3, vals);
 
-  ast::AssignmentStatement assign(ident, val);
+  ast::AssignmentStatement assign(Source{}, ident, val);
 
   td.RegisterVariableForTesting(&v);
 
@@ -342,7 +344,7 @@
   auto* val = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.0f));
 
-  ast::AssignmentStatement assign(ident, val);
+  ast::AssignmentStatement assign(Source{}, ident, val);
 
   td.RegisterVariableForTesting(&v);
 
@@ -391,7 +393,7 @@
   auto* val = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.0f));
 
-  ast::AssignmentStatement assign(ident, val);
+  ast::AssignmentStatement assign(Source{}, ident, val);
 
   td.RegisterVariableForTesting(&v);
 
diff --git a/src/writer/spirv/builder_block_test.cc b/src/writer/spirv/builder_block_test.cc
index 43977b9..30dc6ba 100644
--- a/src/writer/spirv/builder_block_test.cc
+++ b/src/writer/spirv/builder_block_test.cc
@@ -39,9 +39,10 @@
 
   // Note, this test uses shadow variables which aren't allowed in WGSL but
   // serves to prove the block code is pushing new scopes as needed.
-  ast::BlockStatement outer;
+  ast::BlockStatement outer(Source{});
 
   outer.append(create<ast::VariableDeclStatement>(
+      Source{},
       create<ast::Variable>(Source{},                          // source
                             "var",                             // name
                             ast::StorageClass::kFunction,      // storage_class
@@ -50,13 +51,15 @@
                             nullptr,                           // constructor
                             ast::VariableDecorationList{})));  // decorations
   outer.append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("var"),
                                         "var"),
       create<ast::ScalarConstructorExpression>(
           Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.0f))));
 
-  auto* inner = create<ast::BlockStatement>();
+  auto* inner = create<ast::BlockStatement>(Source{});
   inner->append(create<ast::VariableDeclStatement>(
+      Source{},
       create<ast::Variable>(Source{},                          // source
                             "var",                             // name
                             ast::StorageClass::kFunction,      // storage_class
@@ -65,6 +68,7 @@
                             nullptr,                           // constructor
                             ast::VariableDecorationList{})));  // decorations
   inner->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("var"),
                                         "var"),
       create<ast::ScalarConstructorExpression>(
@@ -72,6 +76,7 @@
 
   outer.append(inner);
   outer.append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("var"),
                                         "var"),
       create<ast::ScalarConstructorExpression>(
diff --git a/src/writer/spirv/builder_call_test.cc b/src/writer/spirv/builder_call_test.cc
index 8607589..de09ffb 100644
--- a/src/writer/spirv/builder_call_test.cc
+++ b/src/writer/spirv/builder_call_test.cc
@@ -61,7 +61,7 @@
                             nullptr,                          // constructor
                             ast::VariableDecorationList{}));  // decorations
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(
       Source{}, create<ast::BinaryExpression>(
                     Source{}, ast::BinaryOp::kAdd,
@@ -73,7 +73,7 @@
                        func_params, &f32, body, ast::FunctionDecorationList{});
 
   ast::Function func(Source{}, mod->RegisterSymbol("main"), "main", {},
-                     &void_type, create<ast::BlockStatement>(),
+                     &void_type, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ast::ExpressionList call_params;
@@ -144,7 +144,7 @@
                             nullptr,                          // constructor
                             ast::VariableDecorationList{}));  // decorations
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(
       Source{}, create<ast::BinaryExpression>(
                     Source{}, ast::BinaryOp::kAdd,
@@ -158,7 +158,7 @@
                        ast::FunctionDecorationList{});
 
   ast::Function func(Source{}, mod->RegisterSymbol("main"), "main", {},
-                     &void_type, create<ast::BlockStatement>(),
+                     &void_type, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ast::ExpressionList call_params;
@@ -167,11 +167,12 @@
   call_params.push_back(create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.f)));
 
-  ast::CallStatement expr(create<ast::CallExpression>(
-      Source{},
-      create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("a_func"),
-                                        "a_func"),
-      call_params));
+  ast::CallStatement expr(
+      Source{}, create<ast::CallExpression>(
+                    Source{},
+                    create<ast::IdentifierExpression>(
+                        Source{}, mod->RegisterSymbol("a_func"), "a_func"),
+                    call_params));
 
   ASSERT_TRUE(td.DetermineFunction(&func)) << td.error();
   ASSERT_TRUE(td.DetermineFunction(&a_func)) << td.error();
diff --git a/src/writer/spirv/builder_discard_test.cc b/src/writer/spirv/builder_discard_test.cc
index caf5b81..6b3796a 100644
--- a/src/writer/spirv/builder_discard_test.cc
+++ b/src/writer/spirv/builder_discard_test.cc
@@ -27,7 +27,7 @@
 using BuilderTest = TestHelper;
 
 TEST_F(BuilderTest, Discard) {
-  ast::DiscardStatement expr;
+  ast::DiscardStatement expr(Source{});
 
   b.push_function(Function{});
   EXPECT_EQ(b.GenerateStatement(&expr), 1u) << b.error();
diff --git a/src/writer/spirv/builder_function_decoration_test.cc b/src/writer/spirv/builder_function_decoration_test.cc
index 67a294c..c9f1725 100644
--- a/src/writer/spirv/builder_function_decoration_test.cc
+++ b/src/writer/spirv/builder_function_decoration_test.cc
@@ -43,7 +43,7 @@
 
   ast::Function func(
       Source{}, mod->RegisterSymbol("main"), "main", {}, &void_type,
-      create<ast::BlockStatement>(),
+      create<ast::BlockStatement>(Source{}),
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
       });
@@ -69,7 +69,7 @@
   ast::type::Void void_type;
 
   ast::Function func(Source{}, mod->RegisterSymbol("main"), "main", {},
-                     &void_type, create<ast::BlockStatement>(),
+                     &void_type, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{
                          create<ast::StageDecoration>(params.stage, Source{}),
                      });
@@ -99,7 +99,7 @@
 
   ast::Function func(
       Source{}, mod->RegisterSymbol("main"), "main", {}, &void_type,
-      create<ast::BlockStatement>(),
+      create<ast::BlockStatement>(Source{}),
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
       });
@@ -163,19 +163,22 @@
   ast::type::F32 f32;
   ast::type::Void void_type;
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("my_out"),
                                         "my_out"),
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("my_in"),
                                         "my_in")));
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("my_wg"),
                                         "my_wg"),
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("my_wg"),
                                         "my_wg")));
   // Add duplicate usages so we show they don't get output multiple times.
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("my_out"),
                                         "my_out"),
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("my_in"),
@@ -253,7 +256,7 @@
 
   ast::Function func(
       Source{}, mod->RegisterSymbol("main"), "main", {}, &void_type,
-      create<ast::BlockStatement>(),
+      create<ast::BlockStatement>(Source{}),
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
       });
@@ -269,7 +272,7 @@
 
   ast::Function func(
       Source{}, mod->RegisterSymbol("main"), "main", {}, &void_type,
-      create<ast::BlockStatement>(),
+      create<ast::BlockStatement>(Source{}),
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}),
       });
@@ -285,7 +288,7 @@
 
   ast::Function func(
       Source{}, mod->RegisterSymbol("main"), "main", {}, &void_type,
-      create<ast::BlockStatement>(),
+      create<ast::BlockStatement>(Source{}),
       ast::FunctionDecorationList{
           create<ast::WorkgroupDecoration>(2u, 4u, 6u, Source{}),
           create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}),
@@ -302,14 +305,14 @@
 
   ast::Function func1(
       Source{}, mod->RegisterSymbol("main1"), "main1", {}, &void_type,
-      create<ast::BlockStatement>(),
+      create<ast::BlockStatement>(Source{}),
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
       });
 
   ast::Function func2(
       Source{}, mod->RegisterSymbol("main2"), "main2", {}, &void_type,
-      create<ast::BlockStatement>(),
+      create<ast::BlockStatement>(Source{}),
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}),
       });
diff --git a/src/writer/spirv/builder_function_test.cc b/src/writer/spirv/builder_function_test.cc
index 6c7aefd..e0024d4 100644
--- a/src/writer/spirv/builder_function_test.cc
+++ b/src/writer/spirv/builder_function_test.cc
@@ -48,7 +48,7 @@
 TEST_F(BuilderTest, Function_Empty) {
   ast::type::Void void_type;
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     &void_type, create<ast::BlockStatement>(),
+                     &void_type, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func));
@@ -65,7 +65,7 @@
 TEST_F(BuilderTest, Function_Terminator_Return) {
   ast::type::Void void_type;
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
@@ -96,7 +96,7 @@
                             ast::VariableDecorationList{});  // decorations
   td.RegisterVariableForTesting(var_a);
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(
       Source{}, create<ast::IdentifierExpression>(
                     Source{}, mod->RegisterSymbol("a"), "a")));
@@ -126,8 +126,8 @@
 TEST_F(BuilderTest, Function_Terminator_Discard) {
   ast::type::Void void_type;
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::DiscardStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::DiscardStatement>(Source{}));
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
                      &void_type, body, ast::FunctionDecorationList{});
@@ -166,7 +166,7 @@
                             ast::VariableDecorationList{}),  // decorations
   };
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(
       Source{}, create<ast::IdentifierExpression>(
                     Source{}, mod->RegisterSymbol("a"), "a")));
@@ -196,7 +196,7 @@
 TEST_F(BuilderTest, Function_WithBody) {
   ast::type::Void void_type;
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::ReturnStatement>(Source{}));
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
@@ -216,7 +216,7 @@
 TEST_F(BuilderTest, FunctionType) {
   ast::type::Void void_type;
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     &void_type, create<ast::BlockStatement>(),
+                     &void_type, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func));
@@ -228,10 +228,10 @@
 TEST_F(BuilderTest, FunctionType_DeDuplicate) {
   ast::type::Void void_type;
   ast::Function func1(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                      &void_type, create<ast::BlockStatement>(),
+                      &void_type, create<ast::BlockStatement>(Source{}),
                       ast::FunctionDecorationList{});
   ast::Function func2(Source{}, mod->RegisterSymbol("b_func"), "b_func", {},
-                      &void_type, create<ast::BlockStatement>(),
+                      &void_type, create<ast::BlockStatement>(Source{}),
                       ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func1));
@@ -309,8 +309,8 @@
                                               "d")),  // constructor
         ast::VariableDecorationList{});               // decorations
 
-    auto* body = create<ast::BlockStatement>();
-    body->append(create<ast::VariableDeclStatement>(var));
+    auto* body = create<ast::BlockStatement>(Source{});
+    body->append(create<ast::VariableDeclStatement>(Source{}, var));
     body->append(create<ast::ReturnStatement>(Source{}));
 
     auto* func = create<ast::Function>(
@@ -340,8 +340,8 @@
                                               "d")),  // constructor
         ast::VariableDecorationList{});               // decorations
 
-    auto* body = create<ast::BlockStatement>();
-    body->append(create<ast::VariableDeclStatement>(var));
+    auto* body = create<ast::BlockStatement>(Source{});
+    body->append(create<ast::VariableDeclStatement>(Source{}, var));
     body->append(create<ast::ReturnStatement>(Source{}));
 
     auto* func = create<ast::Function>(
diff --git a/src/writer/spirv/builder_if_test.cc b/src/writer/spirv/builder_if_test.cc
index f5050ea..b5c8b8b 100644
--- a/src/writer/spirv/builder_if_test.cc
+++ b/src/writer/spirv/builder_if_test.cc
@@ -48,7 +48,7 @@
   auto* cond = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::BoolLiteral>(Source{}, &bool_type, true));
 
-  ast::IfStatement expr(Source{}, cond, create<ast::BlockStatement>(),
+  ast::IfStatement expr(Source{}, cond, create<ast::BlockStatement>(Source{}),
                         ast::ElseStatementList{});
 
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
@@ -84,8 +84,9 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("v"),
                                         "v"),
       create<ast::ScalarConstructorExpression>(
@@ -139,15 +140,17 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("v"),
                                         "v"),
       create<ast::ScalarConstructorExpression>(
           Source{}, create<ast::SintLiteral>(Source{}, &i32, 2))));
 
-  auto* else_body = create<ast::BlockStatement>();
+  auto* else_body = create<ast::BlockStatement>(Source{});
   else_body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("v"),
                                         "v"),
       create<ast::ScalarConstructorExpression>(
@@ -156,8 +159,9 @@
   auto* cond = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::BoolLiteral>(Source{}, &bool_type, true));
 
-  ast::IfStatement expr(Source{}, cond, body,
-                        {create<ast::ElseStatement>(else_body)});
+  ast::IfStatement expr(
+      Source{}, cond, body,
+      {create<ast::ElseStatement>(Source{}, nullptr, else_body)});
 
   td.RegisterVariableForTesting(var);
 
@@ -207,15 +211,17 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("v"),
                                         "v"),
       create<ast::ScalarConstructorExpression>(
           Source{}, create<ast::SintLiteral>(Source{}, &i32, 2))));
 
-  auto* else_body = create<ast::BlockStatement>();
+  auto* else_body = create<ast::BlockStatement>(Source{});
   else_body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("v"),
                                         "v"),
       create<ast::ScalarConstructorExpression>(
@@ -227,8 +233,9 @@
   auto* cond = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::BoolLiteral>(Source{}, &bool_type, true));
 
-  ast::IfStatement expr(Source{}, cond, body,
-                        {create<ast::ElseStatement>(else_cond, else_body)});
+  ast::IfStatement expr(
+      Source{}, cond, body,
+      {create<ast::ElseStatement>(Source{}, else_cond, else_body)});
 
   td.RegisterVariableForTesting(var);
 
@@ -287,26 +294,30 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("v"),
                                         "v"),
       create<ast::ScalarConstructorExpression>(
           Source{}, create<ast::SintLiteral>(Source{}, &i32, 2))));
-  auto* elseif_1_body = create<ast::BlockStatement>();
+  auto* elseif_1_body = create<ast::BlockStatement>(Source{});
   elseif_1_body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("v"),
                                         "v"),
       create<ast::ScalarConstructorExpression>(
           Source{}, create<ast::SintLiteral>(Source{}, &i32, 3))));
-  auto* elseif_2_body = create<ast::BlockStatement>();
+  auto* elseif_2_body = create<ast::BlockStatement>(Source{});
   elseif_2_body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("v"),
                                         "v"),
       create<ast::ScalarConstructorExpression>(
           Source{}, create<ast::SintLiteral>(Source{}, &i32, 4))));
-  auto* else_body = create<ast::BlockStatement>();
+  auto* else_body = create<ast::BlockStatement>(Source{});
   else_body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("v"),
                                         "v"),
       create<ast::ScalarConstructorExpression>(
@@ -323,9 +334,9 @@
   ast::IfStatement expr(
       Source{}, cond, body,
       {
-          create<ast::ElseStatement>(elseif_1_cond, elseif_1_body),
-          create<ast::ElseStatement>(elseif_2_cond, elseif_2_body),
-          create<ast::ElseStatement>(else_body),
+          create<ast::ElseStatement>(Source{}, elseif_1_cond, elseif_1_body),
+          create<ast::ElseStatement>(Source{}, elseif_2_cond, elseif_2_body),
+          create<ast::ElseStatement>(Source{}, nullptr, else_body),
       });
 
   td.RegisterVariableForTesting(var);
@@ -387,16 +398,17 @@
   auto* cond = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::BoolLiteral>(Source{}, &bool_type, true));
 
-  auto* if_body = create<ast::BlockStatement>();
-  if_body->append(create<ast::BreakStatement>());
+  auto* if_body = create<ast::BlockStatement>(Source{});
+  if_body->append(create<ast::BreakStatement>(Source{}));
 
   auto* if_stmt = create<ast::IfStatement>(Source{}, cond, if_body,
                                            ast::ElseStatementList{});
 
-  auto* loop_body = create<ast::BlockStatement>();
+  auto* loop_body = create<ast::BlockStatement>(Source{});
   loop_body->append(if_stmt);
 
-  ast::LoopStatement expr(loop_body, create<ast::BlockStatement>());
+  ast::LoopStatement expr(Source{}, loop_body,
+                          create<ast::BlockStatement>(Source{}));
 
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
@@ -435,17 +447,19 @@
   auto* cond = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::BoolLiteral>(Source{}, &bool_type, true));
 
-  auto* else_body = create<ast::BlockStatement>();
-  else_body->append(create<ast::BreakStatement>());
+  auto* else_body = create<ast::BlockStatement>(Source{});
+  else_body->append(create<ast::BreakStatement>(Source{}));
 
   auto* if_stmt = create<ast::IfStatement>(
-      Source{}, cond, create<ast::BlockStatement>(),
-      ast::ElseStatementList{create<ast::ElseStatement>(else_body)});
+      Source{}, cond, create<ast::BlockStatement>(Source{}),
+      ast::ElseStatementList{
+          create<ast::ElseStatement>(Source{}, nullptr, else_body)});
 
-  auto* loop_body = create<ast::BlockStatement>();
+  auto* loop_body = create<ast::BlockStatement>(Source{});
   loop_body->append(if_stmt);
 
-  ast::LoopStatement expr(loop_body, create<ast::BlockStatement>());
+  ast::LoopStatement expr(Source{}, loop_body,
+                          create<ast::BlockStatement>(Source{}));
 
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
@@ -485,16 +499,17 @@
   auto* cond = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::BoolLiteral>(Source{}, &bool_type, true));
 
-  auto* if_body = create<ast::BlockStatement>();
-  if_body->append(create<ast::ContinueStatement>());
+  auto* if_body = create<ast::BlockStatement>(Source{});
+  if_body->append(create<ast::ContinueStatement>(Source{}));
 
   auto* if_stmt = create<ast::IfStatement>(Source{}, cond, if_body,
                                            ast::ElseStatementList{});
 
-  auto* loop_body = create<ast::BlockStatement>();
+  auto* loop_body = create<ast::BlockStatement>(Source{});
   loop_body->append(if_stmt);
 
-  ast::LoopStatement expr(loop_body, create<ast::BlockStatement>());
+  ast::LoopStatement expr(Source{}, loop_body,
+                          create<ast::BlockStatement>(Source{}));
 
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
@@ -533,17 +548,19 @@
   auto* cond = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::BoolLiteral>(Source{}, &bool_type, true));
 
-  auto* else_body = create<ast::BlockStatement>();
-  else_body->append(create<ast::ContinueStatement>());
+  auto* else_body = create<ast::BlockStatement>(Source{});
+  else_body->append(create<ast::ContinueStatement>(Source{}));
 
   auto* if_stmt = create<ast::IfStatement>(
-      Source{}, cond, create<ast::BlockStatement>(),
-      ast::ElseStatementList{create<ast::ElseStatement>(else_body)});
+      Source{}, cond, create<ast::BlockStatement>(Source{}),
+      ast::ElseStatementList{
+          create<ast::ElseStatement>(Source{}, nullptr, else_body)});
 
-  auto* loop_body = create<ast::BlockStatement>();
+  auto* loop_body = create<ast::BlockStatement>(Source{});
   loop_body->append(if_stmt);
 
-  ast::LoopStatement expr(loop_body, create<ast::BlockStatement>());
+  ast::LoopStatement expr(Source{}, loop_body,
+                          create<ast::BlockStatement>(Source{}));
 
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
@@ -581,7 +598,7 @@
   auto* cond = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::BoolLiteral>(Source{}, &bool_type, true));
 
-  auto* if_body = create<ast::BlockStatement>();
+  auto* if_body = create<ast::BlockStatement>(Source{});
   if_body->append(create<ast::ReturnStatement>(Source{}));
 
   ast::IfStatement expr(Source{}, cond, if_body, ast::ElseStatementList{});
@@ -613,7 +630,7 @@
   auto* cond2 = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::BoolLiteral>(Source{}, &bool_type, false));
 
-  auto* if_body = create<ast::BlockStatement>();
+  auto* if_body = create<ast::BlockStatement>(Source{});
   if_body->append(create<ast::ReturnStatement>(Source{}, cond2));
 
   ast::IfStatement expr(Source{}, cond, if_body, ast::ElseStatementList{});
@@ -655,7 +672,7 @@
   ast::IfStatement expr(Source{},
                         create<ast::IdentifierExpression>(
                             Source{}, mod->RegisterSymbol("a"), "a"),
-                        create<ast::BlockStatement>(),
+                        create<ast::BlockStatement>(Source{}),
                         ast::ElseStatementList{});
 
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
diff --git a/src/writer/spirv/builder_intrinsic_test.cc b/src/writer/spirv/builder_intrinsic_test.cc
index de5055b..8de99f1 100644
--- a/src/writer/spirv/builder_intrinsic_test.cc
+++ b/src/writer/spirv/builder_intrinsic_test.cc
@@ -472,7 +472,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateGlobalVariable(var)) << b.error();
@@ -506,7 +506,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -534,7 +534,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -588,7 +588,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -613,7 +613,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -640,7 +640,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -672,7 +672,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -701,7 +701,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -738,7 +738,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -764,7 +764,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -793,7 +793,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -824,7 +824,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -854,7 +854,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -895,7 +895,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -923,7 +923,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -958,7 +958,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -986,7 +986,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -1021,7 +1021,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -1049,7 +1049,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -1085,7 +1085,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -1113,7 +1113,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -1149,7 +1149,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -1179,7 +1179,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -1214,7 +1214,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -1244,7 +1244,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -1277,7 +1277,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -1321,7 +1321,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -1361,7 +1361,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
@@ -1407,7 +1407,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     ty.void_, create<ast::BlockStatement>(),
+                     ty.void_, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
diff --git a/src/writer/spirv/builder_loop_test.cc b/src/writer/spirv/builder_loop_test.cc
index 3fa284d..5943521 100644
--- a/src/writer/spirv/builder_loop_test.cc
+++ b/src/writer/spirv/builder_loop_test.cc
@@ -39,13 +39,13 @@
   // loop {
   // }
 
-  ast::LoopStatement expr(create<ast::BlockStatement>(),
-                          create<ast::BlockStatement>());
+  ast::LoopStatement loop(Source{}, create<ast::BlockStatement>(Source{}),
+                          create<ast::BlockStatement>(Source{}));
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(&loop)) << td.error();
   b.push_function(Function{});
 
-  EXPECT_TRUE(b.GenerateLoopStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateLoopStatement(&loop)) << b.error();
   EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
             R"(OpBranch %1
 %1 = OpLabel
@@ -74,22 +74,24 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("v"),
                                         "v"),
       create<ast::ScalarConstructorExpression>(
           Source{}, create<ast::SintLiteral>(Source{}, &i32, 2))));
 
-  ast::LoopStatement expr(body, create<ast::BlockStatement>());
+  ast::LoopStatement loop(Source{}, body,
+                          create<ast::BlockStatement>(Source{}));
 
   td.RegisterVariableForTesting(var);
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(&loop)) << td.error();
 
   b.push_function(Function{});
   ASSERT_TRUE(b.GenerateGlobalVariable(var)) << b.error();
 
-  EXPECT_TRUE(b.GenerateLoopStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateLoopStatement(&loop)) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeInt 32 1
 %2 = OpTypePointer Private %3
 %4 = OpConstantNull %3
@@ -128,28 +130,30 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  auto* body = create<ast::BlockStatement>();
+  auto* body = create<ast::BlockStatement>(Source{});
   body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("v"),
                                         "v"),
       create<ast::ScalarConstructorExpression>(
           Source{}, create<ast::SintLiteral>(Source{}, &i32, 2))));
 
-  auto* continuing = create<ast::BlockStatement>();
+  auto* continuing = create<ast::BlockStatement>(Source{});
   continuing->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("v"),
                                         "v"),
       create<ast::ScalarConstructorExpression>(
           Source{}, create<ast::SintLiteral>(Source{}, &i32, 3))));
-  ast::LoopStatement expr(body, continuing);
+  ast::LoopStatement loop(Source{}, body, continuing);
 
   td.RegisterVariableForTesting(var);
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(&loop)) << td.error();
 
   b.push_function(Function{});
   ASSERT_TRUE(b.GenerateGlobalVariable(var)) << b.error();
 
-  EXPECT_TRUE(b.GenerateLoopStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateLoopStatement(&loop)) << b.error();
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeInt 32 1
 %2 = OpTypePointer Private %3
 %4 = OpConstantNull %3
@@ -176,16 +180,17 @@
   // loop {
   //   continue;
   // }
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::ContinueStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::ContinueStatement>(Source{}));
 
-  ast::LoopStatement expr(body, create<ast::BlockStatement>());
+  ast::LoopStatement loop(Source{}, body,
+                          create<ast::BlockStatement>(Source{}));
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(&loop)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_TRUE(b.GenerateLoopStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateLoopStatement(&loop)) << b.error();
   EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
             R"(OpBranch %1
 %1 = OpLabel
@@ -203,16 +208,17 @@
   // loop {
   //   break;
   // }
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::BreakStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::BreakStatement>(Source{}));
 
-  ast::LoopStatement expr(body, create<ast::BlockStatement>());
+  ast::LoopStatement loop(Source{}, body,
+                          create<ast::BlockStatement>(Source{}));
 
-  ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
+  ASSERT_TRUE(td.DetermineResultType(&loop)) << td.error();
 
   b.push_function(Function{});
 
-  EXPECT_TRUE(b.GenerateLoopStatement(&expr)) << b.error();
+  EXPECT_TRUE(b.GenerateLoopStatement(&loop)) << b.error();
   EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
             R"(OpBranch %1
 %1 = OpLabel
diff --git a/src/writer/spirv/builder_switch_test.cc b/src/writer/spirv/builder_switch_test.cc
index 10341be..3e99d19 100644
--- a/src/writer/spirv/builder_switch_test.cc
+++ b/src/writer/spirv/builder_switch_test.cc
@@ -47,7 +47,7 @@
   auto* cond = create<ast::ScalarConstructorExpression>(
       Source{}, create<ast::SintLiteral>(Source{}, &i32, 1));
 
-  ast::SwitchStatement expr(cond, ast::CaseStatementList{});
+  ast::SwitchStatement expr(Source{}, cond, ast::CaseStatementList{});
 
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
@@ -93,15 +93,17 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  auto* case_1_body = create<ast::BlockStatement>();
+  auto* case_1_body = create<ast::BlockStatement>(Source{});
   case_1_body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("v"),
                                         "v"),
       create<ast::ScalarConstructorExpression>(
           Source{}, create<ast::SintLiteral>(Source{}, &i32, 1))));
 
-  auto* case_2_body = create<ast::BlockStatement>();
+  auto* case_2_body = create<ast::BlockStatement>(Source{});
   case_2_body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("v"),
                                         "v"),
       create<ast::ScalarConstructorExpression>(
@@ -114,10 +116,13 @@
   selector_2.push_back(create<ast::SintLiteral>(Source{}, &i32, 2));
 
   ast::CaseStatementList cases;
-  cases.push_back(create<ast::CaseStatement>(selector_1, case_1_body));
-  cases.push_back(create<ast::CaseStatement>(selector_2, case_2_body));
+  cases.push_back(
+      create<ast::CaseStatement>(Source{}, selector_1, case_1_body));
+  cases.push_back(
+      create<ast::CaseStatement>(Source{}, selector_2, case_2_body));
 
-  ast::SwitchStatement expr(create<ast::IdentifierExpression>(
+  ast::SwitchStatement expr(Source{},
+                            create<ast::IdentifierExpression>(
                                 Source{}, mod->RegisterSymbol("a"), "a"),
                             cases);
 
@@ -126,7 +131,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     &i32, create<ast::BlockStatement>(),
+                     &i32, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
@@ -190,17 +195,20 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  auto* default_body = create<ast::BlockStatement>();
+  auto* default_body = create<ast::BlockStatement>(Source{});
   default_body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("v"),
                                         "v"),
       create<ast::ScalarConstructorExpression>(
           Source{}, create<ast::SintLiteral>(Source{}, &i32, 1))));
 
   ast::CaseStatementList cases;
-  cases.push_back(create<ast::CaseStatement>(default_body));
+  cases.push_back(create<ast::CaseStatement>(Source{}, ast::CaseSelectorList{},
+                                             default_body));
 
-  ast::SwitchStatement expr(create<ast::IdentifierExpression>(
+  ast::SwitchStatement expr(Source{},
+                            create<ast::IdentifierExpression>(
                                 Source{}, mod->RegisterSymbol("a"), "a"),
                             cases);
 
@@ -209,7 +217,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     &i32, create<ast::BlockStatement>(),
+                     &i32, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
@@ -271,22 +279,25 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  auto* case_1_body = create<ast::BlockStatement>();
+  auto* case_1_body = create<ast::BlockStatement>(Source{});
   case_1_body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("v"),
                                         "v"),
       create<ast::ScalarConstructorExpression>(
           Source{}, create<ast::SintLiteral>(Source{}, &i32, 1))));
 
-  auto* case_2_body = create<ast::BlockStatement>();
+  auto* case_2_body = create<ast::BlockStatement>(Source{});
   case_2_body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("v"),
                                         "v"),
       create<ast::ScalarConstructorExpression>(
           Source{}, create<ast::SintLiteral>(Source{}, &i32, 2))));
 
-  auto* default_body = create<ast::BlockStatement>();
+  auto* default_body = create<ast::BlockStatement>(Source{});
   default_body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("v"),
                                         "v"),
       create<ast::ScalarConstructorExpression>(
@@ -300,11 +311,15 @@
   selector_2.push_back(create<ast::SintLiteral>(Source{}, &i32, 3));
 
   ast::CaseStatementList cases;
-  cases.push_back(create<ast::CaseStatement>(selector_1, case_1_body));
-  cases.push_back(create<ast::CaseStatement>(selector_2, case_2_body));
-  cases.push_back(create<ast::CaseStatement>(default_body));
+  cases.push_back(
+      create<ast::CaseStatement>(Source{}, selector_1, case_1_body));
+  cases.push_back(
+      create<ast::CaseStatement>(Source{}, selector_2, case_2_body));
+  cases.push_back(create<ast::CaseStatement>(Source{}, ast::CaseSelectorList{},
+                                             default_body));
 
-  ast::SwitchStatement expr(create<ast::IdentifierExpression>(
+  ast::SwitchStatement expr(Source{},
+                            create<ast::IdentifierExpression>(
                                 Source{}, mod->RegisterSymbol("a"), "a"),
                             cases);
 
@@ -313,7 +328,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     &i32, create<ast::BlockStatement>(),
+                     &i32, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
@@ -384,23 +399,26 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  auto* case_1_body = create<ast::BlockStatement>();
+  auto* case_1_body = create<ast::BlockStatement>(Source{});
   case_1_body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("v"),
                                         "v"),
       create<ast::ScalarConstructorExpression>(
           Source{}, create<ast::SintLiteral>(Source{}, &i32, 1))));
-  case_1_body->append(create<ast::FallthroughStatement>());
+  case_1_body->append(create<ast::FallthroughStatement>(Source{}));
 
-  auto* case_2_body = create<ast::BlockStatement>();
+  auto* case_2_body = create<ast::BlockStatement>(Source{});
   case_2_body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("v"),
                                         "v"),
       create<ast::ScalarConstructorExpression>(
           Source{}, create<ast::SintLiteral>(Source{}, &i32, 2))));
 
-  auto* default_body = create<ast::BlockStatement>();
+  auto* default_body = create<ast::BlockStatement>(Source{});
   default_body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("v"),
                                         "v"),
       create<ast::ScalarConstructorExpression>(
@@ -413,11 +431,15 @@
   selector_2.push_back(create<ast::SintLiteral>(Source{}, &i32, 2));
 
   ast::CaseStatementList cases;
-  cases.push_back(create<ast::CaseStatement>(selector_1, case_1_body));
-  cases.push_back(create<ast::CaseStatement>(selector_2, case_2_body));
-  cases.push_back(create<ast::CaseStatement>(default_body));
+  cases.push_back(
+      create<ast::CaseStatement>(Source{}, selector_1, case_1_body));
+  cases.push_back(
+      create<ast::CaseStatement>(Source{}, selector_2, case_2_body));
+  cases.push_back(create<ast::CaseStatement>(Source{}, ast::CaseSelectorList{},
+                                             default_body));
 
-  ast::SwitchStatement expr(create<ast::IdentifierExpression>(
+  ast::SwitchStatement expr(Source{},
+                            create<ast::IdentifierExpression>(
                                 Source{}, mod->RegisterSymbol("a"), "a"),
                             cases);
 
@@ -426,7 +448,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     &i32, create<ast::BlockStatement>(),
+                     &i32, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
@@ -493,21 +515,24 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  auto* case_1_body = create<ast::BlockStatement>();
+  auto* case_1_body = create<ast::BlockStatement>(Source{});
   case_1_body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("v"),
                                         "v"),
       create<ast::ScalarConstructorExpression>(
           Source{}, create<ast::SintLiteral>(Source{}, &i32, 1))));
-  case_1_body->append(create<ast::FallthroughStatement>());
+  case_1_body->append(create<ast::FallthroughStatement>(Source{}));
 
   ast::CaseSelectorList selector_1;
   selector_1.push_back(create<ast::SintLiteral>(Source{}, &i32, 1));
 
   ast::CaseStatementList cases;
-  cases.push_back(create<ast::CaseStatement>(selector_1, case_1_body));
+  cases.push_back(
+      create<ast::CaseStatement>(Source{}, selector_1, case_1_body));
 
-  ast::SwitchStatement expr(create<ast::IdentifierExpression>(
+  ast::SwitchStatement expr(Source{},
+                            create<ast::IdentifierExpression>(
                                 Source{}, mod->RegisterSymbol("a"), "a"),
                             cases);
 
@@ -516,7 +541,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     &i32, create<ast::BlockStatement>(),
+                     &i32, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
@@ -556,10 +581,10 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  auto* if_body = create<ast::BlockStatement>();
-  if_body->append(create<ast::BreakStatement>());
+  auto* if_body = create<ast::BlockStatement>(Source{});
+  if_body->append(create<ast::BreakStatement>(Source{}));
 
-  auto* case_1_body = create<ast::BlockStatement>();
+  auto* case_1_body = create<ast::BlockStatement>(Source{});
   case_1_body->append(create<ast::IfStatement>(
       Source{},
       create<ast::ScalarConstructorExpression>(
@@ -567,6 +592,7 @@
       if_body, ast::ElseStatementList{}));
 
   case_1_body->append(create<ast::AssignmentStatement>(
+      Source{},
       create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("v"),
                                         "v"),
       create<ast::ScalarConstructorExpression>(
@@ -576,9 +602,11 @@
   selector_1.push_back(create<ast::SintLiteral>(Source{}, &i32, 1));
 
   ast::CaseStatementList cases;
-  cases.push_back(create<ast::CaseStatement>(selector_1, case_1_body));
+  cases.push_back(
+      create<ast::CaseStatement>(Source{}, selector_1, case_1_body));
 
-  ast::SwitchStatement expr(create<ast::IdentifierExpression>(
+  ast::SwitchStatement expr(Source{},
+                            create<ast::IdentifierExpression>(
                                 Source{}, mod->RegisterSymbol("a"), "a"),
                             cases);
 
@@ -587,7 +615,7 @@
   ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
 
   ast::Function func(Source{}, mod->RegisterSymbol("a_func"), "a_func", {},
-                     &i32, create<ast::BlockStatement>(),
+                     &i32, create<ast::BlockStatement>(Source{}),
                      ast::FunctionDecorationList{});
 
   ASSERT_TRUE(b.GenerateGlobalVariable(v)) << b.error();
diff --git a/src/writer/wgsl/generator_impl_assign_test.cc b/src/writer/wgsl/generator_impl_assign_test.cc
index 436a0a2..0d3cde4 100644
--- a/src/writer/wgsl/generator_impl_assign_test.cc
+++ b/src/writer/wgsl/generator_impl_assign_test.cc
@@ -33,7 +33,7 @@
       Source{}, mod.RegisterSymbol("lhs"), "lhs");
   auto* rhs = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("rhs"), "rhs");
-  ast::AssignmentStatement assign(lhs, rhs);
+  ast::AssignmentStatement assign(Source{}, lhs, rhs);
 
   gen.increment_indent();
 
diff --git a/src/writer/wgsl/generator_impl_block_test.cc b/src/writer/wgsl/generator_impl_block_test.cc
index 85e00aa..b7e88b1 100644
--- a/src/writer/wgsl/generator_impl_block_test.cc
+++ b/src/writer/wgsl/generator_impl_block_test.cc
@@ -28,8 +28,8 @@
 using WgslGeneratorImplTest = TestHelper;
 
 TEST_F(WgslGeneratorImplTest, Emit_Block) {
-  ast::BlockStatement b;
-  b.append(create<ast::DiscardStatement>());
+  ast::BlockStatement b(Source{});
+  b.append(create<ast::DiscardStatement>(Source{}));
 
   gen.increment_indent();
 
@@ -41,8 +41,8 @@
 }
 
 TEST_F(WgslGeneratorImplTest, Emit_Block_WithoutNewline) {
-  ast::BlockStatement b;
-  b.append(create<ast::DiscardStatement>());
+  ast::BlockStatement b(Source{});
+  b.append(create<ast::DiscardStatement>(Source{}));
 
   gen.increment_indent();
 
diff --git a/src/writer/wgsl/generator_impl_break_test.cc b/src/writer/wgsl/generator_impl_break_test.cc
index cb909f3..361f6c0 100644
--- a/src/writer/wgsl/generator_impl_break_test.cc
+++ b/src/writer/wgsl/generator_impl_break_test.cc
@@ -28,7 +28,7 @@
 using WgslGeneratorImplTest = TestHelper;
 
 TEST_F(WgslGeneratorImplTest, Emit_Break) {
-  ast::BreakStatement b;
+  ast::BreakStatement b(Source{});
 
   gen.increment_indent();
 
diff --git a/src/writer/wgsl/generator_impl_call_test.cc b/src/writer/wgsl/generator_impl_call_test.cc
index 1855d0c..6ad5e38 100644
--- a/src/writer/wgsl/generator_impl_call_test.cc
+++ b/src/writer/wgsl/generator_impl_call_test.cc
@@ -60,7 +60,8 @@
   params.push_back(create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("param2"), "param2"));
 
-  ast::CallStatement call(create<ast::CallExpression>(Source{}, id, params));
+  ast::CallStatement call(Source{},
+                          create<ast::CallExpression>(Source{}, id, params));
 
   gen.increment_indent();
   ASSERT_TRUE(gen.EmitStatement(&call)) << gen.error();
diff --git a/src/writer/wgsl/generator_impl_case_test.cc b/src/writer/wgsl/generator_impl_case_test.cc
index 1a1a444..271ab69 100644
--- a/src/writer/wgsl/generator_impl_case_test.cc
+++ b/src/writer/wgsl/generator_impl_case_test.cc
@@ -33,12 +33,12 @@
 TEST_F(WgslGeneratorImplTest, Emit_Case) {
   ast::type::I32 i32;
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::BreakStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::BreakStatement>(Source{}));
 
   ast::CaseSelectorList lit;
   lit.push_back(create<ast::SintLiteral>(Source{}, &i32, 5));
-  ast::CaseStatement c(lit, body);
+  ast::CaseStatement c(Source{}, lit, body);
 
   gen.increment_indent();
 
@@ -52,13 +52,13 @@
 TEST_F(WgslGeneratorImplTest, Emit_Case_MultipleSelectors) {
   ast::type::I32 i32;
 
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::BreakStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::BreakStatement>(Source{}));
 
   ast::CaseSelectorList lit;
   lit.push_back(create<ast::SintLiteral>(Source{}, &i32, 5));
   lit.push_back(create<ast::SintLiteral>(Source{}, &i32, 6));
-  ast::CaseStatement c(lit, body);
+  ast::CaseStatement c(Source{}, lit, body);
 
   gen.increment_indent();
 
@@ -70,9 +70,9 @@
 }
 
 TEST_F(WgslGeneratorImplTest, Emit_Case_Default) {
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::BreakStatement>());
-  ast::CaseStatement c(body);
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::BreakStatement>(Source{}));
+  ast::CaseStatement c(Source{}, ast::CaseSelectorList{}, body);
 
   gen.increment_indent();
 
diff --git a/src/writer/wgsl/generator_impl_continue_test.cc b/src/writer/wgsl/generator_impl_continue_test.cc
index 48d033e..384acba 100644
--- a/src/writer/wgsl/generator_impl_continue_test.cc
+++ b/src/writer/wgsl/generator_impl_continue_test.cc
@@ -28,7 +28,7 @@
 using WgslGeneratorImplTest = TestHelper;
 
 TEST_F(WgslGeneratorImplTest, Emit_Continue) {
-  ast::ContinueStatement c;
+  ast::ContinueStatement c(Source{});
 
   gen.increment_indent();
 
diff --git a/src/writer/wgsl/generator_impl_discard_test.cc b/src/writer/wgsl/generator_impl_discard_test.cc
index 092d197..52633ec 100644
--- a/src/writer/wgsl/generator_impl_discard_test.cc
+++ b/src/writer/wgsl/generator_impl_discard_test.cc
@@ -25,7 +25,7 @@
 using WgslGeneratorImplTest = TestHelper;
 
 TEST_F(WgslGeneratorImplTest, Emit_Discard) {
-  ast::DiscardStatement k;
+  ast::DiscardStatement k(Source{});
 
   gen.increment_indent();
 
diff --git a/src/writer/wgsl/generator_impl_fallthrough_test.cc b/src/writer/wgsl/generator_impl_fallthrough_test.cc
index e8fcbe4..454c7f8 100644
--- a/src/writer/wgsl/generator_impl_fallthrough_test.cc
+++ b/src/writer/wgsl/generator_impl_fallthrough_test.cc
@@ -25,7 +25,7 @@
 using WgslGeneratorImplTest = TestHelper;
 
 TEST_F(WgslGeneratorImplTest, Emit_Fallthrough) {
-  ast::FallthroughStatement f;
+  ast::FallthroughStatement f(Source{});
 
   gen.increment_indent();
 
diff --git a/src/writer/wgsl/generator_impl_function_test.cc b/src/writer/wgsl/generator_impl_function_test.cc
index 21407f7..41263ba 100644
--- a/src/writer/wgsl/generator_impl_function_test.cc
+++ b/src/writer/wgsl/generator_impl_function_test.cc
@@ -41,8 +41,8 @@
 using WgslGeneratorImplTest = TestHelper;
 
 TEST_F(WgslGeneratorImplTest, Emit_Function) {
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::DiscardStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::DiscardStatement>(Source{}));
   body->append(create<ast::ReturnStatement>(Source{}));
 
   ast::type::Void void_type;
@@ -60,8 +60,8 @@
 }
 
 TEST_F(WgslGeneratorImplTest, Emit_Function_WithParams) {
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::DiscardStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::DiscardStatement>(Source{}));
   body->append(create<ast::ReturnStatement>(Source{}));
 
   ast::type::F32 f32;
@@ -99,8 +99,8 @@
 }
 
 TEST_F(WgslGeneratorImplTest, Emit_Function_WithDecoration_WorkgroupSize) {
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::DiscardStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::DiscardStatement>(Source{}));
   body->append(create<ast::ReturnStatement>(Source{}));
 
   ast::type::Void void_type;
@@ -122,8 +122,8 @@
 }
 
 TEST_F(WgslGeneratorImplTest, Emit_Function_WithDecoration_Stage) {
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::DiscardStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::DiscardStatement>(Source{}));
   body->append(create<ast::ReturnStatement>(Source{}));
 
   ast::type::Void void_type;
@@ -145,8 +145,8 @@
 }
 
 TEST_F(WgslGeneratorImplTest, Emit_Function_WithDecoration_Multiple) {
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::DiscardStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::DiscardStatement>(Source{}));
   body->append(create<ast::ReturnStatement>(Source{}));
 
   ast::type::Void void_type;
@@ -237,8 +237,8 @@
                                               "d")),  // constructor
         ast::VariableDecorationList{});               // decorations
 
-    auto* body = create<ast::BlockStatement>();
-    body->append(create<ast::VariableDeclStatement>(var));
+    auto* body = create<ast::BlockStatement>(Source{});
+    body->append(create<ast::VariableDeclStatement>(Source{}, var));
     body->append(create<ast::ReturnStatement>(Source{}));
 
     auto* func = create<ast::Function>(
@@ -267,8 +267,8 @@
                                               "d")),  // constructor
         ast::VariableDecorationList{});               // decorations
 
-    auto* body = create<ast::BlockStatement>();
-    body->append(create<ast::VariableDeclStatement>(var));
+    auto* body = create<ast::BlockStatement>(Source{});
+    body->append(create<ast::VariableDeclStatement>(Source{}, var));
     body->append(create<ast::ReturnStatement>(Source{}));
 
     auto* func = create<ast::Function>(
diff --git a/src/writer/wgsl/generator_impl_if_test.cc b/src/writer/wgsl/generator_impl_if_test.cc
index 8b3e0e9..75d0694 100644
--- a/src/writer/wgsl/generator_impl_if_test.cc
+++ b/src/writer/wgsl/generator_impl_if_test.cc
@@ -30,8 +30,8 @@
 TEST_F(WgslGeneratorImplTest, Emit_If) {
   auto* cond = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("cond"), "cond");
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::DiscardStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::DiscardStatement>(Source{}));
 
   ast::IfStatement i(Source{}, cond, body, ast::ElseStatementList{});
 
@@ -47,16 +47,17 @@
 TEST_F(WgslGeneratorImplTest, Emit_IfWithElseIf) {
   auto* else_cond = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("else_cond"), "else_cond");
-  auto* else_body = create<ast::BlockStatement>();
-  else_body->append(create<ast::DiscardStatement>());
+  auto* else_body = create<ast::BlockStatement>(Source{});
+  else_body->append(create<ast::DiscardStatement>(Source{}));
 
   auto* cond = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("cond"), "cond");
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::DiscardStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::DiscardStatement>(Source{}));
 
-  ast::IfStatement i(Source{}, cond, body,
-                     {create<ast::ElseStatement>(else_cond, else_body)});
+  ast::IfStatement i(
+      Source{}, cond, body,
+      {create<ast::ElseStatement>(Source{}, else_cond, else_body)});
 
   gen.increment_indent();
 
@@ -70,16 +71,17 @@
 }
 
 TEST_F(WgslGeneratorImplTest, Emit_IfWithElse) {
-  auto* else_body = create<ast::BlockStatement>();
-  else_body->append(create<ast::DiscardStatement>());
+  auto* else_body = create<ast::BlockStatement>(Source{});
+  else_body->append(create<ast::DiscardStatement>(Source{}));
 
   auto* cond = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("cond"), "cond");
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::DiscardStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::DiscardStatement>(Source{}));
 
-  ast::IfStatement i(Source{}, cond, body,
-                     {create<ast::ElseStatement>(else_body)});
+  ast::IfStatement i(
+      Source{}, cond, body,
+      {create<ast::ElseStatement>(Source{}, nullptr, else_body)});
 
   gen.increment_indent();
 
@@ -96,22 +98,23 @@
   auto* else_cond = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("else_cond"), "else_cond");
 
-  auto* else_body = create<ast::BlockStatement>();
-  else_body->append(create<ast::DiscardStatement>());
+  auto* else_body = create<ast::BlockStatement>(Source{});
+  else_body->append(create<ast::DiscardStatement>(Source{}));
 
-  auto* else_body_2 = create<ast::BlockStatement>();
-  else_body_2->append(create<ast::DiscardStatement>());
+  auto* else_body_2 = create<ast::BlockStatement>(Source{});
+  else_body_2->append(create<ast::DiscardStatement>(Source{}));
 
   auto* cond = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("cond"), "cond");
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::DiscardStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::DiscardStatement>(Source{}));
 
-  ast::IfStatement i(Source{}, cond, body,
-                     {
-                         create<ast::ElseStatement>(else_cond, else_body),
-                         create<ast::ElseStatement>(else_body_2),
-                     });
+  ast::IfStatement i(
+      Source{}, cond, body,
+      {
+          create<ast::ElseStatement>(Source{}, else_cond, else_body),
+          create<ast::ElseStatement>(Source{}, nullptr, else_body_2),
+      });
 
   gen.increment_indent();
 
diff --git a/src/writer/wgsl/generator_impl_loop_test.cc b/src/writer/wgsl/generator_impl_loop_test.cc
index 41c399d..4c0b11e 100644
--- a/src/writer/wgsl/generator_impl_loop_test.cc
+++ b/src/writer/wgsl/generator_impl_loop_test.cc
@@ -28,9 +28,9 @@
 using WgslGeneratorImplTest = TestHelper;
 
 TEST_F(WgslGeneratorImplTest, Emit_Loop) {
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::DiscardStatement>());
-  ast::LoopStatement l(body, {});
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::DiscardStatement>(Source{}));
+  ast::LoopStatement l(Source{}, body, {});
 
   gen.increment_indent();
 
@@ -42,13 +42,13 @@
 }
 
 TEST_F(WgslGeneratorImplTest, Emit_LoopWithContinuing) {
-  auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::DiscardStatement>());
+  auto* body = create<ast::BlockStatement>(Source{});
+  body->append(create<ast::DiscardStatement>(Source{}));
 
-  auto* continuing = create<ast::BlockStatement>();
-  continuing->append(create<ast::DiscardStatement>());
+  auto* continuing = create<ast::BlockStatement>(Source{});
+  continuing->append(create<ast::DiscardStatement>(Source{}));
 
-  ast::LoopStatement l(body, continuing);
+  ast::LoopStatement l(Source{}, body, continuing);
 
   gen.increment_indent();
 
diff --git a/src/writer/wgsl/generator_impl_switch_test.cc b/src/writer/wgsl/generator_impl_switch_test.cc
index 96ddc99..f8bd646 100644
--- a/src/writer/wgsl/generator_impl_switch_test.cc
+++ b/src/writer/wgsl/generator_impl_switch_test.cc
@@ -32,18 +32,19 @@
 using WgslGeneratorImplTest = TestHelper;
 
 TEST_F(WgslGeneratorImplTest, Emit_Switch) {
-  auto* def_body = create<ast::BlockStatement>();
-  def_body->append(create<ast::BreakStatement>());
-  auto* def = create<ast::CaseStatement>(def_body);
+  auto* def_body = create<ast::BlockStatement>(Source{});
+  def_body->append(create<ast::BreakStatement>(Source{}));
+  auto* def =
+      create<ast::CaseStatement>(Source{}, ast::CaseSelectorList{}, def_body);
 
   ast::type::I32 i32;
   ast::CaseSelectorList case_val;
   case_val.push_back(create<ast::SintLiteral>(Source{}, &i32, 5));
 
-  auto* case_body = create<ast::BlockStatement>();
-  case_body->append(create<ast::BreakStatement>());
+  auto* case_body = create<ast::BlockStatement>(Source{});
+  case_body->append(create<ast::BreakStatement>(Source{}));
 
-  auto* case_stmt = create<ast::CaseStatement>(case_val, case_body);
+  auto* case_stmt = create<ast::CaseStatement>(Source{}, case_val, case_body);
 
   ast::CaseStatementList body;
   body.push_back(case_stmt);
@@ -51,7 +52,7 @@
 
   auto* cond = create<ast::IdentifierExpression>(
       Source{}, mod.RegisterSymbol("cond"), "cond");
-  ast::SwitchStatement s(cond, body);
+  ast::SwitchStatement s(Source{}, cond, body);
 
   gen.increment_indent();
 
diff --git a/src/writer/wgsl/generator_impl_test.cc b/src/writer/wgsl/generator_impl_test.cc
index 1b8da48..e178013 100644
--- a/src/writer/wgsl/generator_impl_test.cc
+++ b/src/writer/wgsl/generator_impl_test.cc
@@ -34,7 +34,7 @@
 
   mod.AddFunction(create<ast::Function>(
       Source{}, mod.RegisterSymbol("a_func"), "my_func", ast::VariableList{},
-      &void_type, create<ast::BlockStatement>(),
+      &void_type, create<ast::BlockStatement>(Source{}),
       ast::FunctionDecorationList{}));
 
   ASSERT_TRUE(gen.Generate(mod)) << gen.error();
diff --git a/src/writer/wgsl/generator_impl_variable_decl_statement_test.cc b/src/writer/wgsl/generator_impl_variable_decl_statement_test.cc
index c892a2b..c7a11bc 100644
--- a/src/writer/wgsl/generator_impl_variable_decl_statement_test.cc
+++ b/src/writer/wgsl/generator_impl_variable_decl_statement_test.cc
@@ -41,7 +41,7 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  ast::VariableDeclStatement stmt(var);
+  ast::VariableDeclStatement stmt(Source{}, var);
 
   gen.increment_indent();
 
@@ -63,7 +63,7 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  ast::VariableDeclStatement stmt(var);
+  ast::VariableDeclStatement stmt(Source{}, var);
 
   gen.increment_indent();
 
@@ -82,7 +82,7 @@
                             nullptr,                         // constructor
                             ast::VariableDecorationList{});  // decorations
 
-  ast::VariableDeclStatement stmt(var);
+  ast::VariableDeclStatement stmt(Source{}, var);
 
   gen.increment_indent();