ast: Remove Variable constructor that doesn't take a source

set_source() will be removed, so sources will only be specifiable at construction time.

Bug: tint:390
Change-Id: I5c79efd3fa501ebd9308f7f93cfb77bc12198047
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/35009
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/ast/builder.cc b/src/ast/builder.cc
index 7fa5bd2..6045083 100644
--- a/src/ast/builder.cc
+++ b/src/ast/builder.cc
@@ -32,7 +32,7 @@
 Variable* Builder::Var(const std::string& name,
                        StorageClass storage,
                        type::Type* type) {
-  auto* var = create<Variable>(name, storage, type);
+  auto* var = create<Variable>(Source{}, name, storage, type);
   OnVariableBuilt(var);
   return var;
 }
@@ -40,7 +40,7 @@
 Variable* Builder::Const(const std::string& name,
                          StorageClass storage,
                          type::Type* type) {
-  auto* var = create<Variable>(name, storage, type);
+  auto* var = create<Variable>(Source{}, name, storage, type);
   var->set_is_const(true);
   OnVariableBuilt(var);
   return var;
diff --git a/src/ast/decorated_variable_test.cc b/src/ast/decorated_variable_test.cc
index d31a7cf..31ac563 100644
--- a/src/ast/decorated_variable_test.cc
+++ b/src/ast/decorated_variable_test.cc
@@ -34,7 +34,7 @@
 
 TEST_F(DecoratedVariableTest, Creation) {
   type::I32 t;
-  auto* var = create<Variable>("my_var", StorageClass::kFunction, &t);
+  auto* var = create<Variable>(Source{}, "my_var", StorageClass::kFunction, &t);
   DecoratedVariable dv(var);
 
   EXPECT_EQ(dv.name(), "my_var");
@@ -63,7 +63,7 @@
 
 TEST_F(DecoratedVariableTest, NoDecorations) {
   type::I32 t;
-  auto* var = create<Variable>("my_var", StorageClass::kFunction, &t);
+  auto* var = create<Variable>(Source{}, "my_var", StorageClass::kFunction, &t);
   DecoratedVariable dv(var);
   EXPECT_FALSE(dv.HasLocationDecoration());
   EXPECT_FALSE(dv.HasBuiltinDecoration());
@@ -72,7 +72,7 @@
 
 TEST_F(DecoratedVariableTest, WithDecorations) {
   type::F32 t;
-  auto* var = create<Variable>("my_var", StorageClass::kFunction, &t);
+  auto* var = create<Variable>(Source{}, "my_var", StorageClass::kFunction, &t);
   DecoratedVariable dv(var);
 
   VariableDecorationList decos;
@@ -89,7 +89,7 @@
 
 TEST_F(DecoratedVariableTest, ConstantId) {
   type::F32 t;
-  auto* var = create<Variable>("my_var", StorageClass::kFunction, &t);
+  auto* var = create<Variable>(Source{}, "my_var", StorageClass::kFunction, &t);
   DecoratedVariable dv(var);
 
   VariableDecorationList decos;
@@ -101,20 +101,21 @@
 
 TEST_F(DecoratedVariableTest, IsValid) {
   type::I32 t;
-  auto* var = create<Variable>("my_var", StorageClass::kNone, &t);
+  auto* var = create<Variable>(Source{}, "my_var", StorageClass::kNone, &t);
   DecoratedVariable dv(var);
   EXPECT_TRUE(dv.IsValid());
 }
 
 TEST_F(DecoratedVariableTest, IsDecorated) {
   type::I32 t;
-  DecoratedVariable dv(create<Variable>("my_var", StorageClass::kNone, &t));
+  DecoratedVariable dv(
+      create<Variable>(Source{}, "my_var", StorageClass::kNone, &t));
   EXPECT_TRUE(dv.Is<DecoratedVariable>());
 }
 
 TEST_F(DecoratedVariableTest, to_str) {
   type::F32 t;
-  auto* var = create<Variable>("my_var", StorageClass::kFunction, &t);
+  auto* var = create<Variable>(Source{}, "my_var", StorageClass::kFunction, &t);
   DecoratedVariable dv(var);
   dv.set_constructor(create<IdentifierExpression>("expr"));
 
diff --git a/src/ast/function_test.cc b/src/ast/function_test.cc
index 08b0e44..db0e995 100644
--- a/src/ast/function_test.cc
+++ b/src/ast/function_test.cc
@@ -37,7 +37,8 @@
   type::I32 i32;
 
   VariableList params;
-  params.push_back(create<Variable>("var", StorageClass::kNone, &i32));
+  params.push_back(
+      create<Variable>(Source{}, "var", StorageClass::kNone, &i32));
   auto* var = params[0];
 
   Function f(Source{}, "func", params, &void_type, create<BlockStatement>(),
@@ -53,7 +54,8 @@
   type::I32 i32;
 
   VariableList params;
-  params.push_back(create<Variable>("var", StorageClass::kNone, &i32));
+  params.push_back(
+      create<Variable>(Source{}, "var", StorageClass::kNone, &i32));
 
   Function f(Source{Source::Location{20, 2}}, "func", params, &void_type,
              create<BlockStatement>(), FunctionDecorationList{});
@@ -66,7 +68,7 @@
   type::Void void_type;
   type::I32 i32;
 
-  Variable v("var", StorageClass::kInput, &i32);
+  Variable v(Source{}, "var", StorageClass::kInput, &i32);
   Function f(Source{}, "func", VariableList{}, &void_type,
              create<BlockStatement>(), FunctionDecorationList{});
 
@@ -77,7 +79,7 @@
   f.add_referenced_module_variable(&v);
   ASSERT_EQ(f.referenced_module_variables().size(), 1u);
 
-  Variable v2("var2", StorageClass::kOutput, &i32);
+  Variable v2(Source{}, "var2", StorageClass::kOutput, &i32);
   f.add_referenced_module_variable(&v2);
   ASSERT_EQ(f.referenced_module_variables().size(), 2u);
   EXPECT_EQ(f.referenced_module_variables()[1], &v2);
@@ -87,19 +89,21 @@
   type::Void void_type;
   type::I32 i32;
 
-  DecoratedVariable loc1(create<Variable>("loc1", StorageClass::kInput, &i32));
+  DecoratedVariable loc1(
+      create<Variable>(Source{}, "loc1", StorageClass::kInput, &i32));
   loc1.set_decorations({create<LocationDecoration>(0, Source{})});
 
-  DecoratedVariable loc2(create<Variable>("loc2", StorageClass::kInput, &i32));
+  DecoratedVariable loc2(
+      create<Variable>(Source{}, "loc2", StorageClass::kInput, &i32));
   loc2.set_decorations({create<LocationDecoration>(1, Source{})});
 
   DecoratedVariable builtin1(
-      create<Variable>("builtin1", StorageClass::kInput, &i32));
+      create<Variable>(Source{}, "builtin1", StorageClass::kInput, &i32));
   builtin1.set_decorations(
       {create<BuiltinDecoration>(Builtin::kPosition, Source{})});
 
   DecoratedVariable builtin2(
-      create<Variable>("builtin2", StorageClass::kInput, &i32));
+      create<Variable>(Source{}, "builtin2", StorageClass::kInput, &i32));
   builtin2.set_decorations(
       {create<BuiltinDecoration>(Builtin::kFragDepth, Source{})});
 
@@ -124,19 +128,21 @@
   type::Void void_type;
   type::I32 i32;
 
-  DecoratedVariable loc1(create<Variable>("loc1", StorageClass::kInput, &i32));
+  DecoratedVariable loc1(
+      create<Variable>(Source{}, "loc1", StorageClass::kInput, &i32));
   loc1.set_decorations({create<LocationDecoration>(0, Source{})});
 
-  DecoratedVariable loc2(create<Variable>("loc2", StorageClass::kInput, &i32));
+  DecoratedVariable loc2(
+      create<Variable>(Source{}, "loc2", StorageClass::kInput, &i32));
   loc2.set_decorations({create<LocationDecoration>(1, Source{})});
 
   DecoratedVariable builtin1(
-      create<Variable>("builtin1", StorageClass::kInput, &i32));
+      create<Variable>(Source{}, "builtin1", StorageClass::kInput, &i32));
   builtin1.set_decorations(
       {create<BuiltinDecoration>(Builtin::kPosition, Source{})});
 
   DecoratedVariable builtin2(
-      create<Variable>("builtin2", StorageClass::kInput, &i32));
+      create<Variable>(Source{}, "builtin2", StorageClass::kInput, &i32));
   builtin2.set_decorations(
       {create<BuiltinDecoration>(Builtin::kFragDepth, Source{})});
 
@@ -176,7 +182,8 @@
   type::I32 i32;
 
   VariableList params;
-  params.push_back(create<Variable>("var", StorageClass::kNone, &i32));
+  params.push_back(
+      create<Variable>(Source{}, "var", StorageClass::kNone, &i32));
 
   auto* block = create<BlockStatement>();
   block->append(create<DiscardStatement>());
@@ -192,7 +199,8 @@
   type::I32 i32;
 
   VariableList params;
-  params.push_back(create<Variable>("var", StorageClass::kNone, &i32));
+  params.push_back(
+      create<Variable>(Source{}, "var", StorageClass::kNone, &i32));
 
   Function f(Source{}, "", params, &void_type, create<BlockStatement>(),
              FunctionDecorationList{});
@@ -203,7 +211,8 @@
   type::I32 i32;
 
   VariableList params;
-  params.push_back(create<Variable>("var", StorageClass::kNone, &i32));
+  params.push_back(
+      create<Variable>(Source{}, "var", StorageClass::kNone, &i32));
 
   Function f(Source{}, "func", params, nullptr, create<BlockStatement>(),
              FunctionDecorationList{});
@@ -215,7 +224,8 @@
   type::I32 i32;
 
   VariableList params;
-  params.push_back(create<Variable>("var", StorageClass::kNone, &i32));
+  params.push_back(
+      create<Variable>(Source{}, "var", StorageClass::kNone, &i32));
   params.push_back(nullptr);
 
   Function f(Source{}, "func", params, &void_type, create<BlockStatement>(),
@@ -227,7 +237,8 @@
   type::Void void_type;
 
   VariableList params;
-  params.push_back(create<Variable>("var", StorageClass::kNone, nullptr));
+  params.push_back(
+      create<Variable>(Source{}, "var", StorageClass::kNone, nullptr));
 
   Function f(Source{}, "func", params, &void_type, create<BlockStatement>(),
              FunctionDecorationList{});
@@ -239,7 +250,8 @@
   type::I32 i32;
 
   VariableList params;
-  params.push_back(create<Variable>("var", StorageClass::kNone, &i32));
+  params.push_back(
+      create<Variable>(Source{}, "var", StorageClass::kNone, &i32));
 
   auto* block = create<BlockStatement>();
   block->append(create<DiscardStatement>());
@@ -256,7 +268,8 @@
   type::I32 i32;
 
   VariableList params;
-  params.push_back(create<Variable>("var", StorageClass::kNone, &i32));
+  params.push_back(
+      create<Variable>(Source{}, "var", StorageClass::kNone, &i32));
 
   auto* block = create<BlockStatement>();
   block->append(create<DiscardStatement>());
@@ -316,7 +329,8 @@
   type::I32 i32;
 
   VariableList params;
-  params.push_back(create<Variable>("var", StorageClass::kNone, &i32));
+  params.push_back(
+      create<Variable>(Source{}, "var", StorageClass::kNone, &i32));
 
   auto* block = create<BlockStatement>();
   block->append(create<DiscardStatement>());
@@ -355,8 +369,10 @@
   type::F32 f32;
 
   VariableList params;
-  params.push_back(create<Variable>("var1", StorageClass::kNone, &i32));
-  params.push_back(create<Variable>("var2", StorageClass::kNone, &f32));
+  params.push_back(
+      create<Variable>(Source{}, "var1", StorageClass::kNone, &i32));
+  params.push_back(
+      create<Variable>(Source{}, "var2", StorageClass::kNone, &f32));
 
   Function f(Source{}, "func", params, &void_type, create<BlockStatement>(),
              FunctionDecorationList{});
diff --git a/src/ast/module_test.cc b/src/ast/module_test.cc
index c5ff933..6a1978a 100644
--- a/src/ast/module_test.cc
+++ b/src/ast/module_test.cc
@@ -67,7 +67,7 @@
 
 TEST_F(ModuleTest, IsValid_GlobalVariable) {
   type::F32 f32;
-  auto* var = create<Variable>("var", StorageClass::kInput, &f32);
+  auto* var = create<Variable>(Source{}, "var", StorageClass::kInput, &f32);
 
   Module m;
   m.AddGlobalVariable(var);
@@ -81,7 +81,7 @@
 }
 
 TEST_F(ModuleTest, IsValid_Invalid_GlobalVariable) {
-  auto* var = create<Variable>("var", StorageClass::kInput, nullptr);
+  auto* var = create<Variable>(Source{}, "var", StorageClass::kInput, nullptr);
 
   Module m;
   m.AddGlobalVariable(var);
diff --git a/src/ast/variable.cc b/src/ast/variable.cc
index dbfe7d5..d97253e 100644
--- a/src/ast/variable.cc
+++ b/src/ast/variable.cc
@@ -27,9 +27,6 @@
 
 Variable::Variable() = default;
 
-Variable::Variable(const std::string& name, StorageClass sc, type::Type* type)
-    : Base(), name_(name), storage_class_(sc), type_(type) {}
-
 Variable::Variable(const Source& source,
                    const std::string& name,
                    StorageClass sc,
@@ -41,9 +38,8 @@
 Variable::~Variable() = default;
 
 Variable* Variable::Clone(CloneContext* ctx) const {
-  auto* cloned =
-      ctx->mod->create<Variable>(name(), storage_class(), ctx->Clone(type()));
-  cloned->set_source(ctx->Clone(source()));
+  auto* cloned = ctx->mod->create<Variable>(
+      ctx->Clone(source()), name(), storage_class(), ctx->Clone(type()));
   cloned->set_constructor(ctx->Clone(constructor()));
   cloned->set_is_const(is_const());
   return cloned;
diff --git a/src/ast/variable.h b/src/ast/variable.h
index 72de0f1..a226bdd 100644
--- a/src/ast/variable.h
+++ b/src/ast/variable.h
@@ -79,11 +79,6 @@
 class Variable : public Castable<Variable, Node> {
  public:
   /// Create a variable
-  /// @param name the variables name
-  /// @param sc the variable storage class
-  /// @param type the value type
-  Variable(const std::string& name, StorageClass sc, type::Type* type);
-  /// Create a variable
   /// @param source the variable source
   /// @param name the variables name
   /// @param sc the variable storage class
diff --git a/src/ast/variable_decl_statement_test.cc b/src/ast/variable_decl_statement_test.cc
index daa7c2a..c7e08be 100644
--- a/src/ast/variable_decl_statement_test.cc
+++ b/src/ast/variable_decl_statement_test.cc
@@ -26,7 +26,7 @@
 
 TEST_F(VariableDeclStatementTest, Creation) {
   type::F32 f32;
-  auto* var = create<Variable>("a", StorageClass::kNone, &f32);
+  auto* var = create<Variable>(Source{}, "a", StorageClass::kNone, &f32);
 
   VariableDeclStatement stmt(var);
   EXPECT_EQ(stmt.variable(), var);
@@ -34,7 +34,7 @@
 
 TEST_F(VariableDeclStatementTest, Creation_WithSource) {
   type::F32 f32;
-  auto* var = create<Variable>("a", StorageClass::kNone, &f32);
+  auto* var = create<Variable>(Source{}, "a", StorageClass::kNone, &f32);
 
   VariableDeclStatement stmt(Source{Source::Location{20, 2}}, var);
   auto src = stmt.source();
@@ -44,7 +44,7 @@
 
 TEST_F(VariableDeclStatementTest, IsVariableDecl) {
   type::F32 f32;
-  auto* var = create<Variable>("a", StorageClass::kNone, &f32);
+  auto* var = create<Variable>(Source{}, "a", StorageClass::kNone, &f32);
 
   VariableDeclStatement s(var);
   EXPECT_TRUE(s.Is<VariableDeclStatement>());
@@ -52,14 +52,14 @@
 
 TEST_F(VariableDeclStatementTest, IsValid) {
   type::F32 f32;
-  auto* var = create<Variable>("a", StorageClass::kNone, &f32);
+  auto* var = create<Variable>(Source{}, "a", StorageClass::kNone, &f32);
   VariableDeclStatement stmt(var);
   EXPECT_TRUE(stmt.IsValid());
 }
 
 TEST_F(VariableDeclStatementTest, IsValid_InvalidVariable) {
   type::F32 f32;
-  auto* var = create<Variable>("", StorageClass::kNone, &f32);
+  auto* var = create<Variable>(Source{}, "", StorageClass::kNone, &f32);
   VariableDeclStatement stmt(var);
   EXPECT_FALSE(stmt.IsValid());
 }
@@ -71,7 +71,7 @@
 
 TEST_F(VariableDeclStatementTest, ToStr) {
   type::F32 f32;
-  auto* var = create<Variable>("a", StorageClass::kNone, &f32);
+  auto* var = create<Variable>(Source{}, "a", StorageClass::kNone, &f32);
 
   VariableDeclStatement stmt(Source{Source::Location{20, 2}}, var);
   std::ostringstream out;
diff --git a/src/ast/variable_test.cc b/src/ast/variable_test.cc
index 9f22a94..39dc9f6 100644
--- a/src/ast/variable_test.cc
+++ b/src/ast/variable_test.cc
@@ -27,7 +27,7 @@
 
 TEST_F(VariableTest, Creation) {
   type::I32 t;
-  Variable v("my_var", StorageClass::kFunction, &t);
+  Variable v(Source{}, "my_var", StorageClass::kFunction, &t);
 
   EXPECT_EQ(v.name(), "my_var");
   EXPECT_EQ(v.storage_class(), StorageClass::kFunction);
@@ -68,43 +68,43 @@
 
 TEST_F(VariableTest, IsValid) {
   type::I32 t;
-  Variable v{"my_var", StorageClass::kNone, &t};
+  Variable v{Source{}, "my_var", StorageClass::kNone, &t};
   EXPECT_TRUE(v.IsValid());
 }
 
 TEST_F(VariableTest, IsValid_WithConstructor) {
   type::I32 t;
-  Variable v{"my_var", StorageClass::kNone, &t};
+  Variable v{Source{}, "my_var", StorageClass::kNone, &t};
   v.set_constructor(create<IdentifierExpression>("ident"));
   EXPECT_TRUE(v.IsValid());
 }
 
 TEST_F(VariableTest, IsValid_MissinName) {
   type::I32 t;
-  Variable v{"", StorageClass::kNone, &t};
+  Variable v{Source{}, "", StorageClass::kNone, &t};
   EXPECT_FALSE(v.IsValid());
 }
 
 TEST_F(VariableTest, IsValid_MissingType) {
-  Variable v{"x", StorageClass::kNone, nullptr};
+  Variable v{Source{}, "x", StorageClass::kNone, nullptr};
   EXPECT_FALSE(v.IsValid());
 }
 
 TEST_F(VariableTest, IsValid_MissingBoth) {
-  Variable v("", StorageClass::kNone, nullptr);
+  Variable v{Source{}, "", StorageClass::kNone, nullptr};
   EXPECT_FALSE(v.IsValid());
 }
 
 TEST_F(VariableTest, IsValid_InvalidConstructor) {
   type::I32 t;
-  Variable v{"my_var", StorageClass::kNone, &t};
+  Variable v{Source{}, "my_var", StorageClass::kNone, &t};
   v.set_constructor(create<IdentifierExpression>(""));
   EXPECT_FALSE(v.IsValid());
 }
 
 TEST_F(VariableTest, to_str) {
   type::F32 t;
-  Variable v{"my_var", StorageClass::kFunction, &t};
+  Variable v{Source{}, "my_var", StorageClass::kFunction, &t};
   std::ostringstream out;
   v.to_str(out, 2);
   EXPECT_EQ(out.str(), R"(  Variable{
diff --git a/src/inspector/inspector_test.cc b/src/inspector/inspector_test.cc
index 50d9d1f..9cddc87 100644
--- a/src/inspector/inspector_test.cc
+++ b/src/inspector/inspector_test.cc
@@ -114,10 +114,10 @@
     for (auto inout : inout_vars) {
       std::string in, out;
       std::tie(in, out) = inout;
-      auto* in_var =
-          create<ast::Variable>(in, ast::StorageClass::kInput, u32_type());
-      auto* out_var =
-          create<ast::Variable>(out, ast::StorageClass::kOutput, u32_type());
+      auto* in_var = create<ast::Variable>(
+          Source{}, in, ast::StorageClass::kInput, u32_type());
+      auto* out_var = create<ast::Variable>(
+          Source{}, out, ast::StorageClass::kOutput, u32_type());
       mod()->AddGlobalVariable(in_var);
       mod()->AddGlobalVariable(out_var);
     }
@@ -188,7 +188,7 @@
                      ast::type::Type* type,
                      T* val) {
     auto* dvar = create<ast::DecoratedVariable>(
-        create<ast::Variable>(name, ast::StorageClass::kNone, type));
+        create<ast::Variable>(Source{}, name, ast::StorageClass::kNone, type));
     dvar->set_is_const(true);
     ast::VariableDecorationList decos;
     decos.push_back(create<ast::ConstantIdDecoration>(id, Source{}));
@@ -349,7 +349,7 @@
                   uint32_t set,
                   uint32_t binding) {
     auto* var = create<ast::DecoratedVariable>(
-        create<ast::Variable>(name, storage_class, type));
+        create<ast::Variable>(Source{}, name, storage_class, type));
     ast::VariableDecorationList decorations;
 
     decorations.push_back(create<ast::BindingDecoration>(binding, Source{}));
@@ -399,8 +399,9 @@
       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>(
-          "local" + member_name, ast::StorageClass::kNone, member_type)));
+      body->append(create<ast::VariableDeclStatement>(
+          create<ast::Variable>(Source{}, "local" + member_name,
+                                ast::StorageClass::kNone, member_type)));
     }
 
     for (auto member : members) {
@@ -494,16 +495,16 @@
   }
 
   void AddGlobalVariable(const std::string& name, ast::type::Type* type) {
-    mod()->AddGlobalVariable(
-        create<ast::Variable>(name, ast::StorageClass::kUniformConstant, type));
+    mod()->AddGlobalVariable(create<ast::Variable>(
+        Source{}, name, ast::StorageClass::kUniformConstant, type));
   }
 
   /// Adds a depth texture variable to the module
   /// @param name the name of the variable
   /// @param type the type to use
   void AddDepthTexture(const std::string& name, ast::type::Type* type) {
-    mod()->AddGlobalVariable(
-        create<ast::Variable>(name, ast::StorageClass::kUniformConstant, type));
+    mod()->AddGlobalVariable(create<ast::Variable>(
+        Source{}, name, ast::StorageClass::kUniformConstant, type));
   }
 
   /// Generates a function that references a specific sampler variable
@@ -525,8 +526,9 @@
 
     auto* body = create<ast::BlockStatement>();
 
-    auto* call_result = create<ast::Variable>(
-        "sampler_result", ast::StorageClass::kFunction, vec_type(base_type, 4));
+    auto* call_result = create<ast::Variable>(Source{}, "sampler_result",
+                                              ast::StorageClass::kFunction,
+                                              vec_type(base_type, 4));
     body->append(create<ast::VariableDeclStatement>(call_result));
 
     ast::ExpressionList call_params;
@@ -565,8 +567,9 @@
 
     auto* body = create<ast::BlockStatement>();
 
-    auto* call_result = create<ast::Variable>(
-        "sampler_result", ast::StorageClass::kFunction, vec_type(base_type, 4));
+    auto* call_result = create<ast::Variable>(Source{}, "sampler_result",
+                                              ast::StorageClass::kFunction,
+                                              vec_type(base_type, 4));
     body->append(create<ast::VariableDeclStatement>(call_result));
 
     ast::ExpressionList call_params;
@@ -608,7 +611,7 @@
     auto* body = create<ast::BlockStatement>();
 
     auto* call_result = create<ast::Variable>(
-        "sampler_result", ast::StorageClass::kFunction, base_type);
+        Source{}, "sampler_result", ast::StorageClass::kFunction, base_type);
     body->append(create<ast::VariableDeclStatement>(call_result));
 
     ast::ExpressionList call_params;
diff --git a/src/reader/spirv/function.cc b/src/reader/spirv/function.cc
index ee09c41..03be176 100644
--- a/src/reader/spirv/function.cc
+++ b/src/reader/spirv/function.cc
@@ -2094,8 +2094,9 @@
   const std::string guard_name = block_info.flow_guard_name;
   if (!guard_name.empty()) {
     // Declare the guard variable just before the "if", initialized to true.
-    auto* guard_var = create<ast::Variable>(
-        guard_name, ast::StorageClass::kFunction, parser_impl_.Bool());
+    auto* guard_var = create<ast::Variable>(Source{}, guard_name,
+                                            ast::StorageClass::kFunction,
+                                            parser_impl_.Bool());
     guard_var->set_constructor(MakeTrue());
     auto* guard_decl = create<ast::VariableDeclStatement>(guard_var);
     AddStatement(guard_decl);
@@ -2637,9 +2638,9 @@
     assert(def_inst);
     const auto phi_var_name = GetDefInfo(id)->phi_var;
     assert(!phi_var_name.empty());
-    auto* var =
-        create<ast::Variable>(phi_var_name, ast::StorageClass::kFunction,
-                              parser_impl_.ConvertType(def_inst->type_id()));
+    auto* var = create<ast::Variable>(
+        Source{}, phi_var_name, ast::StorageClass::kFunction,
+        parser_impl_.ConvertType(def_inst->type_id()));
     AddStatement(create<ast::VariableDeclStatement>(var));
   }
 
diff --git a/src/reader/spirv/parser_impl.cc b/src/reader/spirv/parser_impl.cc
index b0c01a9..202293d 100644
--- a/src/reader/spirv/parser_impl.cc
+++ b/src/reader/spirv/parser_impl.cc
@@ -1171,7 +1171,7 @@
     type = ast_module_.create<ast::type::AccessControl>(access, type);
   }
 
-  auto* ast_var = create<ast::Variable>(namer_.Name(id), sc, type);
+  auto* ast_var = create<ast::Variable>(Source{}, namer_.Name(id), sc, type);
 
   ast::VariableDecorationList ast_decorations;
   for (auto& deco : GetDecorationsFor(id)) {
diff --git a/src/scope_stack_test.cc b/src/scope_stack_test.cc
index f1d8153..55ecb5d 100644
--- a/src/scope_stack_test.cc
+++ b/src/scope_stack_test.cc
@@ -33,7 +33,7 @@
 
 TEST_F(ScopeStackTest, Global_SetWithPointer) {
   ast::type::F32 f32;
-  ast::Variable v("test", ast::StorageClass::kNone, &f32);
+  ast::Variable v(Source{}, "test", ast::StorageClass::kNone, &f32);
   v.set_name("my_var");
 
   ScopeStack<ast::Variable*> s;
diff --git a/src/transform/emit_vertex_point_size.cc b/src/transform/emit_vertex_point_size.cc
index 32ac992..7d69cb5 100644
--- a/src/transform/emit_vertex_point_size.cc
+++ b/src/transform/emit_vertex_point_size.cc
@@ -52,7 +52,7 @@
   // Declare the pointsize builtin output variable.
   auto* pointsize_var =
       mod->create<ast::DecoratedVariable>(mod->create<ast::Variable>(
-          kPointSizeVar, ast::StorageClass::kOutput, f32));
+          Source{}, kPointSizeVar, ast::StorageClass::kOutput, f32));
   pointsize_var->set_decorations({
       mod->create<ast::BuiltinDecoration>(ast::Builtin::kPointSize, Source{}),
   });
diff --git a/src/transform/vertex_pulling.cc b/src/transform/vertex_pulling.cc
index 4e71303..5614ba4 100644
--- a/src/transform/vertex_pulling.cc
+++ b/src/transform/vertex_pulling.cc
@@ -159,7 +159,7 @@
   vertex_index_name = kDefaultVertexIndexName;
 
   auto* var = mod->create<ast::DecoratedVariable>(mod->create<ast::Variable>(
-      vertex_index_name, ast::StorageClass::kInput, GetI32Type()));
+      Source{}, vertex_index_name, ast::StorageClass::kInput, GetI32Type()));
 
   ast::VariableDecorationList decorations;
   decorations.push_back(
@@ -203,7 +203,7 @@
   instance_index_name = kDefaultInstanceIndexName;
 
   auto* var = mod->create<ast::DecoratedVariable>(mod->create<ast::Variable>(
-      instance_index_name, ast::StorageClass::kInput, GetI32Type()));
+      Source{}, instance_index_name, ast::StorageClass::kInput, GetI32Type()));
 
   ast::VariableDecorationList decorations;
   decorations.push_back(mod->create<ast::BuiltinDecoration>(
@@ -226,8 +226,8 @@
           // This is where the replacement happens. Expressions use identifier
           // strings instead of pointers, so we don't need to update any other
           // place in the AST.
-          v = mod->create<ast::Variable>(v->name(), ast::StorageClass::kPrivate,
-                                         v->type());
+          v = mod->create<ast::Variable>(
+              Source{}, v->name(), ast::StorageClass::kPrivate, v->type());
           location_to_var[location] = v;
           break;
         }
@@ -265,7 +265,7 @@
   for (uint32_t i = 0; i < cfg.vertex_state.size(); ++i) {
     // The decorated variable with struct type
     auto* var = mod->create<ast::DecoratedVariable>(mod->create<ast::Variable>(
-        GetVertexBufferName(i), ast::StorageClass::kStorageBuffer,
+        Source{}, GetVertexBufferName(i), ast::StorageClass::kStorageBuffer,
         struct_type));
 
     // Add decorations
@@ -289,9 +289,9 @@
   auto* block = mod->create<ast::BlockStatement>();
 
   // Declare the |kPullingPosVarName| variable in the shader
-  auto* pos_declaration =
-      mod->create<ast::VariableDeclStatement>(mod->create<ast::Variable>(
-          kPullingPosVarName, ast::StorageClass::kFunction, GetI32Type()));
+  auto* pos_declaration = mod->create<ast::VariableDeclStatement>(
+      mod->create<ast::Variable>(Source{}, kPullingPosVarName,
+                                 ast::StorageClass::kFunction, GetI32Type()));
 
   // |kPullingPosVarName| refers to the byte location of the current read. We
   // declare a variable in the shader to avoid having to reuse Expression
diff --git a/src/transform/vertex_pulling_test.cc b/src/transform/vertex_pulling_test.cc
index a2eb2c9..820d1e0 100644
--- a/src/transform/vertex_pulling_test.cc
+++ b/src/transform/vertex_pulling_test.cc
@@ -70,7 +70,7 @@
                               std::string name,
                               ast::type::Type* type) {
     auto* var = create<ast::DecoratedVariable>(
-        create<ast::Variable>(name, ast::StorageClass::kInput, type));
+        create<ast::Variable>(Source{}, name, ast::StorageClass::kInput, type));
 
     ast::VariableDecorationList decorations;
     decorations.push_back(create<ast::LocationDecoration>(location, Source{}));
@@ -419,7 +419,7 @@
   {
     auto* vertex_index_var =
         create<ast::DecoratedVariable>(create<ast::Variable>(
-            "custom_vertex_index", ast::StorageClass::kInput, &i32));
+            Source{}, "custom_vertex_index", ast::StorageClass::kInput, &i32));
 
     ast::VariableDecorationList decorations;
     decorations.push_back(
@@ -430,9 +430,9 @@
   }
 
   {
-    auto* instance_index_var =
-        create<ast::DecoratedVariable>(create<ast::Variable>(
-            "custom_instance_index", ast::StorageClass::kInput, &i32));
+    auto* instance_index_var = create<ast::DecoratedVariable>(
+        create<ast::Variable>(Source{}, "custom_instance_index",
+                              ast::StorageClass::kInput, &i32));
 
     ast::VariableDecorationList decorations;
     decorations.push_back(
diff --git a/src/type_determiner_test.cc b/src/type_determiner_test.cc
index 8af4a49..f9a21ad 100644
--- a/src/type_determiner_test.cc
+++ b/src/type_determiner_test.cc
@@ -389,7 +389,8 @@
 
 TEST_F(TypeDeterminerTest, Stmt_VariableDecl) {
   ast::type::I32 i32;
-  auto* var = create<ast::Variable>("my_var", ast::StorageClass::kNone, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "my_var", ast::StorageClass::kNone, &i32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&i32, 2)));
   auto* init = var->constructor();
@@ -403,7 +404,8 @@
 
 TEST_F(TypeDeterminerTest, Stmt_VariableDecl_ModuleScope) {
   ast::type::I32 i32;
-  auto* var = create<ast::Variable>("my_var", ast::StorageClass::kNone, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "my_var", ast::StorageClass::kNone, &i32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&i32, 2)));
   auto* init = var->constructor();
@@ -430,8 +432,8 @@
 
   auto* idx = create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&i32, 2));
-  auto* var =
-      create<ast::Variable>("my_var", ast::StorageClass::kFunction, &ary);
+  auto* var = create<ast::Variable>(Source{}, "my_var",
+                                    ast::StorageClass::kFunction, &ary);
   mod->AddGlobalVariable(var);
 
   // Register the global
@@ -455,8 +457,8 @@
 
   auto* idx = create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&i32, 2));
-  auto* var =
-      create<ast::Variable>("my_var", ast::StorageClass::kFunction, &aary);
+  auto* var = create<ast::Variable>(Source{}, "my_var",
+                                    ast::StorageClass::kFunction, &aary);
   mod->AddGlobalVariable(var);
 
   // Register the global
@@ -479,8 +481,8 @@
 
   auto* idx = create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&i32, 2));
-  auto* var =
-      create<ast::Variable>("my_var", ast::StorageClass::kFunction, &ary);
+  auto* var = create<ast::Variable>(Source{}, "my_var",
+                                    ast::StorageClass::kFunction, &ary);
   var->set_is_const(true);
   mod->AddGlobalVariable(var);
 
@@ -502,7 +504,8 @@
 
   auto* idx = create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&i32, 2));
-  auto* var = create<ast::Variable>("my_var", ast::StorageClass::kNone, &mat);
+  auto* var =
+      create<ast::Variable>(Source{}, "my_var", ast::StorageClass::kNone, &mat);
   mod->AddGlobalVariable(var);
 
   // Register the global
@@ -528,7 +531,8 @@
       create<ast::SintLiteral>(&i32, 2));
   auto* idx2 = create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&i32, 1));
-  auto* var = create<ast::Variable>("my_var", ast::StorageClass::kNone, &mat);
+  auto* var =
+      create<ast::Variable>(Source{}, "my_var", ast::StorageClass::kNone, &mat);
   mod->AddGlobalVariable(var);
 
   // Register the global
@@ -554,7 +558,8 @@
 
   auto* idx = create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&i32, 2));
-  auto* var = create<ast::Variable>("my_var", ast::StorageClass::kNone, &vec);
+  auto* var =
+      create<ast::Variable>(Source{}, "my_var", ast::StorageClass::kNone, &vec);
   mod->AddGlobalVariable(var);
 
   // Register the global
@@ -575,7 +580,7 @@
   ast::BitcastExpression bitcast(&f32,
                                  create<ast::IdentifierExpression>("name"));
 
-  ast::Variable v("name", ast::StorageClass::kPrivate, &f32);
+  ast::Variable v(Source{}, "name", ast::StorageClass::kPrivate, &f32);
   td()->RegisterVariableForTesting(&v);
 
   EXPECT_TRUE(td()->DetermineResultType(&bitcast));
@@ -653,7 +658,7 @@
   params.push_back(create<ast::IdentifierExpression>("name"));
   ast::TypeConstructorExpression cast(&f32, params);
 
-  ast::Variable v("name", ast::StorageClass::kPrivate, &f32);
+  ast::Variable v(Source{}, "name", ast::StorageClass::kPrivate, &f32);
   td()->RegisterVariableForTesting(&v);
 
   EXPECT_TRUE(td()->DetermineResultType(&cast));
@@ -694,7 +699,8 @@
 
 TEST_F(TypeDeterminerTest, Expr_Identifier_GlobalVariable) {
   ast::type::F32 f32;
-  auto* var = create<ast::Variable>("my_var", ast::StorageClass::kNone, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "my_var", ast::StorageClass::kNone, &f32);
   mod->AddGlobalVariable(var);
 
   // Register the global
@@ -712,7 +718,8 @@
 
 TEST_F(TypeDeterminerTest, Expr_Identifier_GlobalConstant) {
   ast::type::F32 f32;
-  auto* var = create<ast::Variable>("my_var", ast::StorageClass::kNone, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "my_var", ast::StorageClass::kNone, &f32);
   var->set_is_const(true);
   mod->AddGlobalVariable(var);
 
@@ -730,7 +737,8 @@
 
   auto* my_var = create<ast::IdentifierExpression>("my_var");
 
-  auto* var = create<ast::Variable>("my_var", ast::StorageClass::kNone, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "my_var", ast::StorageClass::kNone, &f32);
   var->set_is_const(true);
 
   auto* body = create<ast::BlockStatement>();
@@ -753,8 +761,8 @@
   auto* my_var = create<ast::IdentifierExpression>("my_var");
 
   auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(
-      create<ast::Variable>("my_var", ast::StorageClass::kNone, &f32)));
+  body->append(create<ast::VariableDeclStatement>(create<ast::Variable>(
+      Source{}, "my_var", ast::StorageClass::kNone, &f32)));
 
   body->append(create<ast::AssignmentStatement>(
       my_var, create<ast::IdentifierExpression>("my_var")));
@@ -779,8 +787,8 @@
   auto* my_var = create<ast::IdentifierExpression>("my_var");
 
   auto* body = create<ast::BlockStatement>();
-  body->append(create<ast::VariableDeclStatement>(
-      create<ast::Variable>("my_var", ast::StorageClass::kNone, &ptr)));
+  body->append(create<ast::VariableDeclStatement>(create<ast::Variable>(
+      Source{}, "my_var", ast::StorageClass::kNone, &ptr)));
 
   body->append(create<ast::AssignmentStatement>(
       my_var, create<ast::IdentifierExpression>("my_var")));
@@ -824,16 +832,16 @@
 TEST_F(TypeDeterminerTest, Function_RegisterInputOutputVariables) {
   ast::type::F32 f32;
 
-  auto* in_var =
-      create<ast::Variable>("in_var", ast::StorageClass::kInput, &f32);
-  auto* out_var =
-      create<ast::Variable>("out_var", ast::StorageClass::kOutput, &f32);
-  auto* sb_var =
-      create<ast::Variable>("sb_var", ast::StorageClass::kStorageBuffer, &f32);
-  auto* wg_var =
-      create<ast::Variable>("wg_var", ast::StorageClass::kWorkgroup, &f32);
-  auto* priv_var =
-      create<ast::Variable>("priv_var", ast::StorageClass::kPrivate, &f32);
+  auto* in_var = create<ast::Variable>(Source{}, "in_var",
+                                       ast::StorageClass::kInput, &f32);
+  auto* out_var = create<ast::Variable>(Source{}, "out_var",
+                                        ast::StorageClass::kOutput, &f32);
+  auto* sb_var = create<ast::Variable>(Source{}, "sb_var",
+                                       ast::StorageClass::kStorageBuffer, &f32);
+  auto* wg_var = create<ast::Variable>(Source{}, "wg_var",
+                                       ast::StorageClass::kWorkgroup, &f32);
+  auto* priv_var = create<ast::Variable>(Source{}, "priv_var",
+                                         ast::StorageClass::kPrivate, &f32);
 
   mod->AddGlobalVariable(in_var);
   mod->AddGlobalVariable(out_var);
@@ -875,16 +883,16 @@
 TEST_F(TypeDeterminerTest, Function_RegisterInputOutputVariables_SubFunction) {
   ast::type::F32 f32;
 
-  auto* in_var =
-      create<ast::Variable>("in_var", ast::StorageClass::kInput, &f32);
-  auto* out_var =
-      create<ast::Variable>("out_var", ast::StorageClass::kOutput, &f32);
-  auto* sb_var =
-      create<ast::Variable>("sb_var", ast::StorageClass::kStorageBuffer, &f32);
-  auto* wg_var =
-      create<ast::Variable>("wg_var", ast::StorageClass::kWorkgroup, &f32);
-  auto* priv_var =
-      create<ast::Variable>("priv_var", ast::StorageClass::kPrivate, &f32);
+  auto* in_var = create<ast::Variable>(Source{}, "in_var",
+                                       ast::StorageClass::kInput, &f32);
+  auto* out_var = create<ast::Variable>(Source{}, "out_var",
+                                        ast::StorageClass::kOutput, &f32);
+  auto* sb_var = create<ast::Variable>(Source{}, "sb_var",
+                                       ast::StorageClass::kStorageBuffer, &f32);
+  auto* wg_var = create<ast::Variable>(Source{}, "wg_var",
+                                       ast::StorageClass::kWorkgroup, &f32);
+  auto* priv_var = create<ast::Variable>(Source{}, "priv_var",
+                                         ast::StorageClass::kPrivate, &f32);
 
   mod->AddGlobalVariable(in_var);
   mod->AddGlobalVariable(out_var);
@@ -936,8 +944,8 @@
 TEST_F(TypeDeterminerTest, Function_NotRegisterFunctionVariable) {
   ast::type::F32 f32;
 
-  auto* var =
-      create<ast::Variable>("in_var", ast::StorageClass::kFunction, &f32);
+  auto* var = create<ast::Variable>(Source{}, "in_var",
+                                    ast::StorageClass::kFunction, &f32);
 
   auto* body = create<ast::BlockStatement>();
   body->append(create<ast::VariableDeclStatement>(var));
@@ -952,7 +960,7 @@
 
   mod->AddFunction(func);
 
-  ast::Variable v("var", ast::StorageClass::kFunction, &f32);
+  ast::Variable v(Source{}, "var", ast::StorageClass::kFunction, &f32);
   td()->RegisterVariableForTesting(&v);
 
   // Register the function
@@ -974,7 +982,8 @@
 
   ast::type::Struct st("S", strct);
 
-  auto* var = create<ast::Variable>("my_struct", ast::StorageClass::kNone, &st);
+  auto* var = create<ast::Variable>(Source{}, "my_struct",
+                                    ast::StorageClass::kNone, &st);
 
   mod->AddGlobalVariable(var);
 
@@ -1007,8 +1016,8 @@
   auto st = std::make_unique<ast::type::Struct>("alias", strct);
   ast::type::Alias alias("alias", st.get());
 
-  auto* var =
-      create<ast::Variable>("my_struct", ast::StorageClass::kNone, &alias);
+  auto* var = create<ast::Variable>(Source{}, "my_struct",
+                                    ast::StorageClass::kNone, &alias);
 
   mod->AddGlobalVariable(var);
 
@@ -1031,7 +1040,8 @@
   ast::type::F32 f32;
   ast::type::Vector vec3(&f32, 3);
 
-  auto* var = create<ast::Variable>("my_vec", ast::StorageClass::kNone, &vec3);
+  auto* var = create<ast::Variable>(Source{}, "my_vec",
+                                    ast::StorageClass::kNone, &vec3);
   mod->AddGlobalVariable(var);
 
   // Register the global
@@ -1053,7 +1063,8 @@
   ast::type::F32 f32;
   ast::type::Vector vec3(&f32, 3);
 
-  auto* var = create<ast::Variable>("my_vec", ast::StorageClass::kNone, &vec3);
+  auto* var = create<ast::Variable>(Source{}, "my_vec",
+                                    ast::StorageClass::kNone, &vec3);
   mod->AddGlobalVariable(var);
 
   // Register the global
@@ -1117,7 +1128,8 @@
 
   ast::type::Struct stA("A", strctA);
 
-  auto* var = create<ast::Variable>("c", ast::StorageClass::kNone, &stA);
+  auto* var =
+      create<ast::Variable>(Source{}, "c", ast::StorageClass::kNone, &stA);
   mod->AddGlobalVariable(var);
 
   // Register the global
@@ -1151,7 +1163,8 @@
 
   ast::type::I32 i32;
 
-  auto* var = create<ast::Variable>("val", ast::StorageClass::kNone, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "val", ast::StorageClass::kNone, &i32);
   mod->AddGlobalVariable(var);
 
   // Register the global
@@ -1171,7 +1184,8 @@
   ast::type::I32 i32;
   ast::type::Vector vec3(&i32, 3);
 
-  auto* var = create<ast::Variable>("val", ast::StorageClass::kNone, &vec3);
+  auto* var =
+      create<ast::Variable>(Source{}, "val", ast::StorageClass::kNone, &vec3);
   mod->AddGlobalVariable(var);
 
   // Register the global
@@ -1207,8 +1221,8 @@
 
   ast::type::Bool bool_type;
 
-  auto* var =
-      create<ast::Variable>("val", ast::StorageClass::kNone, &bool_type);
+  auto* var = create<ast::Variable>(Source{}, "val", ast::StorageClass::kNone,
+                                    &bool_type);
   mod->AddGlobalVariable(var);
 
   // Register the global
@@ -1228,7 +1242,8 @@
   ast::type::Bool bool_type;
   ast::type::Vector vec3(&bool_type, 3);
 
-  auto* var = create<ast::Variable>("val", ast::StorageClass::kNone, &vec3);
+  auto* var =
+      create<ast::Variable>(Source{}, "val", ast::StorageClass::kNone, &vec3);
   mod->AddGlobalVariable(var);
 
   // Register the global
@@ -1257,7 +1272,8 @@
 
   ast::type::I32 i32;
 
-  auto* var = create<ast::Variable>("val", ast::StorageClass::kNone, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "val", ast::StorageClass::kNone, &i32);
   mod->AddGlobalVariable(var);
 
   // Register the global
@@ -1277,7 +1293,8 @@
   ast::type::I32 i32;
   ast::type::Vector vec3(&i32, 3);
 
-  auto* var = create<ast::Variable>("val", ast::StorageClass::kNone, &vec3);
+  auto* var =
+      create<ast::Variable>(Source{}, "val", ast::StorageClass::kNone, &vec3);
   mod->AddGlobalVariable(var);
 
   // Register the global
@@ -1307,7 +1324,8 @@
 TEST_F(TypeDeterminerTest, Expr_Binary_Multiply_Scalar_Scalar) {
   ast::type::I32 i32;
 
-  auto* var = create<ast::Variable>("val", ast::StorageClass::kNone, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "val", ast::StorageClass::kNone, &i32);
   mod->AddGlobalVariable(var);
 
   // Register the global
@@ -1327,9 +1345,9 @@
   ast::type::Vector vec3(&f32, 3);
 
   auto* scalar =
-      create<ast::Variable>("scalar", ast::StorageClass::kNone, &f32);
-  auto* vector =
-      create<ast::Variable>("vector", ast::StorageClass::kNone, &vec3);
+      create<ast::Variable>(Source{}, "scalar", ast::StorageClass::kNone, &f32);
+  auto* vector = create<ast::Variable>(Source{}, "vector",
+                                       ast::StorageClass::kNone, &vec3);
   mod->AddGlobalVariable(scalar);
   mod->AddGlobalVariable(vector);
 
@@ -1355,9 +1373,9 @@
   ast::type::Vector vec3(&f32, 3);
 
   auto* scalar =
-      create<ast::Variable>("scalar", ast::StorageClass::kNone, &f32);
-  auto* vector =
-      create<ast::Variable>("vector", ast::StorageClass::kNone, &vec3);
+      create<ast::Variable>(Source{}, "scalar", ast::StorageClass::kNone, &f32);
+  auto* vector = create<ast::Variable>(Source{}, "vector",
+                                       ast::StorageClass::kNone, &vec3);
   mod->AddGlobalVariable(scalar);
   mod->AddGlobalVariable(vector);
 
@@ -1382,8 +1400,8 @@
   ast::type::F32 f32;
   ast::type::Vector vec3(&f32, 3);
 
-  auto* vector =
-      create<ast::Variable>("vector", ast::StorageClass::kNone, &vec3);
+  auto* vector = create<ast::Variable>(Source{}, "vector",
+                                       ast::StorageClass::kNone, &vec3);
   mod->AddGlobalVariable(vector);
 
   // Register the global
@@ -1408,9 +1426,9 @@
   ast::type::Matrix mat3x2(&f32, 3, 2);
 
   auto* scalar =
-      create<ast::Variable>("scalar", ast::StorageClass::kNone, &f32);
-  auto* matrix =
-      create<ast::Variable>("matrix", ast::StorageClass::kNone, &mat3x2);
+      create<ast::Variable>(Source{}, "scalar", ast::StorageClass::kNone, &f32);
+  auto* matrix = create<ast::Variable>(Source{}, "matrix",
+                                       ast::StorageClass::kNone, &mat3x2);
   mod->AddGlobalVariable(scalar);
   mod->AddGlobalVariable(matrix);
 
@@ -1436,9 +1454,9 @@
   ast::type::Matrix mat3x2(&f32, 3, 2);
 
   auto* scalar =
-      create<ast::Variable>("scalar", ast::StorageClass::kNone, &f32);
-  auto* matrix =
-      create<ast::Variable>("matrix", ast::StorageClass::kNone, &mat3x2);
+      create<ast::Variable>(Source{}, "scalar", ast::StorageClass::kNone, &f32);
+  auto* matrix = create<ast::Variable>(Source{}, "matrix",
+                                       ast::StorageClass::kNone, &mat3x2);
   mod->AddGlobalVariable(scalar);
   mod->AddGlobalVariable(matrix);
 
@@ -1464,10 +1482,10 @@
   ast::type::Vector vec3(&f32, 2);
   ast::type::Matrix mat3x2(&f32, 3, 2);
 
-  auto* vector =
-      create<ast::Variable>("vector", ast::StorageClass::kNone, &vec3);
-  auto* matrix =
-      create<ast::Variable>("matrix", ast::StorageClass::kNone, &mat3x2);
+  auto* vector = create<ast::Variable>(Source{}, "vector",
+                                       ast::StorageClass::kNone, &vec3);
+  auto* matrix = create<ast::Variable>(Source{}, "matrix",
+                                       ast::StorageClass::kNone, &mat3x2);
   mod->AddGlobalVariable(vector);
   mod->AddGlobalVariable(matrix);
 
@@ -1493,10 +1511,10 @@
   ast::type::Vector vec3(&f32, 3);
   ast::type::Matrix mat3x2(&f32, 3, 2);
 
-  auto* vector =
-      create<ast::Variable>("vector", ast::StorageClass::kNone, &vec3);
-  auto* matrix =
-      create<ast::Variable>("matrix", ast::StorageClass::kNone, &mat3x2);
+  auto* vector = create<ast::Variable>(Source{}, "vector",
+                                       ast::StorageClass::kNone, &vec3);
+  auto* matrix = create<ast::Variable>(Source{}, "matrix",
+                                       ast::StorageClass::kNone, &mat3x2);
   mod->AddGlobalVariable(vector);
   mod->AddGlobalVariable(matrix);
 
@@ -1522,10 +1540,10 @@
   ast::type::Matrix mat4x3(&f32, 4, 3);
   ast::type::Matrix mat3x4(&f32, 3, 4);
 
-  auto* matrix1 =
-      create<ast::Variable>("mat4x3", ast::StorageClass::kNone, &mat4x3);
-  auto* matrix2 =
-      create<ast::Variable>("mat3x4", ast::StorageClass::kNone, &mat3x4);
+  auto* matrix1 = create<ast::Variable>(Source{}, "mat4x3",
+                                        ast::StorageClass::kNone, &mat4x3);
+  auto* matrix2 = create<ast::Variable>(Source{}, "mat3x4",
+                                        ast::StorageClass::kNone, &mat3x4);
   mod->AddGlobalVariable(matrix1);
   mod->AddGlobalVariable(matrix2);
 
@@ -1552,7 +1570,8 @@
 
   ast::type::F32 f32;
 
-  auto* var = create<ast::Variable>("ident", ast::StorageClass::kNone, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "ident", ast::StorageClass::kNone, &f32);
   mod->AddGlobalVariable(var);
 
   // Register the global
@@ -1575,7 +1594,8 @@
   ast::type::F32 f32;
   ast::type::Vector vec4(&f32, 4);
 
-  auto* var = create<ast::Variable>("ident", ast::StorageClass::kNone, &vec4);
+  auto* var =
+      create<ast::Variable>(Source{}, "ident", ast::StorageClass::kNone, &vec4);
   mod->AddGlobalVariable(var);
 
   // Register the global
@@ -1619,8 +1639,10 @@
   ast::type::F32 f32;
   ast::type::Vector vec4(&f32, 4);
 
-  auto* var1 = create<ast::Variable>("ident1", ast::StorageClass::kNone, &vec4);
-  auto* var2 = create<ast::Variable>("ident2", ast::StorageClass::kNone, &vec4);
+  auto* var1 = create<ast::Variable>(Source{}, "ident1",
+                                     ast::StorageClass::kNone, &vec4);
+  auto* var2 = create<ast::Variable>(Source{}, "ident2",
+                                     ast::StorageClass::kNone, &vec4);
   mod->AddGlobalVariable(var1);
   mod->AddGlobalVariable(var2);
 
@@ -1655,7 +1677,8 @@
   ast::type::Bool bool_type;
   ast::type::Vector vec3(&bool_type, 3);
 
-  auto* var = create<ast::Variable>("my_var", ast::StorageClass::kNone, &vec3);
+  auto* var = create<ast::Variable>(Source{}, "my_var",
+                                    ast::StorageClass::kNone, &vec3);
   mod->AddGlobalVariable(var);
 
   ast::ExpressionList call_params;
@@ -1682,7 +1705,8 @@
   ast::type::F32 f32;
   ast::type::Vector vec3(&f32, 3);
 
-  auto* var = create<ast::Variable>("my_var", ast::StorageClass::kNone, &vec3);
+  auto* var = create<ast::Variable>(Source{}, "my_var",
+                                    ast::StorageClass::kNone, &vec3);
   mod->AddGlobalVariable(var);
 
   ast::ExpressionList call_params;
@@ -1709,7 +1733,8 @@
 
   ast::type::F32 f32;
 
-  auto* var = create<ast::Variable>("my_var", ast::StorageClass::kNone, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "my_var", ast::StorageClass::kNone, &f32);
   mod->AddGlobalVariable(var);
 
   ast::ExpressionList call_params;
@@ -1730,7 +1755,8 @@
 
   ast::type::F32 f32;
 
-  auto* var = create<ast::Variable>("my_var", ast::StorageClass::kNone, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "my_var", ast::StorageClass::kNone, &f32);
   mod->AddGlobalVariable(var);
 
   ast::ExpressionList call_params;
@@ -1748,7 +1774,8 @@
 
   ast::type::F32 f32;
 
-  auto* var = create<ast::Variable>("my_var", ast::StorageClass::kNone, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "my_var", ast::StorageClass::kNone, &f32);
   mod->AddGlobalVariable(var);
 
   ast::ExpressionList call_params;
@@ -1817,7 +1844,8 @@
   void add_call_param(std::string name,
                       ast::type::Type* type,
                       ast::ExpressionList* call_params) {
-    auto* var = create<ast::Variable>(name, ast::StorageClass::kNone, type);
+    auto* var =
+        create<ast::Variable>(Source{}, name, ast::StorageClass::kNone, type);
     mod->AddGlobalVariable(var);
     call_params->push_back(create<ast::IdentifierExpression>(name));
   }
@@ -1969,7 +1997,8 @@
   ast::type::F32 f32;
   ast::type::Vector vec3(&f32, 3);
 
-  auto* var = create<ast::Variable>("my_var", ast::StorageClass::kNone, &vec3);
+  auto* var = create<ast::Variable>(Source{}, "my_var",
+                                    ast::StorageClass::kNone, &vec3);
   mod->AddGlobalVariable(var);
 
   ast::ExpressionList call_params;
@@ -1992,9 +2021,10 @@
   ast::type::Vector vec3(&f32, 3);
   ast::type::Vector bool_vec3(&bool_type, 3);
 
-  auto* var = create<ast::Variable>("my_var", ast::StorageClass::kNone, &vec3);
-  auto* bool_var =
-      create<ast::Variable>("bool_var", ast::StorageClass::kNone, &bool_vec3);
+  auto* var = create<ast::Variable>(Source{}, "my_var",
+                                    ast::StorageClass::kNone, &vec3);
+  auto* bool_var = create<ast::Variable>(Source{}, "bool_var",
+                                         ast::StorageClass::kNone, &bool_vec3);
   mod->AddGlobalVariable(var);
   mod->AddGlobalVariable(bool_var);
 
@@ -2022,7 +2052,8 @@
   ast::type::F32 f32;
   ast::type::Vector vec3(&f32, 3);
 
-  auto* var = create<ast::Variable>("v", ast::StorageClass::kNone, &vec3);
+  auto* var =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kNone, &vec3);
   mod->AddGlobalVariable(var);
 
   ast::ExpressionList call_params;
@@ -2042,7 +2073,8 @@
   ast::type::F32 f32;
   ast::type::Vector vec3(&f32, 3);
 
-  auto* var = create<ast::Variable>("v", ast::StorageClass::kNone, &vec3);
+  auto* var =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kNone, &vec3);
   mod->AddGlobalVariable(var);
 
   ast::ExpressionList call_params;
@@ -2066,8 +2098,10 @@
   ast::type::Vector vec3(&f32, 3);
   ast::type::Vector vec2(&f32, 2);
 
-  auto* var1 = create<ast::Variable>("v3", ast::StorageClass::kNone, &vec3);
-  auto* var2 = create<ast::Variable>("v2", ast::StorageClass::kNone, &vec2);
+  auto* var1 =
+      create<ast::Variable>(Source{}, "v3", ast::StorageClass::kNone, &vec3);
+  auto* var2 =
+      create<ast::Variable>(Source{}, "v2", ast::StorageClass::kNone, &vec2);
   mod->AddGlobalVariable(var1);
   mod->AddGlobalVariable(var2);
 
@@ -2096,7 +2130,8 @@
   ast::type::Vector vec3(&f32, 3);
   ast::type::Vector vec2(&f32, 2);
 
-  auto* var2 = create<ast::Variable>("v2", ast::StorageClass::kNone, &vec2);
+  auto* var2 =
+      create<ast::Variable>(Source{}, "v2", ast::StorageClass::kNone, &vec2);
   mod->AddGlobalVariable(var2);
 
   ast::ExpressionList call_params;
@@ -2116,7 +2151,8 @@
   ast::type::Vector vec3(&f32, 3);
   ast::type::Vector vec2(&f32, 2);
 
-  auto* var2 = create<ast::Variable>("v2", ast::StorageClass::kNone, &vec2);
+  auto* var2 =
+      create<ast::Variable>(Source{}, "v2", ast::StorageClass::kNone, &vec2);
   mod->AddGlobalVariable(var2);
 
   ast::ExpressionList call_params;
@@ -2141,7 +2177,8 @@
 
   ast::type::Vector vec4(&f32, 4);
 
-  auto* var = create<ast::Variable>("ident", ast::StorageClass::kNone, &vec4);
+  auto* var =
+      create<ast::Variable>(Source{}, "ident", ast::StorageClass::kNone, &vec4);
   mod->AddGlobalVariable(var);
 
   // Register the global
@@ -2163,7 +2200,8 @@
 TEST_F(TypeDeterminerTest, StorageClass_SetsIfMissing) {
   ast::type::I32 i32;
 
-  auto* var = create<ast::Variable>("var", ast::StorageClass::kNone, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "var", ast::StorageClass::kNone, &i32);
   auto* stmt = create<ast::VariableDeclStatement>(var);
 
   auto* body = create<ast::BlockStatement>();
@@ -2180,7 +2218,8 @@
 TEST_F(TypeDeterminerTest, StorageClass_DoesNotSetOnConst) {
   ast::type::I32 i32;
 
-  auto* var = create<ast::Variable>("var", ast::StorageClass::kNone, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "var", ast::StorageClass::kNone, &i32);
   var->set_is_const(true);
   auto* stmt = create<ast::VariableDeclStatement>(var);
 
@@ -2198,7 +2237,8 @@
 TEST_F(TypeDeterminerTest, StorageClass_NonFunctionClassError) {
   ast::type::I32 i32;
 
-  auto* var = create<ast::Variable>("var", ast::StorageClass::kWorkgroup, &i32);
+  auto* var = create<ast::Variable>(Source{}, "var",
+                                    ast::StorageClass::kWorkgroup, &i32);
   auto* stmt = create<ast::VariableDeclStatement>(var);
 
   auto* body = create<ast::BlockStatement>();
@@ -4255,7 +4295,8 @@
   ast::type::F32 f32;
   ast::type::Matrix mat(&f32, 3, 3);
 
-  auto* var = create<ast::Variable>("var", ast::StorageClass::kFunction, &mat);
+  auto* var = create<ast::Variable>(Source{}, "var",
+                                    ast::StorageClass::kFunction, &mat);
   mod->AddGlobalVariable(var);
 
   // Register the global
@@ -4280,7 +4321,8 @@
 
   ast::type::F32 f32;
 
-  auto* var = create<ast::Variable>("var", ast::StorageClass::kFunction, &f32);
+  auto* var = create<ast::Variable>(Source{}, "var",
+                                    ast::StorageClass::kFunction, &f32);
   mod->AddGlobalVariable(var);
 
   // Register the global
@@ -4316,7 +4358,8 @@
   ast::type::F32 f32;
   ast::type::Matrix mat(&f32, 3, 3);
 
-  auto* var = create<ast::Variable>("var", ast::StorageClass::kFunction, &mat);
+  auto* var = create<ast::Variable>(Source{}, "var",
+                                    ast::StorageClass::kFunction, &mat);
   mod->AddGlobalVariable(var);
 
   // Register the global
@@ -4406,16 +4449,16 @@
   mod->AddFunction(ep_1);
   mod->AddFunction(ep_2);
 
-  mod->AddGlobalVariable(
-      create<ast::Variable>("first", ast::StorageClass::kPrivate, &f32));
-  mod->AddGlobalVariable(
-      create<ast::Variable>("second", ast::StorageClass::kPrivate, &f32));
-  mod->AddGlobalVariable(
-      create<ast::Variable>("call_a", ast::StorageClass::kPrivate, &f32));
-  mod->AddGlobalVariable(
-      create<ast::Variable>("call_b", ast::StorageClass::kPrivate, &f32));
-  mod->AddGlobalVariable(
-      create<ast::Variable>("call_c", ast::StorageClass::kPrivate, &f32));
+  mod->AddGlobalVariable(create<ast::Variable>(
+      Source{}, "first", ast::StorageClass::kPrivate, &f32));
+  mod->AddGlobalVariable(create<ast::Variable>(
+      Source{}, "second", ast::StorageClass::kPrivate, &f32));
+  mod->AddGlobalVariable(create<ast::Variable>(
+      Source{}, "call_a", ast::StorageClass::kPrivate, &f32));
+  mod->AddGlobalVariable(create<ast::Variable>(
+      Source{}, "call_b", ast::StorageClass::kPrivate, &f32));
+  mod->AddGlobalVariable(create<ast::Variable>(
+      Source{}, "call_c", ast::StorageClass::kPrivate, &f32));
 
   // Register the functions and calculate the callers
   ASSERT_TRUE(td()->Determine()) << td()->error();
diff --git a/src/validator/validator_control_block_test.cc b/src/validator/validator_control_block_test.cc
index 7e4fef2..08f59b9 100644
--- a/src/validator/validator_control_block_test.cc
+++ b/src/validator/validator_control_block_test.cc
@@ -43,7 +43,8 @@
   //   default: {}
   // }
   ast::type::F32 f32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &f32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&f32, 3.14f)));
 
@@ -71,7 +72,8 @@
   //   case 1: {}
   // }
   ast::type::I32 i32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &i32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&i32, 2)));
 
@@ -102,7 +104,8 @@
   //   default: {}
   // }
   ast::type::I32 i32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &i32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&i32, 2)));
 
@@ -145,7 +148,8 @@
   // }
   ast::type::U32 u32;
   ast::type::I32 i32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &i32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&i32, 2)));
 
@@ -181,7 +185,8 @@
   // }
   ast::type::U32 u32;
   ast::type::I32 i32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &u32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &u32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::UintLiteral>(&u32, 2)));
 
@@ -216,7 +221,8 @@
   //   default: {}
   // }
   ast::type::U32 u32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &u32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &u32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::UintLiteral>(&u32, 3)));
 
@@ -257,7 +263,8 @@
   //   default: {}
   // }
   ast::type::I32 i32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &i32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&i32, 2)));
 
@@ -298,7 +305,8 @@
   //   default: { fallthrough; }
   // }
   ast::type::I32 i32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &i32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&i32, 2)));
 
@@ -328,7 +336,8 @@
   //   case 5: {}
   // }
   ast::type::I32 i32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &i32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&i32, 2)));
 
@@ -361,7 +370,8 @@
   ast::type::U32 u32;
   ast::type::Alias my_int{"MyInt", &u32};
 
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &my_int);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &my_int);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&u32, 2)));
 
diff --git a/src/validator/validator_function_test.cc b/src/validator/validator_function_test.cc
index c767789..4911941 100644
--- a/src/validator/validator_function_test.cc
+++ b/src/validator/validator_function_test.cc
@@ -39,7 +39,8 @@
   // [[stage(vertex)]]
   // fn func -> void { var a:i32 = 2; }
   ast::type::I32 i32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &i32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&i32, 2)));
 
@@ -80,7 +81,8 @@
   // fn func -> int { var a:i32 = 2; }
 
   ast::type::I32 i32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &i32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&i32, 2)));
 
@@ -237,7 +239,8 @@
 TEST_F(ValidateFunctionTest, RecursionIsNotAllowedExpr_Fail) {
   // fn func() -> i32 {var a: i32 = func(); return 2; }
   ast::type::I32 i32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &i32);
   ast::ExpressionList call_params;
   auto* call_expr = create<ast::CallExpression>(
       Source{Source::Location{12, 34}},
@@ -288,7 +291,8 @@
   ast::type::I32 i32;
   ast::type::Void void_type;
   ast::VariableList params;
-  params.push_back(create<ast::Variable>("a", ast::StorageClass::kNone, &i32));
+  params.push_back(
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &i32));
   auto* body = create<ast::BlockStatement>();
   body->append(create<ast::ReturnStatement>());
   auto* func = create<ast::Function>(
diff --git a/src/validator/validator_test.cc b/src/validator/validator_test.cc
index 6c5871b..49a8d2f 100644
--- a/src/validator/validator_test.cc
+++ b/src/validator/validator_test.cc
@@ -115,7 +115,8 @@
   // var a :i32 = 2;
   // a = 2
   ast::type::I32 i32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &i32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&i32, 2)));
 
@@ -139,7 +140,8 @@
   ast::type::F32 f32;
   ast::type::I32 i32;
 
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &i32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&i32, 2)));
   auto* lhs = create<ast::IdentifierExpression>("a");
@@ -165,7 +167,8 @@
   //  a = 2
   // }
   ast::type::I32 i32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &i32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&i32, 2)));
 
@@ -193,7 +196,8 @@
   ast::type::F32 f32;
   ast::type::I32 i32;
 
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &i32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&i32, 2)));
   auto* lhs = create<ast::IdentifierExpression>("a");
@@ -274,8 +278,8 @@
   //   not_global_var = 3.14f;
   // }
   ast::type::F32 f32;
-  auto* global_var =
-      create<ast::Variable>("global_var", ast::StorageClass::kPrivate, &f32);
+  auto* global_var = create<ast::Variable>(Source{}, "global_var",
+                                           ast::StorageClass::kPrivate, &f32);
   global_var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 2.1)));
   mod()->AddGlobalVariable(global_var);
@@ -307,8 +311,8 @@
   ast::type::F32 f32;
   ast::type::Void void_type;
 
-  auto* global_var =
-      create<ast::Variable>("global_var", ast::StorageClass::kPrivate, &f32);
+  auto* global_var = create<ast::Variable>(Source{}, "global_var",
+                                           ast::StorageClass::kPrivate, &f32);
   global_var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 2.1)));
   mod()->AddGlobalVariable(global_var);
@@ -340,7 +344,8 @@
   //   a = 3.14;
   // }
   ast::type::F32 f32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &f32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 2.0)));
 
@@ -374,7 +379,8 @@
   //   if (true) { a = 3.14; }
   // }
   ast::type::F32 f32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &f32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 2.0)));
 
@@ -405,8 +411,8 @@
   // var global_var1 : i32 = 0;
   ast::type::F32 f32;
   ast::type::I32 i32;
-  auto* var0 =
-      create<ast::Variable>("global_var0", ast::StorageClass::kPrivate, &f32);
+  auto* var0 = create<ast::Variable>(Source{}, "global_var0",
+                                     ast::StorageClass::kPrivate, &f32);
   var0->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 0.1)));
   mod()->AddGlobalVariable(var0);
@@ -427,8 +433,8 @@
   // var global_var : i32 = 0;
   ast::type::F32 f32;
   ast::type::I32 i32;
-  auto* var0 =
-      create<ast::Variable>("global_var", ast::StorageClass::kPrivate, &f32);
+  auto* var0 = create<ast::Variable>(Source{}, "global_var",
+                                     ast::StorageClass::kPrivate, &f32);
   var0->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 0.1)));
   mod()->AddGlobalVariable(var0);
@@ -451,7 +457,8 @@
   //  a = 2
   // }
   ast::type::I32 i32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &i32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&i32, 2)));
   var->set_is_const(true);
@@ -483,12 +490,13 @@
   ast::type::Void void_type;
   ast::type::F32 f32;
   auto* global_var =
-      create<ast::Variable>("a", ast::StorageClass::kPrivate, &f32);
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kPrivate, &f32);
   global_var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 2.1)));
   mod()->AddGlobalVariable(global_var);
 
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &f32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 2.0)));
   ast::VariableList params;
@@ -514,12 +522,13 @@
   ast::type::Void void_type;
   ast::type::I32 i32;
   ast::type::F32 f32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &i32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&i32, 2)));
 
   auto* var_a_float =
-      create<ast::Variable>("a", ast::StorageClass::kNone, &f32);
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &f32);
   var_a_float->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 0.1)));
 
@@ -545,7 +554,8 @@
   // var a : f32 = 3.14;
   // }
   ast::type::F32 f32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &f32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 2.0)));
 
@@ -556,7 +566,7 @@
   body->append(create<ast::VariableDeclStatement>(var));
 
   auto* var_a_float =
-      create<ast::Variable>("a", ast::StorageClass::kNone, &f32);
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &f32);
   var_a_float->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 3.14)));
 
@@ -579,11 +589,12 @@
   // }
   ast::type::F32 f32;
   auto* var_a_float =
-      create<ast::Variable>("a", ast::StorageClass::kNone, &f32);
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &f32);
   var_a_float->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 3.14)));
 
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &f32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 2.0)));
 
@@ -609,11 +620,13 @@
   // func1 { var a : f32 = 3.0; return; }
   ast::type::F32 f32;
   ast::type::Void void_type;
-  auto* var0 = create<ast::Variable>("a", ast::StorageClass::kNone, &f32);
+  auto* var0 =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &f32);
   var0->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 2.0)));
 
-  auto* var1 = create<ast::Variable>("a", ast::StorageClass::kNone, &void_type);
+  auto* var1 = create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone,
+                                     &void_type);
   var1->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 1.0)));
 
@@ -649,7 +662,8 @@
   // a = 2;
   // }
   ast::type::I32 i32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &i32);
 
   td()->RegisterVariableForTesting(var);
   auto* lhs = create<ast::IdentifierExpression>("a");
diff --git a/src/validator/validator_type_test.cc b/src/validator/validator_type_test.cc
index 48bbc33..fbec490 100644
--- a/src/validator/validator_type_test.cc
+++ b/src/validator/validator_type_test.cc
@@ -193,7 +193,8 @@
   ast::type::I32 i32;
   ast::type::Array array(&i32);
 
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &array);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &array);
   ast::VariableList params;
   ast::type::Void void_type;
   auto* body = create<ast::BlockStatement>();
diff --git a/src/writer/hlsl/generator_impl_binary_test.cc b/src/writer/hlsl/generator_impl_binary_test.cc
index 37bc11a..4dd592f 100644
--- a/src/writer/hlsl/generator_impl_binary_test.cc
+++ b/src/writer/hlsl/generator_impl_binary_test.cc
@@ -62,10 +62,10 @@
 
   auto params = GetParam();
 
-  auto* left_var =
-      create<ast::Variable>("left", ast::StorageClass::kFunction, &f32);
-  auto* right_var =
-      create<ast::Variable>("right", ast::StorageClass::kFunction, &f32);
+  auto* left_var = create<ast::Variable>(Source{}, "left",
+                                         ast::StorageClass::kFunction, &f32);
+  auto* right_var = create<ast::Variable>(Source{}, "right",
+                                          ast::StorageClass::kFunction, &f32);
 
   auto* left = create<ast::IdentifierExpression>("left");
   auto* right = create<ast::IdentifierExpression>("right");
@@ -84,10 +84,10 @@
 
   auto params = GetParam();
 
-  auto* left_var =
-      create<ast::Variable>("left", ast::StorageClass::kFunction, &u32);
-  auto* right_var =
-      create<ast::Variable>("right", ast::StorageClass::kFunction, &u32);
+  auto* left_var = create<ast::Variable>(Source{}, "left",
+                                         ast::StorageClass::kFunction, &u32);
+  auto* right_var = create<ast::Variable>(Source{}, "right",
+                                          ast::StorageClass::kFunction, &u32);
 
   auto* left = create<ast::IdentifierExpression>("left");
   auto* right = create<ast::IdentifierExpression>("right");
@@ -106,10 +106,10 @@
 
   auto params = GetParam();
 
-  auto* left_var =
-      create<ast::Variable>("left", ast::StorageClass::kFunction, &i32);
-  auto* right_var =
-      create<ast::Variable>("right", ast::StorageClass::kFunction, &i32);
+  auto* left_var = create<ast::Variable>(Source{}, "left",
+                                         ast::StorageClass::kFunction, &i32);
+  auto* right_var = create<ast::Variable>(Source{}, "right",
+                                          ast::StorageClass::kFunction, &i32);
 
   auto* left = create<ast::IdentifierExpression>("left");
   auto* right = create<ast::IdentifierExpression>("right");
@@ -199,7 +199,8 @@
   ast::type::F32 f32;
   ast::type::Matrix mat3(&f32, 3, 3);
 
-  auto* var = create<ast::Variable>("mat", ast::StorageClass::kFunction, &mat3);
+  auto* var = create<ast::Variable>(Source{}, "mat",
+                                    ast::StorageClass::kFunction, &mat3);
   auto* lhs = create<ast::IdentifierExpression>("mat");
   auto* rhs = create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 1.f));
@@ -217,7 +218,8 @@
   ast::type::F32 f32;
   ast::type::Matrix mat3(&f32, 3, 3);
 
-  auto* var = create<ast::Variable>("mat", ast::StorageClass::kFunction, &mat3);
+  auto* var = create<ast::Variable>(Source{}, "mat",
+                                    ast::StorageClass::kFunction, &mat3);
   auto* lhs = create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 1.f));
   auto* rhs = create<ast::IdentifierExpression>("mat");
@@ -236,7 +238,8 @@
   ast::type::Vector vec3(&f32, 3);
   ast::type::Matrix mat3(&f32, 3, 3);
 
-  auto* var = create<ast::Variable>("mat", ast::StorageClass::kFunction, &mat3);
+  auto* var = create<ast::Variable>(Source{}, "mat",
+                                    ast::StorageClass::kFunction, &mat3);
   auto* lhs = create<ast::IdentifierExpression>("mat");
 
   ast::ExpressionList vals;
@@ -262,7 +265,8 @@
   ast::type::Vector vec3(&f32, 3);
   ast::type::Matrix mat3(&f32, 3, 3);
 
-  auto* var = create<ast::Variable>("mat", ast::StorageClass::kFunction, &mat3);
+  auto* var = create<ast::Variable>(Source{}, "mat",
+                                    ast::StorageClass::kFunction, &mat3);
 
   ast::ExpressionList vals;
   vals.push_back(create<ast::ScalarConstructorExpression>(
@@ -289,7 +293,8 @@
   ast::type::Vector vec3(&f32, 3);
   ast::type::Matrix mat3(&f32, 3, 3);
 
-  auto* var = create<ast::Variable>("mat", ast::StorageClass::kFunction, &mat3);
+  auto* var = create<ast::Variable>(Source{}, "mat",
+                                    ast::StorageClass::kFunction, &mat3);
   auto* lhs = create<ast::IdentifierExpression>("mat");
   auto* rhs = create<ast::IdentifierExpression>("mat");
 
@@ -482,8 +487,8 @@
   auto* c = create<ast::IdentifierExpression>("c");
   auto* d = create<ast::IdentifierExpression>("d");
 
-  auto* var =
-      create<ast::Variable>("a", ast::StorageClass::kFunction, &bool_type);
+  auto* var = create<ast::Variable>(Source{}, "a", ast::StorageClass::kFunction,
+                                    &bool_type);
   var->set_constructor(create<ast::BinaryExpression>(
       ast::BinaryOp::kLogicalOr,
       create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, b, c), d));
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 38e5cfd..96b9044 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
@@ -53,11 +53,11 @@
   ast::type::I32 i32;
 
   auto* foo_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("foo", ast::StorageClass::kInput, &f32));
+      create<ast::Variable>(Source{}, "foo", ast::StorageClass::kInput, &f32));
   foo_var->set_decorations({create<ast::LocationDecoration>(0, Source{})});
 
   auto* bar_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("bar", ast::StorageClass::kInput, &i32));
+      create<ast::Variable>(Source{}, "bar", ast::StorageClass::kInput, &i32));
   bar_var->set_decorations({create<ast::LocationDecoration>(1, Source{})});
 
   td.RegisterVariableForTesting(foo_var);
@@ -109,11 +109,11 @@
   ast::type::I32 i32;
 
   auto* foo_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("foo", ast::StorageClass::kOutput, &f32));
+      create<ast::Variable>(Source{}, "foo", ast::StorageClass::kOutput, &f32));
   foo_var->set_decorations({create<ast::LocationDecoration>(0, Source{})});
 
   auto* bar_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("bar", ast::StorageClass::kOutput, &i32));
+      create<ast::Variable>(Source{}, "bar", ast::StorageClass::kOutput, &i32));
   bar_var->set_decorations({create<ast::LocationDecoration>(1, Source{})});
 
   td.RegisterVariableForTesting(foo_var);
@@ -166,11 +166,11 @@
   ast::type::I32 i32;
 
   auto* foo_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("foo", ast::StorageClass::kInput, &f32));
+      create<ast::Variable>(Source{}, "foo", ast::StorageClass::kInput, &f32));
   foo_var->set_decorations({create<ast::LocationDecoration>(0, Source{})});
 
   auto* bar_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("bar", ast::StorageClass::kInput, &i32));
+      create<ast::Variable>(Source{}, "bar", ast::StorageClass::kInput, &i32));
   bar_var->set_decorations({create<ast::LocationDecoration>(1, Source{})});
 
   td.RegisterVariableForTesting(foo_var);
@@ -223,11 +223,11 @@
   ast::type::I32 i32;
 
   auto* foo_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("foo", ast::StorageClass::kOutput, &f32));
+      create<ast::Variable>(Source{}, "foo", ast::StorageClass::kOutput, &f32));
   foo_var->set_decorations({create<ast::LocationDecoration>(0, Source{})});
 
   auto* bar_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("bar", ast::StorageClass::kOutput, &i32));
+      create<ast::Variable>(Source{}, "bar", ast::StorageClass::kOutput, &i32));
   bar_var->set_decorations({create<ast::LocationDecoration>(1, Source{})});
 
   td.RegisterVariableForTesting(foo_var);
@@ -276,14 +276,14 @@
   ast::type::I32 i32;
 
   auto* foo_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("foo", ast::StorageClass::kInput, &f32));
+      create<ast::Variable>(Source{}, "foo", ast::StorageClass::kInput, &f32));
 
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::LocationDecoration>(0, Source{}));
   foo_var->set_decorations(decos);
 
   auto* bar_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("bar", ast::StorageClass::kInput, &i32));
+      create<ast::Variable>(Source{}, "bar", ast::StorageClass::kInput, &i32));
   decos.push_back(create<ast::LocationDecoration>(1, Source{}));
   bar_var->set_decorations(decos);
 
@@ -328,14 +328,14 @@
   ast::type::I32 i32;
 
   auto* foo_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("foo", ast::StorageClass::kOutput, &f32));
+      create<ast::Variable>(Source{}, "foo", ast::StorageClass::kOutput, &f32));
 
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::LocationDecoration>(0, Source{}));
   foo_var->set_decorations(decos);
 
   auto* bar_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("bar", ast::StorageClass::kOutput, &i32));
+      create<ast::Variable>(Source{}, "bar", ast::StorageClass::kOutput, &i32));
   decos.push_back(create<ast::LocationDecoration>(1, Source{}));
   bar_var->set_decorations(decos);
 
@@ -386,13 +386,13 @@
   ast::type::Void void_type;
   ast::type::Vector vec4(&f32, 4);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("coord", ast::StorageClass::kInput, &vec4));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "coord", ast::StorageClass::kInput, &vec4));
   coord_var->set_decorations(
       {create<ast::BuiltinDecoration>(ast::Builtin::kFragCoord, Source{})});
 
-  auto* depth_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("depth", ast::StorageClass::kOutput, &f32));
+  auto* depth_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "depth", ast::StorageClass::kOutput, &f32));
   depth_var->set_decorations(
       {create<ast::BuiltinDecoration>(ast::Builtin::kFragDepth, Source{})});
 
diff --git a/src/writer/hlsl/generator_impl_function_test.cc b/src/writer/hlsl/generator_impl_function_test.cc
index c8ac19f..2f107ef 100644
--- a/src/writer/hlsl/generator_impl_function_test.cc
+++ b/src/writer/hlsl/generator_impl_function_test.cc
@@ -98,8 +98,10 @@
   ast::type::I32 i32;
 
   ast::VariableList params;
-  params.push_back(create<ast::Variable>("a", ast::StorageClass::kNone, &f32));
-  params.push_back(create<ast::Variable>("b", ast::StorageClass::kNone, &i32));
+  params.push_back(
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &f32));
+  params.push_back(
+      create<ast::Variable>(Source{}, "b", ast::StorageClass::kNone, &i32));
 
   ast::type::Void void_type;
 
@@ -125,11 +127,11 @@
   ast::type::F32 f32;
 
   auto* foo_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("foo", ast::StorageClass::kInput, &f32));
+      create<ast::Variable>(Source{}, "foo", ast::StorageClass::kInput, &f32));
   foo_var->set_decorations({create<ast::LocationDecoration>(0, Source{})});
 
   auto* bar_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("bar", ast::StorageClass::kOutput, &f32));
+      create<ast::Variable>(Source{}, "bar", ast::StorageClass::kOutput, &f32));
   bar_var->set_decorations({create<ast::LocationDecoration>(1, Source{})});
 
   td.RegisterVariableForTesting(foo_var);
@@ -177,14 +179,14 @@
   ast::type::F32 f32;
   ast::type::Vector vec4(&f32, 4);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("coord", ast::StorageClass::kInput, &vec4));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "coord", ast::StorageClass::kInput, &vec4));
 
   coord_var->set_decorations(
       {create<ast::BuiltinDecoration>(ast::Builtin::kFragCoord, Source{})});
 
-  auto* depth_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("depth", ast::StorageClass::kOutput, &f32));
+  auto* depth_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "depth", ast::StorageClass::kOutput, &f32));
   depth_var->set_decorations(
       {create<ast::BuiltinDecoration>(ast::Builtin::kFragDepth, Source{})});
 
@@ -235,8 +237,8 @@
   ast::type::F32 f32;
   ast::type::Vector vec4(&f32, 4);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("coord", ast::StorageClass::kUniform, &vec4));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "coord", ast::StorageClass::kUniform, &vec4));
 
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::BindingDecoration>(0, Source{}));
@@ -247,7 +249,8 @@
   mod.AddGlobalVariable(coord_var);
 
   ast::VariableList params;
-  auto* var = create<ast::Variable>("v", ast::StorageClass::kFunction, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kFunction, &f32);
   var->set_constructor(create<ast::MemberAccessorExpression>(
       create<ast::IdentifierExpression>("coord"),
       create<ast::IdentifierExpression>("x")));
@@ -291,8 +294,8 @@
 
   ast::type::Struct s("Uniforms", str);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("uniforms", ast::StorageClass::kUniform, &s));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "uniforms", ast::StorageClass::kUniform, &s));
 
   mod.AddConstructedType(&s);
 
@@ -305,7 +308,8 @@
   mod.AddGlobalVariable(coord_var);
 
   ast::VariableList params;
-  auto* var = create<ast::Variable>("v", ast::StorageClass::kFunction, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kFunction, &f32);
   var->set_constructor(create<ast::MemberAccessorExpression>(
       create<ast::MemberAccessorExpression>(
           create<ast::IdentifierExpression>("uniforms"),
@@ -359,8 +363,8 @@
   ast::type::Struct s("Data", str);
   ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("coord", ast::StorageClass::kStorageBuffer, &ac));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "coord", ast::StorageClass::kStorageBuffer, &ac));
 
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::BindingDecoration>(0, Source{}));
@@ -371,7 +375,8 @@
   mod.AddGlobalVariable(coord_var);
 
   ast::VariableList params;
-  auto* var = create<ast::Variable>("v", ast::StorageClass::kFunction, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kFunction, &f32);
   var->set_constructor(create<ast::MemberAccessorExpression>(
       create<ast::IdentifierExpression>("coord"),
       create<ast::IdentifierExpression>("b")));
@@ -419,8 +424,8 @@
   ast::type::Struct s("Data", str);
   ast::type::AccessControl ac(ast::AccessControl::kReadOnly, &s);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("coord", ast::StorageClass::kStorageBuffer, &ac));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "coord", ast::StorageClass::kStorageBuffer, &ac));
 
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::BindingDecoration>(0, Source{}));
@@ -431,7 +436,8 @@
   mod.AddGlobalVariable(coord_var);
 
   ast::VariableList params;
-  auto* var = create<ast::Variable>("v", ast::StorageClass::kFunction, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kFunction, &f32);
   var->set_constructor(create<ast::MemberAccessorExpression>(
       create<ast::IdentifierExpression>("coord"),
       create<ast::IdentifierExpression>("b")));
@@ -479,8 +485,8 @@
   ast::type::Struct s("Data", str);
   ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("coord", ast::StorageClass::kStorageBuffer, &ac));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "coord", ast::StorageClass::kStorageBuffer, &ac));
 
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::BindingDecoration>(0, Source{}));
@@ -529,15 +535,15 @@
   ast::type::F32 f32;
 
   auto* foo_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("foo", ast::StorageClass::kInput, &f32));
+      create<ast::Variable>(Source{}, "foo", ast::StorageClass::kInput, &f32));
   foo_var->set_decorations({create<ast::LocationDecoration>(0, Source{})});
 
   auto* bar_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("bar", ast::StorageClass::kOutput, &f32));
+      create<ast::Variable>(Source{}, "bar", ast::StorageClass::kOutput, &f32));
   bar_var->set_decorations({create<ast::LocationDecoration>(1, Source{})});
 
   auto* val_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("val", ast::StorageClass::kOutput, &f32));
+      create<ast::Variable>(Source{}, "val", ast::StorageClass::kOutput, &f32));
   val_var->set_decorations({create<ast::LocationDecoration>(0, Source{})});
 
   td.RegisterVariableForTesting(foo_var);
@@ -549,8 +555,8 @@
   mod.AddGlobalVariable(val_var);
 
   ast::VariableList params;
-  params.push_back(
-      create<ast::Variable>("param", ast::StorageClass::kFunction, &f32));
+  params.push_back(create<ast::Variable>(Source{}, "param",
+                                         ast::StorageClass::kFunction, &f32));
 
   auto* body = create<ast::BlockStatement>();
   body->append(create<ast::AssignmentStatement>(
@@ -616,8 +622,8 @@
   ast::type::F32 f32;
   ast::type::Vector vec4(&f32, 4);
 
-  auto* depth_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("depth", ast::StorageClass::kOutput, &f32));
+  auto* depth_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "depth", ast::StorageClass::kOutput, &f32));
 
   ast::VariableDecorationList decos;
   decos.push_back(
@@ -629,8 +635,8 @@
   mod.AddGlobalVariable(depth_var);
 
   ast::VariableList params;
-  params.push_back(
-      create<ast::Variable>("param", ast::StorageClass::kFunction, &f32));
+  params.push_back(create<ast::Variable>(Source{}, "param",
+                                         ast::StorageClass::kFunction, &f32));
 
   auto* body = create<ast::BlockStatement>();
   body->append(
@@ -684,13 +690,13 @@
   ast::type::F32 f32;
   ast::type::Vector vec4(&f32, 4);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("coord", ast::StorageClass::kInput, &vec4));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "coord", ast::StorageClass::kInput, &vec4));
   coord_var->set_decorations(
       {create<ast::BuiltinDecoration>(ast::Builtin::kFragCoord, Source{})});
 
-  auto* depth_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("depth", ast::StorageClass::kOutput, &f32));
+  auto* depth_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "depth", ast::StorageClass::kOutput, &f32));
   depth_var->set_decorations(
       {create<ast::BuiltinDecoration>(ast::Builtin::kFragDepth, Source{})});
 
@@ -701,8 +707,8 @@
   mod.AddGlobalVariable(depth_var);
 
   ast::VariableList params;
-  params.push_back(
-      create<ast::Variable>("param", ast::StorageClass::kFunction, &f32));
+  params.push_back(create<ast::Variable>(Source{}, "param",
+                                         ast::StorageClass::kFunction, &f32));
 
   auto* body = create<ast::BlockStatement>();
   body->append(create<ast::AssignmentStatement>(
@@ -765,8 +771,8 @@
   ast::type::F32 f32;
   ast::type::Vector vec4(&f32, 4);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("coord", ast::StorageClass::kUniform, &vec4));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "coord", ast::StorageClass::kUniform, &vec4));
 
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::BindingDecoration>(0, Source{}));
@@ -778,8 +784,8 @@
   mod.AddGlobalVariable(coord_var);
 
   ast::VariableList params;
-  params.push_back(
-      create<ast::Variable>("param", ast::StorageClass::kFunction, &f32));
+  params.push_back(create<ast::Variable>(Source{}, "param",
+                                         ast::StorageClass::kFunction, &f32));
 
   auto* body = create<ast::BlockStatement>();
   body->append(
@@ -795,7 +801,8 @@
   expr.push_back(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 1.0f)));
 
-  auto* var = create<ast::Variable>("v", ast::StorageClass::kFunction, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kFunction, &f32);
   var->set_constructor(create<ast::CallExpression>(
       create<ast::IdentifierExpression>("sub_func"), expr));
 
@@ -834,8 +841,8 @@
   ast::type::F32 f32;
   ast::type::Vector vec4(&f32, 4);
   ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &vec4);
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("coord", ast::StorageClass::kStorageBuffer, &ac));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "coord", ast::StorageClass::kStorageBuffer, &ac));
 
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::BindingDecoration>(0, Source{}));
@@ -847,8 +854,8 @@
   mod.AddGlobalVariable(coord_var);
 
   ast::VariableList params;
-  params.push_back(
-      create<ast::Variable>("param", ast::StorageClass::kFunction, &f32));
+  params.push_back(create<ast::Variable>(Source{}, "param",
+                                         ast::StorageClass::kFunction, &f32));
 
   auto* body = create<ast::BlockStatement>();
   body->append(
@@ -864,7 +871,8 @@
   expr.push_back(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 1.0f)));
 
-  auto* var = create<ast::Variable>("v", ast::StorageClass::kFunction, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kFunction, &f32);
   var->set_constructor(create<ast::CallExpression>(
       create<ast::IdentifierExpression>("sub_func"), expr));
 
@@ -902,7 +910,7 @@
   ast::type::I32 i32;
 
   auto* bar_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("bar", ast::StorageClass::kOutput, &f32));
+      create<ast::Variable>(Source{}, "bar", ast::StorageClass::kOutput, &f32));
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::LocationDecoration>(1, Source{}));
   bar_var->set_decorations(decos);
@@ -1032,7 +1040,8 @@
   ast::type::Array ary(&f32, 5);
 
   ast::VariableList params;
-  params.push_back(create<ast::Variable>("a", ast::StorageClass::kNone, &ary));
+  params.push_back(
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &ary));
 
   ast::type::Void void_type;
 
@@ -1086,8 +1095,8 @@
   ast::type::Struct s("Data", str);
   ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s);
 
-  auto* data_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("data", ast::StorageClass::kStorageBuffer, &ac));
+  auto* data_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &ac));
 
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::BindingDecoration>(0, Source{}));
@@ -1100,7 +1109,8 @@
 
   {
     ast::VariableList params;
-    auto* var = create<ast::Variable>("v", ast::StorageClass::kFunction, &f32);
+    auto* var = create<ast::Variable>(Source{}, "v",
+                                      ast::StorageClass::kFunction, &f32);
     var->set_constructor(create<ast::MemberAccessorExpression>(
         create<ast::IdentifierExpression>("data"),
         create<ast::IdentifierExpression>("d")));
@@ -1120,7 +1130,8 @@
 
   {
     ast::VariableList params;
-    auto* var = create<ast::Variable>("v", ast::StorageClass::kFunction, &f32);
+    auto* var = create<ast::Variable>(Source{}, "v",
+                                      ast::StorageClass::kFunction, &f32);
     var->set_constructor(create<ast::MemberAccessorExpression>(
         create<ast::IdentifierExpression>("data"),
         create<ast::IdentifierExpression>("d")));
diff --git a/src/writer/hlsl/generator_impl_import_test.cc b/src/writer/hlsl/generator_impl_import_test.cc
index 6cec975..fafcd69 100644
--- a/src/writer/hlsl/generator_impl_import_test.cc
+++ b/src/writer/hlsl/generator_impl_import_test.cc
@@ -268,7 +268,8 @@
   ast::type::F32 f32;
   ast::type::Matrix mat(&f32, 3, 3);
 
-  auto* var = create<ast::Variable>("var", ast::StorageClass::kFunction, &mat);
+  auto* var = create<ast::Variable>(Source{}, "var",
+                                    ast::StorageClass::kFunction, &mat);
 
   ast::ExpressionList params;
   params.push_back(create<ast::IdentifierExpression>("var"));
diff --git a/src/writer/hlsl/generator_impl_intrinsic_test.cc b/src/writer/hlsl/generator_impl_intrinsic_test.cc
index fb019f0..9a00a3a 100644
--- a/src/writer/hlsl/generator_impl_intrinsic_test.cc
+++ b/src/writer/hlsl/generator_impl_intrinsic_test.cc
@@ -75,8 +75,10 @@
   ast::type::Vector vec2(&f32, 2);
   ast::type::Vector vec3(&f32, 3);
 
-  auto* a = create<ast::Variable>("a", ast::StorageClass::kNone, &vec2);
-  auto* b = create<ast::Variable>("b", ast::StorageClass::kNone, &vec3);
+  auto* a =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &vec2);
+  auto* b =
+      create<ast::Variable>(Source{}, "b", ast::StorageClass::kNone, &vec3);
 
   ast::ExpressionList params;
   params.push_back(create<ast::IdentifierExpression>("a"));
@@ -113,8 +115,8 @@
 
   ast::CallExpression call(create<ast::IdentifierExpression>("dot"), params);
 
-  ast::Variable v1("param1", ast::StorageClass::kFunction, &vec);
-  ast::Variable v2("param2", ast::StorageClass::kFunction, &vec);
+  ast::Variable v1(Source{}, "param1", ast::StorageClass::kFunction, &vec);
+  ast::Variable v2(Source{}, "param2", ast::StorageClass::kFunction, &vec);
 
   td.RegisterVariableForTesting(&v1);
   td.RegisterVariableForTesting(&v2);
diff --git a/src/writer/hlsl/generator_impl_loop_test.cc b/src/writer/hlsl/generator_impl_loop_test.cc
index e180180..00dec1f 100644
--- a/src/writer/hlsl/generator_impl_loop_test.cc
+++ b/src/writer/hlsl/generator_impl_loop_test.cc
@@ -144,14 +144,15 @@
 
   ast::type::F32 f32;
 
-  auto* var = create<ast::Variable>("lhs", ast::StorageClass::kFunction, &f32);
+  auto* var = create<ast::Variable>(Source{}, "lhs",
+                                    ast::StorageClass::kFunction, &f32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 2.4)));
 
   auto* body = create<ast::BlockStatement>();
   body->append(create<ast::VariableDeclStatement>(var));
-  body->append(create<ast::VariableDeclStatement>(
-      create<ast::Variable>("other", ast::StorageClass::kFunction, &f32)));
+  body->append(create<ast::VariableDeclStatement>(create<ast::Variable>(
+      Source{}, "other", ast::StorageClass::kFunction, &f32)));
 
   auto* lhs = create<ast::IdentifierExpression>("lhs");
   auto* rhs = create<ast::IdentifierExpression>("rhs");
diff --git a/src/writer/hlsl/generator_impl_member_accessor_test.cc b/src/writer/hlsl/generator_impl_member_accessor_test.cc
index dab22e1..648d38c 100644
--- a/src/writer/hlsl/generator_impl_member_accessor_test.cc
+++ b/src/writer/hlsl/generator_impl_member_accessor_test.cc
@@ -58,7 +58,7 @@
   ast::type::Struct s("Str", strct);
 
   auto* str_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("str", ast::StorageClass::kPrivate, &s));
+      create<ast::Variable>(Source{}, "str", ast::StorageClass::kPrivate, &s));
 
   auto* str = create<ast::IdentifierExpression>("str");
   auto* mem = create<ast::IdentifierExpression>("mem");
@@ -100,8 +100,8 @@
 
   ast::type::Struct s("Data", str);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("data", ast::StorageClass::kStorageBuffer, &s));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &s));
 
   ast::MemberAccessorExpression expr(create<ast::IdentifierExpression>("data"),
                                      create<ast::IdentifierExpression>("b"));
@@ -143,8 +143,8 @@
 
   ast::type::Struct s("Data", str);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("data", ast::StorageClass::kStorageBuffer, &s));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &s));
 
   ast::MemberAccessorExpression expr(create<ast::IdentifierExpression>("data"),
                                      create<ast::IdentifierExpression>("a"));
@@ -189,10 +189,11 @@
 
   ast::type::Struct s("Data", str);
 
-  auto* b_var = create<ast::Variable>("b", ast::StorageClass::kPrivate, &mat);
+  auto* b_var =
+      create<ast::Variable>(Source{}, "b", ast::StorageClass::kPrivate, &mat);
 
-  auto* coord_var =
-      create<ast::Variable>("data", ast::StorageClass::kStorageBuffer, &s);
+  auto* coord_var = create<ast::Variable>(
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &s);
 
   auto* lhs = create<ast::MemberAccessorExpression>(
       create<ast::IdentifierExpression>("data"),
@@ -248,8 +249,8 @@
 
   ast::type::Struct s("Data", str);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("data", ast::StorageClass::kStorageBuffer, &s));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &s));
 
   auto* lhs = create<ast::MemberAccessorExpression>(
       create<ast::IdentifierExpression>("data"),
@@ -303,8 +304,8 @@
 
   ast::type::Struct s("Data", str);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("data", ast::StorageClass::kStorageBuffer, &s));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &s));
 
   ast::MemberAccessorExpression expr(create<ast::IdentifierExpression>("data"),
                                      create<ast::IdentifierExpression>("a"));
@@ -353,8 +354,8 @@
 
   ast::type::Struct s("Data", str);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("data", ast::StorageClass::kStorageBuffer, &s));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &s));
 
   ast::MemberAccessorExpression expr(create<ast::IdentifierExpression>("data"),
                                      create<ast::IdentifierExpression>("a"));
@@ -395,8 +396,8 @@
 
   ast::type::Struct s("Data", str);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("data", ast::StorageClass::kStorageBuffer, &s));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &s));
 
   ast::MemberAccessorExpression expr(create<ast::IdentifierExpression>("data"),
                                      create<ast::IdentifierExpression>("a"));
@@ -441,8 +442,8 @@
 
   ast::type::Struct s("Data", str);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("data", ast::StorageClass::kStorageBuffer, &s));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &s));
 
   ast::ArrayAccessorExpression expr(
       create<ast::ArrayAccessorExpression>(
@@ -488,8 +489,8 @@
 
   ast::type::Struct s("Data", str);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("data", ast::StorageClass::kStorageBuffer, &s));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &s));
 
   ast::ArrayAccessorExpression expr(
       create<ast::MemberAccessorExpression>(
@@ -532,8 +533,8 @@
 
   ast::type::Struct s("Data", str);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("data", ast::StorageClass::kStorageBuffer, &s));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &s));
 
   ast::ArrayAccessorExpression expr(
       create<ast::MemberAccessorExpression>(
@@ -588,8 +589,8 @@
 
   ast::type::Struct s("Data", str);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("data", ast::StorageClass::kStorageBuffer, &s));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &s));
 
   td.RegisterVariableForTesting(coord_var);
   gen.register_global(coord_var);
@@ -634,8 +635,8 @@
 
   ast::type::Struct s("Data", str);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("data", ast::StorageClass::kStorageBuffer, &s));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &s));
 
   td.RegisterVariableForTesting(coord_var);
   gen.register_global(coord_var);
@@ -686,8 +687,8 @@
 
   ast::type::Struct s("Data", str);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("data", ast::StorageClass::kStorageBuffer, &s));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &s));
 
   td.RegisterVariableForTesting(coord_var);
   gen.register_global(coord_var);
@@ -737,8 +738,8 @@
 
   ast::type::Struct s("Data", str);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("data", ast::StorageClass::kStorageBuffer, &s));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &s));
 
   td.RegisterVariableForTesting(coord_var);
   gen.register_global(coord_var);
@@ -783,8 +784,8 @@
 
   ast::type::Struct s("Data", str);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("data", ast::StorageClass::kStorageBuffer, &s));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &s));
 
   td.RegisterVariableForTesting(coord_var);
   gen.register_global(coord_var);
@@ -860,7 +861,7 @@
   ast::type::Struct pre_struct("Pre", pre_str);
 
   auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
-      "data", ast::StorageClass::kStorageBuffer, &pre_struct));
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &pre_struct));
 
   td.RegisterVariableForTesting(coord_var);
   gen.register_global(coord_var);
@@ -930,7 +931,7 @@
   ast::type::Struct pre_struct("Pre", pre_str);
 
   auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
-      "data", ast::StorageClass::kStorageBuffer, &pre_struct));
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &pre_struct));
 
   td.RegisterVariableForTesting(coord_var);
   gen.register_global(coord_var);
@@ -1000,7 +1001,7 @@
   ast::type::Struct pre_struct("Pre", pre_str);
 
   auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
-      "data", ast::StorageClass::kStorageBuffer, &pre_struct));
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &pre_struct));
 
   td.RegisterVariableForTesting(coord_var);
   gen.register_global(coord_var);
@@ -1069,7 +1070,7 @@
   ast::type::Struct pre_struct("Pre", pre_str);
 
   auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
-      "data", ast::StorageClass::kStorageBuffer, &pre_struct));
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &pre_struct));
 
   td.RegisterVariableForTesting(coord_var);
   gen.register_global(coord_var);
@@ -1139,7 +1140,7 @@
   ast::type::Struct pre_struct("Pre", pre_str);
 
   auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
-      "data", ast::StorageClass::kStorageBuffer, &pre_struct));
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &pre_struct));
 
   td.RegisterVariableForTesting(coord_var);
   gen.register_global(coord_var);
@@ -1220,7 +1221,7 @@
   ast::type::Struct pre_struct("Pre", pre_str);
 
   auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
-      "data", ast::StorageClass::kStorageBuffer, &pre_struct));
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &pre_struct));
 
   td.RegisterVariableForTesting(coord_var);
   gen.register_global(coord_var);
diff --git a/src/writer/hlsl/generator_impl_module_constant_test.cc b/src/writer/hlsl/generator_impl_module_constant_test.cc
index 2e96034..884b754 100644
--- a/src/writer/hlsl/generator_impl_module_constant_test.cc
+++ b/src/writer/hlsl/generator_impl_module_constant_test.cc
@@ -45,7 +45,8 @@
   exprs.push_back(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 3.0f)));
 
-  auto* var = create<ast::Variable>("pos", ast::StorageClass::kNone, &ary);
+  auto* var =
+      create<ast::Variable>(Source{}, "pos", ast::StorageClass::kNone, &ary);
   var->set_is_const(true);
   var->set_constructor(create<ast::TypeConstructorExpression>(&ary, exprs));
 
@@ -60,7 +61,7 @@
   decos.push_back(create<ast::ConstantIdDecoration>(23, Source{}));
 
   auto* var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("pos", ast::StorageClass::kNone, &f32));
+      create<ast::Variable>(Source{}, "pos", ast::StorageClass::kNone, &f32));
   var->set_decorations(decos);
   var->set_is_const(true);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
@@ -82,7 +83,7 @@
   decos.push_back(create<ast::ConstantIdDecoration>(23, Source{}));
 
   auto* var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("pos", ast::StorageClass::kNone, &f32));
+      create<ast::Variable>(Source{}, "pos", ast::StorageClass::kNone, &f32));
   var->set_decorations(decos);
   var->set_is_const(true);
 
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 4638cf6..b4e389f 100644
--- a/src/writer/hlsl/generator_impl_variable_decl_statement_test.cc
+++ b/src/writer/hlsl/generator_impl_variable_decl_statement_test.cc
@@ -34,7 +34,8 @@
 
 TEST_F(HlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement) {
   ast::type::F32 f32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &f32);
 
   ast::VariableDeclStatement stmt(var);
   gen.increment_indent();
@@ -45,7 +46,8 @@
 
 TEST_F(HlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Const) {
   ast::type::F32 f32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &f32);
   var->set_is_const(true);
 
   ast::VariableDeclStatement stmt(var);
@@ -59,7 +61,8 @@
   ast::type::F32 f32;
   ast::type::Array ary(&f32, 5);
 
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &ary);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &ary);
 
   ast::VariableDeclStatement stmt(var);
   gen.increment_indent();
@@ -71,7 +74,8 @@
 TEST_F(HlslGeneratorImplTest_VariableDecl,
        Emit_VariableDeclStatement_Function) {
   ast::type::F32 f32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kFunction, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kFunction, &f32);
 
   ast::VariableDeclStatement stmt(var);
   gen.increment_indent();
@@ -82,7 +86,8 @@
 
 TEST_F(HlslGeneratorImplTest_VariableDecl, Emit_VariableDeclStatement_Private) {
   ast::type::F32 f32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kPrivate, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kPrivate, &f32);
 
   ast::VariableDeclStatement stmt(var);
   gen.increment_indent();
@@ -96,7 +101,8 @@
   auto* ident = create<ast::IdentifierExpression>("initializer");
 
   ast::type::F32 f32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &f32);
   var->set_constructor(ident);
 
   ast::VariableDeclStatement stmt(var);
@@ -113,7 +119,8 @@
   ast::ExpressionList values;
   auto* zero_vec = create<ast::TypeConstructorExpression>(&vec, values);
 
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &vec);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &vec);
   var->set_constructor(zero_vec);
 
   ast::VariableDeclStatement stmt(var);
@@ -130,7 +137,8 @@
   ast::ExpressionList values;
   auto* zero_mat = create<ast::TypeConstructorExpression>(&mat, values);
 
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &mat);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &mat);
   var->set_constructor(zero_mat);
 
   ast::VariableDeclStatement stmt(var);
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 62f6286..8614c9f 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
@@ -52,11 +52,11 @@
   ast::type::I32 i32;
 
   auto* foo_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("foo", ast::StorageClass::kInput, &f32));
+      create<ast::Variable>(Source{}, "foo", ast::StorageClass::kInput, &f32));
   foo_var->set_decorations({create<ast::LocationDecoration>(0, Source{})});
 
   auto* bar_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("bar", ast::StorageClass::kInput, &i32));
+      create<ast::Variable>(Source{}, "bar", ast::StorageClass::kInput, &i32));
   bar_var->set_decorations({create<ast::LocationDecoration>(1, Source{})});
 
   td.RegisterVariableForTesting(foo_var);
@@ -106,11 +106,11 @@
   ast::type::I32 i32;
 
   auto* foo_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("foo", ast::StorageClass::kOutput, &f32));
+      create<ast::Variable>(Source{}, "foo", ast::StorageClass::kOutput, &f32));
   foo_var->set_decorations({create<ast::LocationDecoration>(0, Source{})});
 
   auto* bar_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("bar", ast::StorageClass::kOutput, &i32));
+      create<ast::Variable>(Source{}, "bar", ast::StorageClass::kOutput, &i32));
   bar_var->set_decorations({create<ast::LocationDecoration>(1, Source{})});
 
   td.RegisterVariableForTesting(foo_var);
@@ -160,11 +160,11 @@
   ast::type::I32 i32;
 
   auto* foo_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("foo", ast::StorageClass::kInput, &f32));
+      create<ast::Variable>(Source{}, "foo", ast::StorageClass::kInput, &f32));
   foo_var->set_decorations({create<ast::LocationDecoration>(0, Source{})});
 
   auto* bar_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("bar", ast::StorageClass::kInput, &i32));
+      create<ast::Variable>(Source{}, "bar", ast::StorageClass::kInput, &i32));
   bar_var->set_decorations({create<ast::LocationDecoration>(1, Source{})});
 
   td.RegisterVariableForTesting(foo_var);
@@ -213,11 +213,11 @@
   ast::type::I32 i32;
 
   auto* foo_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("foo", ast::StorageClass::kOutput, &f32));
+      create<ast::Variable>(Source{}, "foo", ast::StorageClass::kOutput, &f32));
   foo_var->set_decorations({create<ast::LocationDecoration>(0, Source{})});
 
   auto* bar_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("bar", ast::StorageClass::kOutput, &i32));
+      create<ast::Variable>(Source{}, "bar", ast::StorageClass::kOutput, &i32));
   bar_var->set_decorations({create<ast::LocationDecoration>(1, Source{})});
 
   td.RegisterVariableForTesting(foo_var);
@@ -264,14 +264,14 @@
   ast::type::I32 i32;
 
   auto* foo_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("foo", ast::StorageClass::kInput, &f32));
+      create<ast::Variable>(Source{}, "foo", ast::StorageClass::kInput, &f32));
 
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::LocationDecoration>(0, Source{}));
   foo_var->set_decorations(decos);
 
   auto* bar_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("bar", ast::StorageClass::kInput, &i32));
+      create<ast::Variable>(Source{}, "bar", ast::StorageClass::kInput, &i32));
   decos.push_back(create<ast::LocationDecoration>(1, Source{}));
   bar_var->set_decorations(decos);
 
@@ -314,14 +314,14 @@
   ast::type::I32 i32;
 
   auto* foo_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("foo", ast::StorageClass::kOutput, &f32));
+      create<ast::Variable>(Source{}, "foo", ast::StorageClass::kOutput, &f32));
 
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::LocationDecoration>(0, Source{}));
   foo_var->set_decorations(decos);
 
   auto* bar_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("bar", ast::StorageClass::kOutput, &i32));
+      create<ast::Variable>(Source{}, "bar", ast::StorageClass::kOutput, &i32));
   decos.push_back(create<ast::LocationDecoration>(1, Source{}));
   bar_var->set_decorations(decos);
 
@@ -369,13 +369,13 @@
   ast::type::Void void_type;
   ast::type::Vector vec4(&f32, 4);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("coord", ast::StorageClass::kInput, &vec4));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "coord", ast::StorageClass::kInput, &vec4));
   coord_var->set_decorations(
       {create<ast::BuiltinDecoration>(ast::Builtin::kFragCoord, Source{})});
 
-  auto* depth_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("depth", ast::StorageClass::kOutput, &f32));
+  auto* depth_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "depth", ast::StorageClass::kOutput, &f32));
   depth_var->set_decorations(
       {create<ast::BuiltinDecoration>(ast::Builtin::kFragDepth, Source{})});
 
diff --git a/src/writer/msl/generator_impl_function_test.cc b/src/writer/msl/generator_impl_function_test.cc
index 453aaa8..22eb889 100644
--- a/src/writer/msl/generator_impl_function_test.cc
+++ b/src/writer/msl/generator_impl_function_test.cc
@@ -105,8 +105,10 @@
   ast::type::I32 i32;
 
   ast::VariableList params;
-  params.push_back(create<ast::Variable>("a", ast::StorageClass::kNone, &f32));
-  params.push_back(create<ast::Variable>("b", ast::StorageClass::kNone, &i32));
+  params.push_back(
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &f32));
+  params.push_back(
+      create<ast::Variable>(Source{}, "b", ast::StorageClass::kNone, &i32));
 
   ast::type::Void void_type;
 
@@ -133,11 +135,11 @@
   ast::type::F32 f32;
 
   auto* foo_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("foo", ast::StorageClass::kInput, &f32));
+      create<ast::Variable>(Source{}, "foo", ast::StorageClass::kInput, &f32));
   foo_var->set_decorations({create<ast::LocationDecoration>(0, Source{})});
 
   auto* bar_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("bar", ast::StorageClass::kOutput, &f32));
+      create<ast::Variable>(Source{}, "bar", ast::StorageClass::kOutput, &f32));
   bar_var->set_decorations({create<ast::LocationDecoration>(1, Source{})});
 
   td.RegisterVariableForTesting(foo_var);
@@ -188,13 +190,13 @@
   ast::type::F32 f32;
   ast::type::Vector vec4(&f32, 4);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("coord", ast::StorageClass::kInput, &vec4));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "coord", ast::StorageClass::kInput, &vec4));
   coord_var->set_decorations(
       {create<ast::BuiltinDecoration>(ast::Builtin::kFragCoord, Source{})});
 
-  auto* depth_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("depth", ast::StorageClass::kOutput, &f32));
+  auto* depth_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "depth", ast::StorageClass::kOutput, &f32));
   depth_var->set_decorations(
       {create<ast::BuiltinDecoration>(ast::Builtin::kFragDepth, Source{})});
 
@@ -244,8 +246,8 @@
   ast::type::F32 f32;
   ast::type::Vector vec4(&f32, 4);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("coord", ast::StorageClass::kUniform, &vec4));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "coord", ast::StorageClass::kUniform, &vec4));
 
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::BindingDecoration>(0, Source{}));
@@ -257,7 +259,8 @@
   mod.AddGlobalVariable(coord_var);
 
   ast::VariableList params;
-  auto* var = create<ast::Variable>("v", ast::StorageClass::kFunction, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kFunction, &f32);
   var->set_constructor(create<ast::MemberAccessorExpression>(
       create<ast::IdentifierExpression>("coord"),
       create<ast::IdentifierExpression>("x")));
@@ -309,8 +312,8 @@
 
   mod.AddConstructedType(&s);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("coord", ast::StorageClass::kStorageBuffer, &ac));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "coord", ast::StorageClass::kStorageBuffer, &ac));
 
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::BindingDecoration>(0, Source{}));
@@ -322,7 +325,8 @@
   mod.AddGlobalVariable(coord_var);
 
   ast::VariableList params;
-  auto* var = create<ast::Variable>("v", ast::StorageClass::kFunction, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kFunction, &f32);
   var->set_constructor(create<ast::MemberAccessorExpression>(
       create<ast::IdentifierExpression>("coord"),
       create<ast::IdentifierExpression>("b")));
@@ -378,8 +382,8 @@
 
   mod.AddConstructedType(&s);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("coord", ast::StorageClass::kStorageBuffer, &ac));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "coord", ast::StorageClass::kStorageBuffer, &ac));
 
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::BindingDecoration>(0, Source{}));
@@ -392,7 +396,8 @@
 
   ast::VariableList params;
 
-  auto* var = create<ast::Variable>("v", ast::StorageClass::kFunction, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kFunction, &f32);
   var->set_constructor(create<ast::MemberAccessorExpression>(
       create<ast::IdentifierExpression>("coord"),
       create<ast::IdentifierExpression>("b")));
@@ -434,15 +439,15 @@
   ast::type::F32 f32;
 
   auto* foo_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("foo", ast::StorageClass::kInput, &f32));
+      create<ast::Variable>(Source{}, "foo", ast::StorageClass::kInput, &f32));
   foo_var->set_decorations({create<ast::LocationDecoration>(0, Source{})});
 
   auto* bar_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("bar", ast::StorageClass::kOutput, &f32));
+      create<ast::Variable>(Source{}, "bar", ast::StorageClass::kOutput, &f32));
   bar_var->set_decorations({create<ast::LocationDecoration>(1, Source{})});
 
   auto* val_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("val", ast::StorageClass::kOutput, &f32));
+      create<ast::Variable>(Source{}, "val", ast::StorageClass::kOutput, &f32));
   val_var->set_decorations({create<ast::LocationDecoration>(0, Source{})});
 
   td.RegisterVariableForTesting(foo_var);
@@ -454,8 +459,8 @@
   mod.AddGlobalVariable(val_var);
 
   ast::VariableList params;
-  params.push_back(
-      create<ast::Variable>("param", ast::StorageClass::kFunction, &f32));
+  params.push_back(create<ast::Variable>(Source{}, "param",
+                                         ast::StorageClass::kFunction, &f32));
 
   auto* body = create<ast::BlockStatement>();
   body->append(create<ast::AssignmentStatement>(
@@ -524,8 +529,8 @@
   ast::type::F32 f32;
   ast::type::Vector vec4(&f32, 4);
 
-  auto* depth_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("depth", ast::StorageClass::kOutput, &f32));
+  auto* depth_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "depth", ast::StorageClass::kOutput, &f32));
 
   ast::VariableDecorationList decos;
   decos.push_back(
@@ -537,8 +542,8 @@
   mod.AddGlobalVariable(depth_var);
 
   ast::VariableList params;
-  params.push_back(
-      create<ast::Variable>("param", ast::StorageClass::kFunction, &f32));
+  params.push_back(create<ast::Variable>(Source{}, "param",
+                                         ast::StorageClass::kFunction, &f32));
 
   auto* body = create<ast::BlockStatement>();
   body->append(
@@ -596,13 +601,13 @@
   ast::type::F32 f32;
   ast::type::Vector vec4(&f32, 4);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("coord", ast::StorageClass::kInput, &vec4));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "coord", ast::StorageClass::kInput, &vec4));
   coord_var->set_decorations(
       {create<ast::BuiltinDecoration>(ast::Builtin::kFragCoord, Source{})});
 
-  auto* depth_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("depth", ast::StorageClass::kOutput, &f32));
+  auto* depth_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "depth", ast::StorageClass::kOutput, &f32));
   depth_var->set_decorations(
       {create<ast::BuiltinDecoration>(ast::Builtin::kFragDepth, Source{})});
 
@@ -613,8 +618,8 @@
   mod.AddGlobalVariable(depth_var);
 
   ast::VariableList params;
-  params.push_back(
-      create<ast::Variable>("param", ast::StorageClass::kFunction, &f32));
+  params.push_back(create<ast::Variable>(Source{}, "param",
+                                         ast::StorageClass::kFunction, &f32));
 
   auto* body = create<ast::BlockStatement>();
   body->append(create<ast::AssignmentStatement>(
@@ -675,8 +680,8 @@
   ast::type::F32 f32;
   ast::type::Vector vec4(&f32, 4);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("coord", ast::StorageClass::kUniform, &vec4));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "coord", ast::StorageClass::kUniform, &vec4));
 
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::BindingDecoration>(0, Source{}));
@@ -688,8 +693,8 @@
   mod.AddGlobalVariable(coord_var);
 
   ast::VariableList params;
-  params.push_back(
-      create<ast::Variable>("param", ast::StorageClass::kFunction, &f32));
+  params.push_back(create<ast::Variable>(Source{}, "param",
+                                         ast::StorageClass::kFunction, &f32));
 
   auto* body = create<ast::BlockStatement>();
   body->append(
@@ -705,7 +710,8 @@
   expr.push_back(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 1.0f)));
 
-  auto* var = create<ast::Variable>("v", ast::StorageClass::kFunction, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kFunction, &f32);
   var->set_constructor(create<ast::CallExpression>(
       create<ast::IdentifierExpression>("sub_func"), expr));
 
@@ -759,8 +765,8 @@
 
   mod.AddConstructedType(&s);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("coord", ast::StorageClass::kStorageBuffer, &ac));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "coord", ast::StorageClass::kStorageBuffer, &ac));
 
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::BindingDecoration>(0, Source{}));
@@ -771,8 +777,8 @@
   mod.AddGlobalVariable(coord_var);
 
   ast::VariableList params;
-  params.push_back(
-      create<ast::Variable>("param", ast::StorageClass::kFunction, &f32));
+  params.push_back(create<ast::Variable>(Source{}, "param",
+                                         ast::StorageClass::kFunction, &f32));
 
   auto* body = create<ast::BlockStatement>();
   body->append(
@@ -788,7 +794,8 @@
   expr.push_back(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 1.0f)));
 
-  auto* var = create<ast::Variable>("v", ast::StorageClass::kFunction, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kFunction, &f32);
   var->set_constructor(create<ast::CallExpression>(
       create<ast::IdentifierExpression>("sub_func"), expr));
 
@@ -848,8 +855,8 @@
 
   mod.AddConstructedType(&s);
 
-  auto* coord_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("coord", ast::StorageClass::kStorageBuffer, &ac));
+  auto* coord_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "coord", ast::StorageClass::kStorageBuffer, &ac));
 
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::BindingDecoration>(0, Source{}));
@@ -860,8 +867,8 @@
   mod.AddGlobalVariable(coord_var);
 
   ast::VariableList params;
-  params.push_back(
-      create<ast::Variable>("param", ast::StorageClass::kFunction, &f32));
+  params.push_back(create<ast::Variable>(Source{}, "param",
+                                         ast::StorageClass::kFunction, &f32));
 
   auto* body = create<ast::BlockStatement>();
   body->append(
@@ -877,7 +884,8 @@
   expr.push_back(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 1.0f)));
 
-  auto* var = create<ast::Variable>("v", ast::StorageClass::kFunction, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kFunction, &f32);
   var->set_constructor(create<ast::CallExpression>(
       create<ast::IdentifierExpression>("sub_func"), expr));
 
@@ -922,7 +930,7 @@
   ast::type::I32 i32;
 
   auto* bar_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("bar", ast::StorageClass::kOutput, &f32));
+      create<ast::Variable>(Source{}, "bar", ast::StorageClass::kOutput, &f32));
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::LocationDecoration>(1, Source{}));
   bar_var->set_decorations(decos);
@@ -1006,7 +1014,8 @@
   ast::type::Array ary(&f32, 5);
 
   ast::VariableList params;
-  params.push_back(create<ast::Variable>("a", ast::StorageClass::kNone, &ary));
+  params.push_back(
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &ary));
 
   ast::type::Void void_type;
 
@@ -1063,8 +1072,8 @@
   ast::type::Struct s("Data", str);
   ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s);
 
-  auto* data_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("data", ast::StorageClass::kStorageBuffer, &ac));
+  auto* data_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &ac));
 
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::BindingDecoration>(0, Source{}));
@@ -1078,7 +1087,8 @@
 
   {
     ast::VariableList params;
-    auto* var = create<ast::Variable>("v", ast::StorageClass::kFunction, &f32);
+    auto* var = create<ast::Variable>(Source{}, "v",
+                                      ast::StorageClass::kFunction, &f32);
     var->set_constructor(create<ast::MemberAccessorExpression>(
         create<ast::IdentifierExpression>("data"),
         create<ast::IdentifierExpression>("d")));
@@ -1099,7 +1109,8 @@
 
   {
     ast::VariableList params;
-    auto* var = create<ast::Variable>("v", ast::StorageClass::kFunction, &f32);
+    auto* var = create<ast::Variable>(Source{}, "v",
+                                      ast::StorageClass::kFunction, &f32);
     var->set_constructor(create<ast::MemberAccessorExpression>(
         create<ast::IdentifierExpression>("data"),
         create<ast::IdentifierExpression>("d")));
diff --git a/src/writer/msl/generator_impl_import_test.cc b/src/writer/msl/generator_impl_import_test.cc
index c36bf3c..b25f6ab 100644
--- a/src/writer/msl/generator_impl_import_test.cc
+++ b/src/writer/msl/generator_impl_import_test.cc
@@ -267,7 +267,8 @@
   ast::type::F32 f32;
   ast::type::Matrix mat(&f32, 3, 3);
 
-  auto* var = create<ast::Variable>("var", ast::StorageClass::kFunction, &mat);
+  auto* var = create<ast::Variable>(Source{}, "var",
+                                    ast::StorageClass::kFunction, &mat);
 
   ast::ExpressionList params;
   params.push_back(create<ast::IdentifierExpression>("var"));
diff --git a/src/writer/msl/generator_impl_intrinsic_test.cc b/src/writer/msl/generator_impl_intrinsic_test.cc
index ca69fc0..164cee6 100644
--- a/src/writer/msl/generator_impl_intrinsic_test.cc
+++ b/src/writer/msl/generator_impl_intrinsic_test.cc
@@ -70,8 +70,10 @@
   ast::type::Vector vec2(&f32, 2);
   ast::type::Vector vec3(&f32, 3);
 
-  auto* a = create<ast::Variable>("a", ast::StorageClass::kNone, &vec2);
-  auto* b = create<ast::Variable>("b", ast::StorageClass::kNone, &vec3);
+  auto* a =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &vec2);
+  auto* b =
+      create<ast::Variable>(Source{}, "b", ast::StorageClass::kNone, &vec3);
 
   ast::ExpressionList params;
   params.push_back(create<ast::IdentifierExpression>("a"));
@@ -108,8 +110,8 @@
 
   ast::CallExpression call(create<ast::IdentifierExpression>("dot"), params);
 
-  ast::Variable v1("param1", ast::StorageClass::kFunction, &vec);
-  ast::Variable v2("param2", ast::StorageClass::kFunction, &vec);
+  ast::Variable v1(Source{}, "param1", ast::StorageClass::kFunction, &vec);
+  ast::Variable v2(Source{}, "param2", ast::StorageClass::kFunction, &vec);
 
   td.RegisterVariableForTesting(&v1);
   td.RegisterVariableForTesting(&v2);
diff --git a/src/writer/msl/generator_impl_loop_test.cc b/src/writer/msl/generator_impl_loop_test.cc
index bd46e63..c4ef258 100644
--- a/src/writer/msl/generator_impl_loop_test.cc
+++ b/src/writer/msl/generator_impl_loop_test.cc
@@ -149,14 +149,15 @@
 
   ast::type::F32 f32;
 
-  auto* var = create<ast::Variable>("lhs", ast::StorageClass::kFunction, &f32);
+  auto* var = create<ast::Variable>(Source{}, "lhs",
+                                    ast::StorageClass::kFunction, &f32);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 2.4)));
 
   auto* body = create<ast::BlockStatement>();
   body->append(create<ast::VariableDeclStatement>(var));
-  body->append(create<ast::VariableDeclStatement>(
-      create<ast::Variable>("other", ast::StorageClass::kFunction, &f32)));
+  body->append(create<ast::VariableDeclStatement>(create<ast::Variable>(
+      Source{}, "other", ast::StorageClass::kFunction, &f32)));
 
   auto* lhs = create<ast::IdentifierExpression>("lhs");
   auto* rhs = create<ast::IdentifierExpression>("rhs");
diff --git a/src/writer/msl/generator_impl_module_constant_test.cc b/src/writer/msl/generator_impl_module_constant_test.cc
index ae03c77..97007b7 100644
--- a/src/writer/msl/generator_impl_module_constant_test.cc
+++ b/src/writer/msl/generator_impl_module_constant_test.cc
@@ -47,7 +47,8 @@
   exprs.push_back(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 3.0f)));
 
-  auto* var = create<ast::Variable>("pos", ast::StorageClass::kNone, &ary);
+  auto* var =
+      create<ast::Variable>(Source{}, "pos", ast::StorageClass::kNone, &ary);
   var->set_is_const(true);
   var->set_constructor(create<ast::TypeConstructorExpression>(&ary, exprs));
 
@@ -62,7 +63,7 @@
   decos.push_back(create<ast::ConstantIdDecoration>(23, Source{}));
 
   auto* var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("pos", ast::StorageClass::kNone, &f32));
+      create<ast::Variable>(Source{}, "pos", ast::StorageClass::kNone, &f32));
   var->set_decorations(decos);
   var->set_is_const(true);
   var->set_constructor(create<ast::ScalarConstructorExpression>(
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 03a20b5..dcaf542 100644
--- a/src/writer/msl/generator_impl_variable_decl_statement_test.cc
+++ b/src/writer/msl/generator_impl_variable_decl_statement_test.cc
@@ -42,7 +42,8 @@
 
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement) {
   ast::type::F32 f32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &f32);
 
   ast::VariableDeclStatement stmt(var);
 
@@ -54,7 +55,8 @@
 
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Const) {
   ast::type::F32 f32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &f32);
   var->set_is_const(true);
 
   ast::VariableDeclStatement stmt(var);
@@ -69,7 +71,8 @@
   ast::type::F32 f32;
   ast::type::Array ary(&f32, 5);
 
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &ary);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &ary);
 
   ast::VariableDeclStatement stmt(var);
 
@@ -94,7 +97,8 @@
 
   ast::type::Struct s("S", str);
 
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &s);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &s);
 
   ast::VariableDeclStatement stmt(var);
 
@@ -109,7 +113,8 @@
   ast::type::F32 f32;
   ast::type::Vector vec(&f32, 2);
 
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kFunction, &vec);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kFunction, &vec);
 
   ast::VariableDeclStatement stmt(var);
 
@@ -122,7 +127,8 @@
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Matrix) {
   ast::type::F32 f32;
   ast::type::Matrix mat(&f32, 2, 3);
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kFunction, &mat);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kFunction, &mat);
 
   ast::VariableDeclStatement stmt(var);
 
@@ -134,7 +140,8 @@
 
 TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Private) {
   ast::type::F32 f32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kPrivate, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kPrivate, &f32);
 
   ast::VariableDeclStatement stmt(var);
 
@@ -148,7 +155,8 @@
   auto* ident = create<ast::IdentifierExpression>("initializer");
 
   ast::type::F32 f32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &f32);
   var->set_constructor(ident);
 
   ast::VariableDeclStatement stmt(var);
@@ -165,7 +173,8 @@
   ast::ExpressionList values;
   auto* zero_vec = create<ast::TypeConstructorExpression>(&vec, values);
 
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &vec);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &vec);
   var->set_constructor(zero_vec);
 
   ast::VariableDeclStatement stmt(var);
diff --git a/src/writer/spirv/builder_accessor_expression_test.cc b/src/writer/spirv/builder_accessor_expression_test.cc
index a834a90..65b66c4 100644
--- a/src/writer/spirv/builder_accessor_expression_test.cc
+++ b/src/writer/spirv/builder_accessor_expression_test.cc
@@ -53,7 +53,7 @@
   // vec3<f32> ary;
   // ary[1]  -> ptr<f32>
 
-  ast::Variable var("ary", ast::StorageClass::kFunction, &vec3);
+  ast::Variable var(Source{}, "ary", ast::StorageClass::kFunction, &vec3);
 
   auto* ary = create<ast::IdentifierExpression>("ary");
   auto* idx_expr = create<ast::ScalarConstructorExpression>(
@@ -94,8 +94,8 @@
   // idx : i32;
   // ary[idx]  -> ptr<f32>
 
-  ast::Variable var("ary", ast::StorageClass::kFunction, &vec3);
-  ast::Variable idx("idx", ast::StorageClass::kFunction, &i32);
+  ast::Variable var(Source{}, "ary", ast::StorageClass::kFunction, &vec3);
+  ast::Variable idx(Source{}, "idx", ast::StorageClass::kFunction, &i32);
 
   auto* ary = create<ast::IdentifierExpression>("ary");
   auto* idx_expr = create<ast::IdentifierExpression>("idx");
@@ -139,7 +139,7 @@
   // vec3<f32> ary;
   // ary[1 + 2]  -> ptr<f32>
 
-  ast::Variable var("ary", ast::StorageClass::kFunction, &vec3);
+  ast::Variable var(Source{}, "ary", ast::StorageClass::kFunction, &vec3);
 
   auto* ary = create<ast::IdentifierExpression>("ary");
 
@@ -186,7 +186,7 @@
   // ary = array<vec3<f32>, 4>
   // ary[3][2];
 
-  ast::Variable var("ary", ast::StorageClass::kFunction, &ary4);
+  ast::Variable var(Source{}, "ary", ast::StorageClass::kFunction, &ary4);
 
   ast::ArrayAccessorExpression expr(
       create<ast::ArrayAccessorExpression>(
@@ -233,7 +233,7 @@
   // var a : array<vec3<f32>, 4>;
   // a[2].xy;
 
-  ast::Variable var("ary", ast::StorageClass::kFunction, &ary4);
+  ast::Variable var(Source{}, "ary", ast::StorageClass::kFunction, &ary4);
 
   ast::MemberAccessorExpression expr(
       create<ast::ArrayAccessorExpression>(
@@ -289,7 +289,7 @@
   auto* s = create<ast::Struct>(members);
   ast::type::Struct s_type("my_struct", s);
 
-  ast::Variable var("ident", ast::StorageClass::kFunction, &s_type);
+  ast::Variable var(Source{}, "ident", ast::StorageClass::kFunction, &s_type);
 
   ast::MemberAccessorExpression expr(create<ast::IdentifierExpression>("ident"),
                                      create<ast::IdentifierExpression>("b"));
@@ -343,7 +343,7 @@
 
   ast::type::Struct s_type("my_struct", create<ast::Struct>(outer_members));
 
-  ast::Variable var("ident", ast::StorageClass::kFunction, &s_type);
+  ast::Variable var(Source{}, "ident", ast::StorageClass::kFunction, &s_type);
 
   ast::MemberAccessorExpression expr(
       create<ast::MemberAccessorExpression>(
@@ -403,7 +403,7 @@
 
   ast::type::Struct s_type("Outer", create<ast::Struct>(outer_members));
 
-  ast::Variable var("ident", ast::StorageClass::kFunction, &s_type);
+  ast::Variable var(Source{}, "ident", ast::StorageClass::kFunction, &s_type);
 
   ast::MemberAccessorExpression expr(
       create<ast::MemberAccessorExpression>(
@@ -462,7 +462,7 @@
 
   ast::type::Struct s_type("my_struct", create<ast::Struct>(outer_members));
 
-  ast::Variable var("ident", ast::StorageClass::kFunction, &s_type);
+  ast::Variable var(Source{}, "ident", ast::StorageClass::kFunction, &s_type);
 
   auto* lhs = create<ast::MemberAccessorExpression>(
       create<ast::MemberAccessorExpression>(
@@ -528,8 +528,8 @@
 
   ast::type::Struct s_type("my_struct", create<ast::Struct>(outer_members));
 
-  ast::Variable var("ident", ast::StorageClass::kFunction, &s_type);
-  ast::Variable store("store", ast::StorageClass::kFunction, &f32);
+  ast::Variable var(Source{}, "ident", ast::StorageClass::kFunction, &s_type);
+  ast::Variable store(Source{}, "store", ast::StorageClass::kFunction, &f32);
 
   auto* lhs = create<ast::IdentifierExpression>("store");
 
@@ -578,7 +578,7 @@
 
   // ident.y
 
-  ast::Variable var("ident", ast::StorageClass::kFunction, &vec3);
+  ast::Variable var(Source{}, "ident", ast::StorageClass::kFunction, &vec3);
 
   ast::MemberAccessorExpression expr(create<ast::IdentifierExpression>("ident"),
                                      create<ast::IdentifierExpression>("y"));
@@ -613,7 +613,7 @@
 
   // ident.yx
 
-  ast::Variable var("ident", ast::StorageClass::kFunction, &vec3);
+  ast::Variable var(Source{}, "ident", ast::StorageClass::kFunction, &vec3);
 
   ast::MemberAccessorExpression expr(create<ast::IdentifierExpression>("ident"),
                                      create<ast::IdentifierExpression>("yx"));
@@ -647,7 +647,7 @@
 
   // ident.yxz.xz
 
-  ast::Variable var("ident", ast::StorageClass::kFunction, &vec3);
+  ast::Variable var(Source{}, "ident", ast::StorageClass::kFunction, &vec3);
 
   ast::MemberAccessorExpression expr(
       create<ast::MemberAccessorExpression>(
@@ -685,7 +685,7 @@
 
   // ident.yxz.x
 
-  ast::Variable var("ident", ast::StorageClass::kFunction, &vec3);
+  ast::Variable var(Source{}, "ident", ast::StorageClass::kFunction, &vec3);
 
   ast::MemberAccessorExpression expr(
       create<ast::MemberAccessorExpression>(
@@ -723,7 +723,7 @@
 
   // index.yxz[1]
 
-  ast::Variable var("ident", ast::StorageClass::kFunction, &vec3);
+  ast::Variable var(Source{}, "ident", ast::StorageClass::kFunction, &vec3);
 
   ast::ArrayAccessorExpression expr(
       create<ast::MemberAccessorExpression>(
@@ -792,7 +792,8 @@
 
   ast::type::Array a_ary_type(&a_type, 2);
 
-  ast::Variable var("index", ast::StorageClass::kFunction, &a_ary_type);
+  ast::Variable var(Source{}, "index", ast::StorageClass::kFunction,
+                    &a_ary_type);
 
   ast::MemberAccessorExpression expr(
       create<ast::MemberAccessorExpression>(
@@ -884,7 +885,7 @@
                     create<ast::FloatLiteral>(&f32, -0.5)),
             }));
 
-  ast::Variable var("pos", ast::StorageClass::kPrivate, &arr);
+  ast::Variable var(Source{}, "pos", ast::StorageClass::kPrivate, &arr);
   var.set_is_const(true);
   var.set_constructor(create<ast::TypeConstructorExpression>(&arr, ary_params));
 
@@ -940,7 +941,7 @@
   vec_params.push_back(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 0.5)));
 
-  ast::Variable var("pos", ast::StorageClass::kPrivate, &vec);
+  ast::Variable var(Source{}, "pos", ast::StorageClass::kPrivate, &vec);
   var.set_is_const(true);
   var.set_constructor(
       create<ast::TypeConstructorExpression>(&vec, std::move(vec_params)));
diff --git a/src/writer/spirv/builder_assign_test.cc b/src/writer/spirv/builder_assign_test.cc
index c8ee307..5a6d44c 100644
--- a/src/writer/spirv/builder_assign_test.cc
+++ b/src/writer/spirv/builder_assign_test.cc
@@ -44,7 +44,7 @@
 TEST_F(BuilderTest, Assign_Var) {
   ast::type::F32 f32;
 
-  ast::Variable v("var", ast::StorageClass::kOutput, &f32);
+  ast::Variable v(Source{}, "var", ast::StorageClass::kOutput, &f32);
 
   auto* ident = create<ast::IdentifierExpression>("var");
   auto* val = create<ast::ScalarConstructorExpression>(
@@ -78,7 +78,7 @@
   ast::type::F32 f32;
   ast::type::Vector vec(&f32, 3);
 
-  ast::Variable v("var", ast::StorageClass::kOutput, &vec);
+  ast::Variable v(Source{}, "var", ast::StorageClass::kOutput, &vec);
 
   auto* ident = create<ast::IdentifierExpression>("var");
   ast::ExpressionList vals;
@@ -128,7 +128,7 @@
                      create<ast::FloatLiteral>(&f32, 3.0f)),
              });
 
-  ast::Variable v("var", ast::StorageClass::kOutput, &vec3);
+  ast::Variable v(Source{}, "var", ast::StorageClass::kOutput, &vec3);
 
   ast::AssignmentStatement assign(create<ast::IdentifierExpression>("var"),
                                   init);
@@ -176,7 +176,7 @@
 
   auto* init = create<ast::TypeConstructorExpression>(&vec3, vals);
 
-  ast::Variable v("var", ast::StorageClass::kOutput, &vec3);
+  ast::Variable v(Source{}, "var", ast::StorageClass::kOutput, &vec3);
 
   ast::AssignmentStatement assign(create<ast::IdentifierExpression>("var"),
                                   init);
@@ -223,7 +223,7 @@
   auto* s = create<ast::Struct>(members);
   ast::type::Struct s_type("my_struct", s);
 
-  ast::Variable v("ident", ast::StorageClass::kFunction, &s_type);
+  ast::Variable v(Source{}, "ident", ast::StorageClass::kFunction, &s_type);
 
   auto* ident = create<ast::MemberAccessorExpression>(
       create<ast::IdentifierExpression>("ident"),
@@ -265,7 +265,7 @@
   ast::type::F32 f32;
   ast::type::Vector vec3(&f32, 3);
 
-  ast::Variable v("var", ast::StorageClass::kOutput, &vec3);
+  ast::Variable v(Source{}, "var", ast::StorageClass::kOutput, &vec3);
 
   auto* ident = create<ast::IdentifierExpression>("var");
 
@@ -312,7 +312,7 @@
 
   // var.y = 1
 
-  ast::Variable v("var", ast::StorageClass::kOutput, &vec3);
+  ast::Variable v(Source{}, "var", ast::StorageClass::kOutput, &vec3);
 
   auto* ident = create<ast::MemberAccessorExpression>(
       create<ast::IdentifierExpression>("var"),
@@ -357,7 +357,7 @@
 
   // var[1] = 1
 
-  ast::Variable v("var", ast::StorageClass::kOutput, &vec3);
+  ast::Variable v(Source{}, "var", ast::StorageClass::kOutput, &vec3);
 
   auto* ident = create<ast::ArrayAccessorExpression>(
       create<ast::IdentifierExpression>("var"),
diff --git a/src/writer/spirv/builder_binary_expression_test.cc b/src/writer/spirv/builder_binary_expression_test.cc
index 89e9af8..8920a66 100644
--- a/src/writer/spirv/builder_binary_expression_test.cc
+++ b/src/writer/spirv/builder_binary_expression_test.cc
@@ -121,7 +121,7 @@
 
   ast::type::I32 i32;
 
-  ast::Variable var("param", ast::StorageClass::kFunction, &i32);
+  ast::Variable var(Source{}, "param", ast::StorageClass::kFunction, &i32);
 
   auto* lhs = create<ast::IdentifierExpression>("param");
   auto* rhs = create<ast::IdentifierExpression>("param");
@@ -633,7 +633,8 @@
   ast::type::F32 f32;
   ast::type::Matrix mat3(&f32, 3, 3);
 
-  auto* var = create<ast::Variable>("mat", ast::StorageClass::kFunction, &mat3);
+  auto* var = create<ast::Variable>(Source{}, "mat",
+                                    ast::StorageClass::kFunction, &mat3);
   auto* lhs = create<ast::IdentifierExpression>("mat");
   auto* rhs = create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 1.f));
@@ -665,7 +666,8 @@
   ast::type::F32 f32;
   ast::type::Matrix mat3(&f32, 3, 3);
 
-  auto* var = create<ast::Variable>("mat", ast::StorageClass::kFunction, &mat3);
+  auto* var = create<ast::Variable>(Source{}, "mat",
+                                    ast::StorageClass::kFunction, &mat3);
   auto* lhs = create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 1.f));
   auto* rhs = create<ast::IdentifierExpression>("mat");
@@ -698,7 +700,8 @@
   ast::type::Vector vec3(&f32, 3);
   ast::type::Matrix mat3(&f32, 3, 3);
 
-  auto* var = create<ast::Variable>("mat", ast::StorageClass::kFunction, &mat3);
+  auto* var = create<ast::Variable>(Source{}, "mat",
+                                    ast::StorageClass::kFunction, &mat3);
   auto* lhs = create<ast::IdentifierExpression>("mat");
 
   ast::ExpressionList vals;
@@ -739,7 +742,8 @@
   ast::type::Vector vec3(&f32, 3);
   ast::type::Matrix mat3(&f32, 3, 3);
 
-  auto* var = create<ast::Variable>("mat", ast::StorageClass::kFunction, &mat3);
+  auto* var = create<ast::Variable>(Source{}, "mat",
+                                    ast::StorageClass::kFunction, &mat3);
 
   ast::ExpressionList vals;
   vals.push_back(create<ast::ScalarConstructorExpression>(
@@ -781,7 +785,8 @@
   ast::type::Vector vec3(&f32, 3);
   ast::type::Matrix mat3(&f32, 3, 3);
 
-  auto* var = create<ast::Variable>("mat", ast::StorageClass::kFunction, &mat3);
+  auto* var = create<ast::Variable>(Source{}, "mat",
+                                    ast::StorageClass::kFunction, &mat3);
   auto* lhs = create<ast::IdentifierExpression>("mat");
   auto* rhs = create<ast::IdentifierExpression>("mat");
 
@@ -856,12 +861,12 @@
 TEST_F(BuilderTest, Binary_LogicalAnd_WithLoads) {
   ast::type::Bool bool_type;
 
-  auto* a_var =
-      create<ast::Variable>("a", ast::StorageClass::kFunction, &bool_type);
+  auto* a_var = create<ast::Variable>(Source{}, "a",
+                                      ast::StorageClass::kFunction, &bool_type);
   a_var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::BoolLiteral>(&bool_type, true)));
-  auto* b_var =
-      create<ast::Variable>("b", ast::StorageClass::kFunction, &bool_type);
+  auto* b_var = create<ast::Variable>(Source{}, "b",
+                                      ast::StorageClass::kFunction, &bool_type);
   b_var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::BoolLiteral>(&bool_type, false)));
 
@@ -1042,12 +1047,12 @@
 TEST_F(BuilderTest, Binary_LogicalOr_WithLoads) {
   ast::type::Bool bool_type;
 
-  auto* a_var =
-      create<ast::Variable>("a", ast::StorageClass::kFunction, &bool_type);
+  auto* a_var = create<ast::Variable>(Source{}, "a",
+                                      ast::StorageClass::kFunction, &bool_type);
   a_var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::BoolLiteral>(&bool_type, true)));
-  auto* b_var =
-      create<ast::Variable>("b", ast::StorageClass::kFunction, &bool_type);
+  auto* b_var = create<ast::Variable>(Source{}, "b",
+                                      ast::StorageClass::kFunction, &bool_type);
   b_var->set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::BoolLiteral>(&bool_type, false)));
 
diff --git a/src/writer/spirv/builder_block_test.cc b/src/writer/spirv/builder_block_test.cc
index 192a0d2..8be8d5e 100644
--- a/src/writer/spirv/builder_block_test.cc
+++ b/src/writer/spirv/builder_block_test.cc
@@ -41,16 +41,16 @@
   // serves to prove the block code is pushing new scopes as needed.
   ast::BlockStatement outer;
 
-  outer.append(create<ast::VariableDeclStatement>(
-      create<ast::Variable>("var", ast::StorageClass::kFunction, &f32)));
+  outer.append(create<ast::VariableDeclStatement>(create<ast::Variable>(
+      Source{}, "var", ast::StorageClass::kFunction, &f32)));
   outer.append(create<ast::AssignmentStatement>(
       create<ast::IdentifierExpression>("var"),
       create<ast::ScalarConstructorExpression>(
           create<ast::FloatLiteral>(&f32, 1.0f))));
 
   auto* inner = create<ast::BlockStatement>();
-  inner->append(create<ast::VariableDeclStatement>(
-      create<ast::Variable>("var", ast::StorageClass::kFunction, &f32)));
+  inner->append(create<ast::VariableDeclStatement>(create<ast::Variable>(
+      Source{}, "var", ast::StorageClass::kFunction, &f32)));
   inner->append(create<ast::AssignmentStatement>(
       create<ast::IdentifierExpression>("var"),
       create<ast::ScalarConstructorExpression>(
diff --git a/src/writer/spirv/builder_call_test.cc b/src/writer/spirv/builder_call_test.cc
index b0c3b82..fff29bf 100644
--- a/src/writer/spirv/builder_call_test.cc
+++ b/src/writer/spirv/builder_call_test.cc
@@ -44,9 +44,9 @@
 
   ast::VariableList func_params;
   func_params.push_back(
-      create<ast::Variable>("a", ast::StorageClass::kFunction, &f32));
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kFunction, &f32));
   func_params.push_back(
-      create<ast::Variable>("b", ast::StorageClass::kFunction, &f32));
+      create<ast::Variable>(Source{}, "b", ast::StorageClass::kFunction, &f32));
 
   auto* body = create<ast::BlockStatement>();
   body->append(create<ast::ReturnStatement>(create<ast::BinaryExpression>(
@@ -108,9 +108,9 @@
 
   ast::VariableList func_params;
   func_params.push_back(
-      create<ast::Variable>("a", ast::StorageClass::kFunction, &f32));
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kFunction, &f32));
   func_params.push_back(
-      create<ast::Variable>("b", ast::StorageClass::kFunction, &f32));
+      create<ast::Variable>(Source{}, "b", ast::StorageClass::kFunction, &f32));
 
   auto* body = create<ast::BlockStatement>();
   body->append(create<ast::ReturnStatement>(create<ast::BinaryExpression>(
diff --git a/src/writer/spirv/builder_function_decoration_test.cc b/src/writer/spirv/builder_function_decoration_test.cc
index 2aa4cc5..cb5da8a 100644
--- a/src/writer/spirv/builder_function_decoration_test.cc
+++ b/src/writer/spirv/builder_function_decoration_test.cc
@@ -102,11 +102,12 @@
           create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}),
       });
 
-  auto* v_in = create<ast::Variable>("my_in", ast::StorageClass::kInput, &f32);
-  auto* v_out =
-      create<ast::Variable>("my_out", ast::StorageClass::kOutput, &f32);
-  auto* v_wg =
-      create<ast::Variable>("my_wg", ast::StorageClass::kWorkgroup, &f32);
+  auto* v_in =
+      create<ast::Variable>(Source{}, "my_in", ast::StorageClass::kInput, &f32);
+  auto* v_out = create<ast::Variable>(Source{}, "my_out",
+                                      ast::StorageClass::kOutput, &f32);
+  auto* v_wg = create<ast::Variable>(Source{}, "my_wg",
+                                     ast::StorageClass::kWorkgroup, &f32);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(v_in)) << b.error();
   EXPECT_TRUE(b.GenerateGlobalVariable(v_out)) << b.error();
@@ -161,11 +162,12 @@
       create<ast::IdentifierExpression>("my_in")));
   func.set_body(body);
 
-  auto* v_in = create<ast::Variable>("my_in", ast::StorageClass::kInput, &f32);
-  auto* v_out =
-      create<ast::Variable>("my_out", ast::StorageClass::kOutput, &f32);
-  auto* v_wg =
-      create<ast::Variable>("my_wg", ast::StorageClass::kWorkgroup, &f32);
+  auto* v_in =
+      create<ast::Variable>(Source{}, "my_in", ast::StorageClass::kInput, &f32);
+  auto* v_out = create<ast::Variable>(Source{}, "my_out",
+                                      ast::StorageClass::kOutput, &f32);
+  auto* v_wg = create<ast::Variable>(Source{}, "my_wg",
+                                     ast::StorageClass::kWorkgroup, &f32);
 
   td.RegisterVariableForTesting(v_in);
   td.RegisterVariableForTesting(v_out);
diff --git a/src/writer/spirv/builder_function_test.cc b/src/writer/spirv/builder_function_test.cc
index 6121675..82de2af 100644
--- a/src/writer/spirv/builder_function_test.cc
+++ b/src/writer/spirv/builder_function_test.cc
@@ -87,7 +87,8 @@
   ast::type::Void void_type;
   ast::type::F32 f32;
 
-  auto* var_a = create<ast::Variable>("a", ast::StorageClass::kPrivate, &f32);
+  auto* var_a =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kPrivate, &f32);
   td.RegisterVariableForTesting(var_a);
 
   auto* body = create<ast::BlockStatement>();
@@ -142,10 +143,12 @@
   ast::type::I32 i32;
 
   ast::VariableList params;
-  auto* var_a = create<ast::Variable>("a", ast::StorageClass::kFunction, &f32);
+  auto* var_a =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kFunction, &f32);
   var_a->set_is_const(true);
   params.push_back(var_a);
-  auto* var_b = create<ast::Variable>("b", ast::StorageClass::kFunction, &i32);
+  auto* var_b =
+      create<ast::Variable>(Source{}, "b", ast::StorageClass::kFunction, &i32);
   var_b->set_is_const(true);
   params.push_back(var_b);
 
@@ -256,8 +259,8 @@
   ast::type::Struct s("Data", str);
   ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s);
 
-  auto* data_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("data", ast::StorageClass::kStorageBuffer, &ac));
+  auto* data_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &ac));
 
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::BindingDecoration>(0, Source{}));
@@ -271,7 +274,8 @@
 
   {
     ast::VariableList params;
-    auto* var = create<ast::Variable>("v", ast::StorageClass::kFunction, &f32);
+    auto* var = create<ast::Variable>(Source{}, "v",
+                                      ast::StorageClass::kFunction, &f32);
     var->set_constructor(create<ast::MemberAccessorExpression>(
         create<ast::IdentifierExpression>("data"),
         create<ast::IdentifierExpression>("d")));
@@ -292,7 +296,8 @@
 
   {
     ast::VariableList params;
-    auto* var = create<ast::Variable>("v", ast::StorageClass::kFunction, &f32);
+    auto* var = create<ast::Variable>(Source{}, "v",
+                                      ast::StorageClass::kFunction, &f32);
     var->set_constructor(create<ast::MemberAccessorExpression>(
         create<ast::IdentifierExpression>("data"),
         create<ast::IdentifierExpression>("d")));
diff --git a/src/writer/spirv/builder_function_variable_test.cc b/src/writer/spirv/builder_function_variable_test.cc
index 163f66e..2ff1a23 100644
--- a/src/writer/spirv/builder_function_variable_test.cc
+++ b/src/writer/spirv/builder_function_variable_test.cc
@@ -47,7 +47,7 @@
 
 TEST_F(BuilderTest, FunctionVar_NoStorageClass) {
   ast::type::F32 f32;
-  ast::Variable v("var", ast::StorageClass::kNone, &f32);
+  ast::Variable v(Source{}, "var", ast::StorageClass::kNone, &f32);
 
   b.push_function(Function{});
   EXPECT_TRUE(b.GenerateFunctionVariable(&v)) << b.error();
@@ -80,7 +80,7 @@
 
   EXPECT_TRUE(td.DetermineResultType(init)) << td.error();
 
-  ast::Variable v("var", ast::StorageClass::kOutput, &f32);
+  ast::Variable v(Source{}, "var", ast::StorageClass::kOutput, &f32);
   v.set_constructor(init);
 
   td.RegisterVariableForTesting(&v);
@@ -126,7 +126,7 @@
 
   EXPECT_TRUE(td.DetermineResultType(init)) << td.error();
 
-  ast::Variable v("var", ast::StorageClass::kFunction, &vec);
+  ast::Variable v(Source{}, "var", ast::StorageClass::kFunction, &vec);
   v.set_constructor(init);
 
   td.RegisterVariableForTesting(&v);
@@ -164,11 +164,11 @@
 
   ASSERT_TRUE(td.DetermineResultType(init)) << td.error();
 
-  ast::Variable v("v", ast::StorageClass::kFunction, &f32);
+  ast::Variable v(Source{}, "v", ast::StorageClass::kFunction, &f32);
   v.set_constructor(init);
   td.RegisterVariableForTesting(&v);
 
-  ast::Variable v2("v2", ast::StorageClass::kFunction, &f32);
+  ast::Variable v2(Source{}, "v2", ast::StorageClass::kFunction, &f32);
   v2.set_constructor(create<ast::IdentifierExpression>("v"));
   td.RegisterVariableForTesting(&v2);
 
@@ -209,11 +209,11 @@
 
   EXPECT_TRUE(td.DetermineResultType(init)) << td.error();
 
-  ast::Variable v("v", ast::StorageClass::kFunction, &f32);
+  ast::Variable v(Source{}, "v", ast::StorageClass::kFunction, &f32);
   v.set_constructor(init);
   td.RegisterVariableForTesting(&v);
 
-  ast::Variable v2("v2", ast::StorageClass::kFunction, &f32);
+  ast::Variable v2(Source{}, "v2", ast::StorageClass::kFunction, &f32);
   v2.set_is_const(true);
   v2.set_constructor(create<ast::IdentifierExpression>("v"));
   td.RegisterVariableForTesting(&v2);
@@ -257,7 +257,7 @@
 
   EXPECT_TRUE(td.DetermineResultType(init)) << td.error();
 
-  ast::Variable v("var", ast::StorageClass::kOutput, &f32);
+  ast::Variable v(Source{}, "var", ast::StorageClass::kOutput, &f32);
   v.set_constructor(init);
   v.set_is_const(true);
 
diff --git a/src/writer/spirv/builder_global_variable_test.cc b/src/writer/spirv/builder_global_variable_test.cc
index 5a3bd8c..71408bb 100644
--- a/src/writer/spirv/builder_global_variable_test.cc
+++ b/src/writer/spirv/builder_global_variable_test.cc
@@ -52,7 +52,7 @@
 
 TEST_F(BuilderTest, GlobalVar_NoStorageClass) {
   ast::type::F32 f32;
-  ast::Variable v("var", ast::StorageClass::kNone, &f32);
+  ast::Variable v(Source{}, "var", ast::StorageClass::kNone, &f32);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&v)) << b.error();
   EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
@@ -66,7 +66,7 @@
 
 TEST_F(BuilderTest, GlobalVar_WithStorageClass) {
   ast::type::F32 f32;
-  ast::Variable v("var", ast::StorageClass::kOutput, &f32);
+  ast::Variable v(Source{}, "var", ast::StorageClass::kOutput, &f32);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&v)) << b.error();
   EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
@@ -80,7 +80,7 @@
 
 TEST_F(BuilderTest, GlobalVar_WithStorageClass_Input) {
   ast::type::F32 f32;
-  ast::Variable v("var", ast::StorageClass::kInput, &f32);
+  ast::Variable v(Source{}, "var", ast::StorageClass::kInput, &f32);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&v)) << b.error();
   EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
@@ -107,7 +107,7 @@
 
   EXPECT_TRUE(td.DetermineResultType(init)) << td.error();
 
-  ast::Variable v("var", ast::StorageClass::kOutput, &f32);
+  ast::Variable v(Source{}, "var", ast::StorageClass::kOutput, &f32);
   v.set_constructor(init);
   td.RegisterVariableForTesting(&v);
 
@@ -142,7 +142,7 @@
 
   EXPECT_TRUE(td.DetermineResultType(init)) << td.error();
 
-  ast::Variable v("var", ast::StorageClass::kOutput, &f32);
+  ast::Variable v(Source{}, "var", ast::StorageClass::kOutput, &f32);
   v.set_constructor(init);
   v.set_is_const(true);
   td.RegisterVariableForTesting(&v);
@@ -175,7 +175,7 @@
 
   EXPECT_TRUE(td.DetermineResultType(init)) << td.error();
 
-  ast::Variable v("var", ast::StorageClass::kOutput, &f32);
+  ast::Variable v(Source{}, "var", ast::StorageClass::kOutput, &f32);
   v.set_constructor(init);
   v.set_is_const(true);
   td.RegisterVariableForTesting(&v);
@@ -214,7 +214,7 @@
 
   EXPECT_TRUE(td.DetermineResultType(init)) << td.error();
 
-  ast::Variable v("var", ast::StorageClass::kOutput, &f32);
+  ast::Variable v(Source{}, "var", ast::StorageClass::kOutput, &f32);
   v.set_constructor(init);
   v.set_is_const(true);
   td.RegisterVariableForTesting(&v);
@@ -240,7 +240,8 @@
 
 TEST_F(BuilderTest, GlobalVar_WithLocation) {
   ast::type::F32 f32;
-  auto* v = create<ast::Variable>("var", ast::StorageClass::kOutput, &f32);
+  auto* v =
+      create<ast::Variable>(Source{}, "var", ast::StorageClass::kOutput, &f32);
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::LocationDecoration>(5, Source{}));
 
@@ -261,7 +262,8 @@
 
 TEST_F(BuilderTest, GlobalVar_WithBindingAndSet) {
   ast::type::F32 f32;
-  auto* v = create<ast::Variable>("var", ast::StorageClass::kOutput, &f32);
+  auto* v =
+      create<ast::Variable>(Source{}, "var", ast::StorageClass::kOutput, &f32);
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::BindingDecoration>(2, Source{}));
   decos.push_back(create<ast::SetDecoration>(3, Source{}));
@@ -284,7 +286,8 @@
 
 TEST_F(BuilderTest, GlobalVar_WithBuiltin) {
   ast::type::F32 f32;
-  auto* v = create<ast::Variable>("var", ast::StorageClass::kOutput, &f32);
+  auto* v =
+      create<ast::Variable>(Source{}, "var", ast::StorageClass::kOutput, &f32);
   ast::VariableDecorationList decos;
   decos.push_back(
       create<ast::BuiltinDecoration>(ast::Builtin::kPosition, Source{}));
@@ -310,8 +313,8 @@
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::ConstantIdDecoration>(1200, Source{}));
 
-  ast::DecoratedVariable v(
-      create<ast::Variable>("var", ast::StorageClass::kNone, &bool_type));
+  ast::DecoratedVariable v(create<ast::Variable>(
+      Source{}, "var", ast::StorageClass::kNone, &bool_type));
   v.set_decorations(decos);
   v.set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::BoolLiteral>(&bool_type, true)));
@@ -334,8 +337,8 @@
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::ConstantIdDecoration>(1200, Source{}));
 
-  ast::DecoratedVariable v(
-      create<ast::Variable>("var", ast::StorageClass::kNone, &bool_type));
+  ast::DecoratedVariable v(create<ast::Variable>(
+      Source{}, "var", ast::StorageClass::kNone, &bool_type));
   v.set_decorations(decos);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&v)) << b.error();
@@ -357,7 +360,7 @@
   decos.push_back(create<ast::ConstantIdDecoration>(0, Source{}));
 
   ast::DecoratedVariable v(
-      create<ast::Variable>("var", ast::StorageClass::kNone, &f32));
+      create<ast::Variable>(Source{}, "var", ast::StorageClass::kNone, &f32));
   v.set_decorations(decos);
   v.set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::FloatLiteral>(&f32, 2.0)));
@@ -381,7 +384,7 @@
   decos.push_back(create<ast::ConstantIdDecoration>(0, Source{}));
 
   ast::DecoratedVariable v(
-      create<ast::Variable>("var", ast::StorageClass::kNone, &f32));
+      create<ast::Variable>(Source{}, "var", ast::StorageClass::kNone, &f32));
   v.set_decorations(decos);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&v)) << b.error();
@@ -403,7 +406,7 @@
   decos.push_back(create<ast::ConstantIdDecoration>(0, Source{}));
 
   ast::DecoratedVariable v(
-      create<ast::Variable>("var", ast::StorageClass::kNone, &i32));
+      create<ast::Variable>(Source{}, "var", ast::StorageClass::kNone, &i32));
   v.set_decorations(decos);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&v)) << b.error();
@@ -425,7 +428,7 @@
   decos.push_back(create<ast::ConstantIdDecoration>(0, Source{}));
 
   ast::DecoratedVariable v(
-      create<ast::Variable>("var", ast::StorageClass::kNone, &u32));
+      create<ast::Variable>(Source{}, "var", ast::StorageClass::kNone, &u32));
   v.set_decorations(decos);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&v)) << b.error();
@@ -490,7 +493,7 @@
   ast::type::Struct A("A", create<ast::Struct>(members));
   ast::type::AccessControl ac{ast::AccessControl::kReadOnly, &A};
 
-  ast::Variable var("b", ast::StorageClass::kStorageBuffer, &ac);
+  ast::Variable var(Source{}, "b", ast::StorageClass::kStorageBuffer, &ac);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&var)) << b.error();
 
@@ -526,7 +529,7 @@
   ast::type::Alias B("B", &A);
   ast::type::AccessControl ac{ast::AccessControl::kReadOnly, &B};
 
-  ast::Variable var("b", ast::StorageClass::kStorageBuffer, &ac);
+  ast::Variable var(Source{}, "b", ast::StorageClass::kStorageBuffer, &ac);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&var)) << b.error();
 
@@ -560,7 +563,7 @@
   ast::type::AccessControl ac{ast::AccessControl::kReadOnly, &A};
   ast::type::Alias B("B", &ac);
 
-  ast::Variable var("b", ast::StorageClass::kStorageBuffer, &B);
+  ast::Variable var(Source{}, "b", ast::StorageClass::kStorageBuffer, &B);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&var)) << b.error();
 
@@ -594,8 +597,8 @@
   ast::type::AccessControl read{ast::AccessControl::kReadOnly, &A};
   ast::type::AccessControl rw{ast::AccessControl::kReadWrite, &A};
 
-  ast::Variable var_b("b", ast::StorageClass::kStorageBuffer, &read);
-  ast::Variable var_c("c", ast::StorageClass::kStorageBuffer, &rw);
+  ast::Variable var_b(Source{}, "b", ast::StorageClass::kStorageBuffer, &read);
+  ast::Variable var_c(Source{}, "c", ast::StorageClass::kStorageBuffer, &rw);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&var_b)) << b.error();
   EXPECT_TRUE(b.GenerateGlobalVariable(&var_c)) << b.error();
@@ -626,7 +629,8 @@
                                  ast::type::ImageFormat::kR32Uint);
   ASSERT_TRUE(td.DetermineStorageTextureSubtype(&type)) << td.error();
 
-  ast::Variable var_a("a", ast::StorageClass::kUniformConstant, &type);
+  ast::Variable var_a(Source{}, "a", ast::StorageClass::kUniformConstant,
+                      &type);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&var_a)) << b.error();
 
@@ -646,7 +650,8 @@
                                  ast::type::ImageFormat::kR32Uint);
   ASSERT_TRUE(td.DetermineStorageTextureSubtype(&type)) << td.error();
 
-  ast::Variable var_a("a", ast::StorageClass::kUniformConstant, &type);
+  ast::Variable var_a(Source{}, "a", ast::StorageClass::kUniformConstant,
+                      &type);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&var_a)) << b.error();
 
diff --git a/src/writer/spirv/builder_ident_expression_test.cc b/src/writer/spirv/builder_ident_expression_test.cc
index 661082b..2a48e53 100644
--- a/src/writer/spirv/builder_ident_expression_test.cc
+++ b/src/writer/spirv/builder_ident_expression_test.cc
@@ -53,7 +53,7 @@
 
   EXPECT_TRUE(td.DetermineResultType(init)) << td.error();
 
-  ast::Variable v("var", ast::StorageClass::kOutput, &f32);
+  ast::Variable v(Source{}, "var", ast::StorageClass::kOutput, &f32);
   v.set_constructor(init);
   v.set_is_const(true);
 
@@ -77,7 +77,7 @@
 
 TEST_F(BuilderTest, IdentifierExpression_GlobalVar) {
   ast::type::F32 f32;
-  ast::Variable v("var", ast::StorageClass::kOutput, &f32);
+  ast::Variable v(Source{}, "var", ast::StorageClass::kOutput, &f32);
 
   td.RegisterVariableForTesting(&v);
 
@@ -112,7 +112,7 @@
 
   EXPECT_TRUE(td.DetermineResultType(init)) << td.error();
 
-  ast::Variable v("var", ast::StorageClass::kOutput, &f32);
+  ast::Variable v(Source{}, "var", ast::StorageClass::kOutput, &f32);
   v.set_constructor(init);
   v.set_is_const(true);
   td.RegisterVariableForTesting(&v);
@@ -134,7 +134,7 @@
 
 TEST_F(BuilderTest, IdentifierExpression_FunctionVar) {
   ast::type::F32 f32;
-  ast::Variable v("var", ast::StorageClass::kNone, &f32);
+  ast::Variable v(Source{}, "var", ast::StorageClass::kNone, &f32);
 
   td.RegisterVariableForTesting(&v);
 
@@ -160,7 +160,7 @@
 TEST_F(BuilderTest, IdentifierExpression_Load) {
   ast::type::I32 i32;
 
-  ast::Variable var("var", ast::StorageClass::kPrivate, &i32);
+  ast::Variable var(Source{}, "var", ast::StorageClass::kPrivate, &i32);
 
   td.RegisterVariableForTesting(&var);
 
@@ -190,7 +190,7 @@
 TEST_F(BuilderTest, IdentifierExpression_NoLoadConst) {
   ast::type::I32 i32;
 
-  ast::Variable var("var", ast::StorageClass::kNone, &i32);
+  ast::Variable var(Source{}, "var", ast::StorageClass::kNone, &i32);
   var.set_constructor(create<ast::ScalarConstructorExpression>(
       create<ast::SintLiteral>(&i32, 2)));
   var.set_is_const(true);
diff --git a/src/writer/spirv/builder_if_test.cc b/src/writer/spirv/builder_if_test.cc
index 768604a..4ad6d01 100644
--- a/src/writer/spirv/builder_if_test.cc
+++ b/src/writer/spirv/builder_if_test.cc
@@ -75,7 +75,8 @@
   // if (true) {
   //   v = 2;
   // }
-  auto* var = create<ast::Variable>("v", ast::StorageClass::kPrivate, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kPrivate, &i32);
 
   auto* body = create<ast::BlockStatement>();
   body->append(
@@ -122,7 +123,8 @@
   // } else {
   //   v = 3;
   // }
-  auto* var = create<ast::Variable>("v", ast::StorageClass::kPrivate, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kPrivate, &i32);
 
   auto* body = create<ast::BlockStatement>();
   body->append(
@@ -181,7 +183,8 @@
   // } elseif (true) {
   //   v = 3;
   // }
-  auto* var = create<ast::Variable>("v", ast::StorageClass::kPrivate, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kPrivate, &i32);
 
   auto* body = create<ast::BlockStatement>();
   body->append(
@@ -252,7 +255,8 @@
   // } else {
   //   v = 5;
   // }
-  auto* var = create<ast::Variable>("v", ast::StorageClass::kPrivate, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kPrivate, &i32);
 
   auto* body = create<ast::BlockStatement>();
   body->append(
@@ -605,8 +609,8 @@
   // }
 
   ast::type::Bool bool_type;
-  auto* var =
-      create<ast::Variable>("a", ast::StorageClass::kFunction, &bool_type);
+  auto* var = create<ast::Variable>(Source{}, "a", ast::StorageClass::kFunction,
+                                    &bool_type);
   td.RegisterVariableForTesting(var);
 
   ast::IfStatement expr(Source{}, create<ast::IdentifierExpression>("a"),
diff --git a/src/writer/spirv/builder_loop_test.cc b/src/writer/spirv/builder_loop_test.cc
index 66ced50..dbaa6bc 100644
--- a/src/writer/spirv/builder_loop_test.cc
+++ b/src/writer/spirv/builder_loop_test.cc
@@ -65,7 +65,8 @@
   // loop {
   //   v = 2;
   // }
-  auto* var = create<ast::Variable>("v", ast::StorageClass::kPrivate, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kPrivate, &i32);
 
   auto* body = create<ast::BlockStatement>();
   body->append(
@@ -111,7 +112,8 @@
   //   }
   // }
 
-  auto* var = create<ast::Variable>("v", ast::StorageClass::kPrivate, &i32);
+  auto* var =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kPrivate, &i32);
 
   auto* body = create<ast::BlockStatement>();
   body->append(
diff --git a/src/writer/spirv/builder_return_test.cc b/src/writer/spirv/builder_return_test.cc
index b7912bb..db18f85 100644
--- a/src/writer/spirv/builder_return_test.cc
+++ b/src/writer/spirv/builder_return_test.cc
@@ -81,7 +81,7 @@
 TEST_F(BuilderTest, Return_WithValue_GeneratesLoad) {
   ast::type::F32 f32;
 
-  ast::Variable var("param", ast::StorageClass::kFunction, &f32);
+  ast::Variable var(Source{}, "param", ast::StorageClass::kFunction, &f32);
 
   ast::ReturnStatement ret(create<ast::IdentifierExpression>("param"));
 
diff --git a/src/writer/spirv/builder_switch_test.cc b/src/writer/spirv/builder_switch_test.cc
index e95cd6c..5497511 100644
--- a/src/writer/spirv/builder_switch_test.cc
+++ b/src/writer/spirv/builder_switch_test.cc
@@ -76,8 +76,10 @@
   //     v = 2;
   // }
 
-  auto* v = create<ast::Variable>("v", ast::StorageClass::kPrivate, &i32);
-  auto* a = create<ast::Variable>("a", ast::StorageClass::kPrivate, &i32);
+  auto* v =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kPrivate, &i32);
+  auto* a =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kPrivate, &i32);
 
   auto* case_1_body = create<ast::BlockStatement>();
   case_1_body->append(
@@ -155,8 +157,10 @@
   //     v = 1;
   //  }
 
-  auto* v = create<ast::Variable>("v", ast::StorageClass::kPrivate, &i32);
-  auto* a = create<ast::Variable>("a", ast::StorageClass::kPrivate, &i32);
+  auto* v =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kPrivate, &i32);
+  auto* a =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kPrivate, &i32);
 
   auto* default_body = create<ast::BlockStatement>();
   default_body->append(
@@ -219,8 +223,10 @@
   //      v = 3;
   //  }
 
-  auto* v = create<ast::Variable>("v", ast::StorageClass::kPrivate, &i32);
-  auto* a = create<ast::Variable>("a", ast::StorageClass::kPrivate, &i32);
+  auto* v =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kPrivate, &i32);
+  auto* a =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kPrivate, &i32);
 
   auto* case_1_body = create<ast::BlockStatement>();
   case_1_body->append(
@@ -313,8 +319,10 @@
   //      v = 3;
   //  }
 
-  auto* v = create<ast::Variable>("v", ast::StorageClass::kPrivate, &i32);
-  auto* a = create<ast::Variable>("a", ast::StorageClass::kPrivate, &i32);
+  auto* v =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kPrivate, &i32);
+  auto* a =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kPrivate, &i32);
 
   auto* case_1_body = create<ast::BlockStatement>();
   case_1_body->append(
@@ -403,8 +411,10 @@
   //      fallthrough;
   //  }
 
-  auto* v = create<ast::Variable>("v", ast::StorageClass::kPrivate, &i32);
-  auto* a = create<ast::Variable>("a", ast::StorageClass::kPrivate, &i32);
+  auto* v =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kPrivate, &i32);
+  auto* a =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kPrivate, &i32);
 
   auto* case_1_body = create<ast::BlockStatement>();
   case_1_body->append(
@@ -449,8 +459,10 @@
   //     v = 1;
   //  }
 
-  auto* v = create<ast::Variable>("v", ast::StorageClass::kPrivate, &i32);
-  auto* a = create<ast::Variable>("a", ast::StorageClass::kPrivate, &i32);
+  auto* v =
+      create<ast::Variable>(Source{}, "v", ast::StorageClass::kPrivate, &i32);
+  auto* a =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kPrivate, &i32);
 
   auto* if_body = create<ast::BlockStatement>();
   if_body->append(create<ast::BreakStatement>());
diff --git a/src/writer/spirv/builder_unary_op_expression_test.cc b/src/writer/spirv/builder_unary_op_expression_test.cc
index 7fabad8..ef8da21 100644
--- a/src/writer/spirv/builder_unary_op_expression_test.cc
+++ b/src/writer/spirv/builder_unary_op_expression_test.cc
@@ -98,7 +98,7 @@
   ast::type::F32 f32;
   ast::type::Vector vec(&f32, 3);
 
-  ast::Variable var("param", ast::StorageClass::kFunction, &vec);
+  ast::Variable var(Source{}, "param", ast::StorageClass::kFunction, &vec);
 
   ast::UnaryOpExpression expr(ast::UnaryOp::kNegation,
                               create<ast::IdentifierExpression>("param"));
diff --git a/src/writer/wgsl/generator_impl_function_test.cc b/src/writer/wgsl/generator_impl_function_test.cc
index bb443c9..f93836d 100644
--- a/src/writer/wgsl/generator_impl_function_test.cc
+++ b/src/writer/wgsl/generator_impl_function_test.cc
@@ -68,8 +68,10 @@
   ast::type::F32 f32;
   ast::type::I32 i32;
   ast::VariableList params;
-  params.push_back(create<ast::Variable>("a", ast::StorageClass::kNone, &f32));
-  params.push_back(create<ast::Variable>("b", ast::StorageClass::kNone, &i32));
+  params.push_back(
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &f32));
+  params.push_back(
+      create<ast::Variable>(Source{}, "b", ast::StorageClass::kNone, &i32));
 
   ast::type::Void void_type;
   ast::Function func(Source{}, "my_func", params, &void_type, body,
@@ -189,8 +191,8 @@
   ast::type::Struct s("Data", str);
   ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s);
 
-  auto* data_var = create<ast::DecoratedVariable>(
-      create<ast::Variable>("data", ast::StorageClass::kStorageBuffer, &ac));
+  auto* data_var = create<ast::DecoratedVariable>(create<ast::Variable>(
+      Source{}, "data", ast::StorageClass::kStorageBuffer, &ac));
 
   ast::VariableDecorationList decos;
   decos.push_back(create<ast::BindingDecoration>(0, Source{}));
@@ -204,7 +206,8 @@
 
   {
     ast::VariableList params;
-    auto* var = create<ast::Variable>("v", ast::StorageClass::kFunction, &f32);
+    auto* var = create<ast::Variable>(Source{}, "v",
+                                      ast::StorageClass::kFunction, &f32);
     var->set_constructor(create<ast::MemberAccessorExpression>(
         create<ast::IdentifierExpression>("data"),
         create<ast::IdentifierExpression>("d")));
@@ -225,7 +228,8 @@
 
   {
     ast::VariableList params;
-    auto* var = create<ast::Variable>("v", ast::StorageClass::kFunction, &f32);
+    auto* var = create<ast::Variable>(Source{}, "v",
+                                      ast::StorageClass::kFunction, &f32);
     var->set_constructor(create<ast::MemberAccessorExpression>(
         create<ast::IdentifierExpression>("data"),
         create<ast::IdentifierExpression>("d")));
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 375e238..cd25fb6 100644
--- a/src/writer/wgsl/generator_impl_variable_decl_statement_test.cc
+++ b/src/writer/wgsl/generator_impl_variable_decl_statement_test.cc
@@ -32,7 +32,8 @@
 
 TEST_F(WgslGeneratorImplTest, Emit_VariableDeclStatement) {
   ast::type::F32 f32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kNone, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kNone, &f32);
 
   ast::VariableDeclStatement stmt(var);
 
@@ -47,7 +48,8 @@
   // storage class.  Rely on defaulting.
   // https://github.com/gpuweb/gpuweb/issues/654
   ast::type::F32 f32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kFunction, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kFunction, &f32);
 
   ast::VariableDeclStatement stmt(var);
 
@@ -59,7 +61,8 @@
 
 TEST_F(WgslGeneratorImplTest, Emit_VariableDeclStatement_Private) {
   ast::type::F32 f32;
-  auto* var = create<ast::Variable>("a", ast::StorageClass::kPrivate, &f32);
+  auto* var =
+      create<ast::Variable>(Source{}, "a", ast::StorageClass::kPrivate, &f32);
 
   ast::VariableDeclStatement stmt(var);
 
diff --git a/src/writer/wgsl/generator_impl_variable_test.cc b/src/writer/wgsl/generator_impl_variable_test.cc
index d342ba4..05b3dde 100644
--- a/src/writer/wgsl/generator_impl_variable_test.cc
+++ b/src/writer/wgsl/generator_impl_variable_test.cc
@@ -35,7 +35,7 @@
 
 TEST_F(WgslGeneratorImplTest, EmitVariable) {
   ast::type::F32 f32;
-  ast::Variable v("a", ast::StorageClass::kNone, &f32);
+  ast::Variable v(Source{}, "a", ast::StorageClass::kNone, &f32);
 
   ASSERT_TRUE(gen.EmitVariable(&v)) << gen.error();
   EXPECT_EQ(gen.result(), R"(var a : f32;
@@ -44,7 +44,7 @@
 
 TEST_F(WgslGeneratorImplTest, EmitVariable_StorageClass) {
   ast::type::F32 f32;
-  ast::Variable v("a", ast::StorageClass::kInput, &f32);
+  ast::Variable v(Source{}, "a", ast::StorageClass::kInput, &f32);
 
   ASSERT_TRUE(gen.EmitVariable(&v)) << gen.error();
   EXPECT_EQ(gen.result(), R"(var<in> a : f32;
@@ -94,7 +94,7 @@
   auto* ident = create<ast::IdentifierExpression>("initializer");
 
   ast::type::F32 f32;
-  ast::Variable v("a", ast::StorageClass::kNone, &f32);
+  ast::Variable v(Source{}, "a", ast::StorageClass::kNone, &f32);
   v.set_constructor(ident);
 
   ASSERT_TRUE(gen.EmitVariable(&v)) << gen.error();
@@ -106,7 +106,7 @@
   auto* ident = create<ast::IdentifierExpression>("initializer");
 
   ast::type::F32 f32;
-  ast::Variable v("a", ast::StorageClass::kNone, &f32);
+  ast::Variable v(Source{}, "a", ast::StorageClass::kNone, &f32);
   v.set_constructor(ident);
   v.set_is_const(true);