ast::TypesBuilder: Change const fields to getters

This is required in order to support move operators for TypesBuilder.

Bug: tint:390
Change-Id: I9667bda5f5be267df092f5cd94dc40db053ae6e2
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/38555
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/ast/bitcast_expression_test.cc b/src/ast/bitcast_expression_test.cc
index 186e4b7..56e2568 100644
--- a/src/ast/bitcast_expression_test.cc
+++ b/src/ast/bitcast_expression_test.cc
@@ -27,16 +27,16 @@
 TEST_F(BitcastExpressionTest, Create) {
   auto* expr = Expr("expr");
 
-  auto* exp = create<BitcastExpression>(ty.f32, expr);
-  ASSERT_EQ(exp->type(), ty.f32);
+  auto* exp = create<BitcastExpression>(ty.f32(), expr);
+  ASSERT_EQ(exp->type(), ty.f32());
   ASSERT_EQ(exp->expr(), expr);
 }
 
 TEST_F(BitcastExpressionTest, CreateWithSource) {
   auto* expr = Expr("expr");
 
-  auto* exp =
-      create<BitcastExpression>(Source{Source::Location{20, 2}}, ty.f32, expr);
+  auto* exp = create<BitcastExpression>(Source{Source::Location{20, 2}},
+                                        ty.f32(), expr);
   auto src = exp->source();
   EXPECT_EQ(src.range.begin.line, 20u);
   EXPECT_EQ(src.range.begin.column, 2u);
@@ -45,14 +45,14 @@
 TEST_F(BitcastExpressionTest, IsBitcast) {
   auto* expr = Expr("expr");
 
-  auto* exp = create<BitcastExpression>(ty.f32, expr);
+  auto* exp = create<BitcastExpression>(ty.f32(), expr);
   EXPECT_TRUE(exp->Is<BitcastExpression>());
 }
 
 TEST_F(BitcastExpressionTest, IsValid) {
   auto* expr = Expr("expr");
 
-  auto* exp = create<BitcastExpression>(ty.f32, expr);
+  auto* exp = create<BitcastExpression>(ty.f32(), expr);
   EXPECT_TRUE(exp->IsValid());
 }
 
@@ -64,20 +64,20 @@
 }
 
 TEST_F(BitcastExpressionTest, IsValid_MissingExpr) {
-  auto* exp = create<BitcastExpression>(ty.f32, nullptr);
+  auto* exp = create<BitcastExpression>(ty.f32(), nullptr);
   EXPECT_FALSE(exp->IsValid());
 }
 
 TEST_F(BitcastExpressionTest, IsValid_InvalidExpr) {
   auto* expr = Expr("");
-  auto* e = create<BitcastExpression>(ty.f32, expr);
+  auto* e = create<BitcastExpression>(ty.f32(), expr);
   EXPECT_FALSE(e->IsValid());
 }
 
 TEST_F(BitcastExpressionTest, ToStr) {
   auto* expr = Expr("expr");
 
-  auto* exp = create<BitcastExpression>(ty.f32, expr);
+  auto* exp = create<BitcastExpression>(ty.f32(), expr);
   std::ostringstream out;
   exp->to_str(out, 2);
 
diff --git a/src/ast/builder.cc b/src/ast/builder.cc
index de757c1..9e3062e 100644
--- a/src/ast/builder.cc
+++ b/src/ast/builder.cc
@@ -18,12 +18,7 @@
 namespace ast {
 
 TypesBuilder::TypesBuilder(Program* p)
-    : bool_(p->create<type::Bool>()),
-      f32(p->create<type::F32>()),
-      i32(p->create<type::I32>()),
-      u32(p->create<type::U32>()),
-      void_(p->create<type::Void>()),
-      program_(p) {}
+    : program_(p) {}
 
 Builder::Builder(Program* p) : program(p), ty(p), mod(p) {}
 
diff --git a/src/ast/builder.h b/src/ast/builder.h
index ed5baeb..bbb6ecf 100644
--- a/src/ast/builder.h
+++ b/src/ast/builder.h
@@ -59,23 +59,27 @@
   /// @param program the program
   explicit TypesBuilder(Program* program);
 
-  /// A boolean type
-  type::Bool* const bool_;
-  /// A f32 type
-  type::F32* const f32;
-  /// A i32 type
-  type::I32* const i32;
-  /// A u32 type
-  type::U32* const u32;
-  /// A void type
-  type::Void* const void_;
-
   /// @return the tint AST type for the C type `T`.
   template <typename T>
   type::Type* Of() const {
     return CToAST<T>::get(this);
   }
 
+  /// @returns A boolean type
+  type::Bool* bool_() const { return program_->create<type::Bool>(); }
+
+  /// @returns A f32 type
+  type::F32* f32() const { return program_->create<type::F32>(); }
+
+  /// @returns A i32 type
+  type::I32* i32() const { return program_->create<type::I32>(); }
+
+  /// @returns A u32 type
+  type::U32* u32() const { return program_->create<type::U32>(); }
+
+  /// @returns A void type
+  type::Void* void_() const { return program_->create<type::Void>(); }
+
   /// @return the tint AST type for a 2-element vector of the C type `T`.
   template <typename T>
   type::Vector* vec2() const {
@@ -310,19 +314,21 @@
 
   /// @param val the boolan value
   /// @return a boolean literal with the given value
-  BoolLiteral* Literal(bool val) { return create<BoolLiteral>(ty.bool_, val); }
+  BoolLiteral* Literal(bool val) {
+    return create<BoolLiteral>(ty.bool_(), val);
+  }
 
   /// @param val the float value
   /// @return a float literal with the given value
-  FloatLiteral* Literal(f32 val) { return create<FloatLiteral>(ty.f32, val); }
+  FloatLiteral* Literal(f32 val) { return create<FloatLiteral>(ty.f32(), val); }
 
   /// @param val the unsigned int value
   /// @return a UintLiteral with the given value
-  UintLiteral* Literal(u32 val) { return create<UintLiteral>(ty.u32, val); }
+  UintLiteral* Literal(u32 val) { return create<UintLiteral>(ty.u32(), val); }
 
   /// @param val the integer value
   /// @return the SintLiteral with the given value
-  SintLiteral* Literal(i32 val) { return create<SintLiteral>(ty.i32, val); }
+  SintLiteral* Literal(i32 val) { return create<SintLiteral>(ty.i32(), val); }
 
   /// @param args the arguments for the type constructor
   /// @return an `TypeConstructorExpression` of type `ty`, with the values
@@ -763,23 +769,23 @@
 // Various template specializations for TypesBuilder::CToAST.
 template <>
 struct TypesBuilder::CToAST<Builder::i32> {
-  static type::Type* get(const TypesBuilder* t) { return t->i32; }
+  static type::Type* get(const TypesBuilder* t) { return t->i32(); }
 };
 template <>
 struct TypesBuilder::CToAST<Builder::u32> {
-  static type::Type* get(const TypesBuilder* t) { return t->u32; }
+  static type::Type* get(const TypesBuilder* t) { return t->u32(); }
 };
 template <>
 struct TypesBuilder::CToAST<Builder::f32> {
-  static type::Type* get(const TypesBuilder* t) { return t->f32; }
+  static type::Type* get(const TypesBuilder* t) { return t->f32(); }
 };
 template <>
 struct TypesBuilder::CToAST<bool> {
-  static type::Type* get(const TypesBuilder* t) { return t->bool_; }
+  static type::Type* get(const TypesBuilder* t) { return t->bool_(); }
 };
 template <>
 struct TypesBuilder::CToAST<void> {
-  static type::Type* get(const TypesBuilder* t) { return t->void_; }
+  static type::Type* get(const TypesBuilder* t) { return t->void_(); }
 };
 //! @endcond
 
diff --git a/src/ast/case_statement_test.cc b/src/ast/case_statement_test.cc
index ae60ba1..ad54986 100644
--- a/src/ast/case_statement_test.cc
+++ b/src/ast/case_statement_test.cc
@@ -30,7 +30,7 @@
 
 TEST_F(CaseStatementTest, Creation_i32) {
   CaseSelectorList b;
-  auto* selector = create<SintLiteral>(ty.i32, 2);
+  auto* selector = create<SintLiteral>(ty.i32(), 2);
   b.push_back(selector);
 
   auto* discard = create<DiscardStatement>();
@@ -45,7 +45,7 @@
 
 TEST_F(CaseStatementTest, Creation_u32) {
   CaseSelectorList b;
-  auto* selector = create<SintLiteral>(ty.u32, 2);
+  auto* selector = create<SintLiteral>(ty.u32(), 2);
   b.push_back(selector);
 
   auto* discard = create<DiscardStatement>();
@@ -60,7 +60,7 @@
 
 TEST_F(CaseStatementTest, Creation_WithSource) {
   CaseSelectorList b;
-  b.push_back(create<SintLiteral>(ty.i32, 2));
+  b.push_back(create<SintLiteral>(ty.i32(), 2));
 
   auto* body = create<BlockStatement>(StatementList{
       create<DiscardStatement>(),
@@ -81,7 +81,7 @@
 
 TEST_F(CaseStatementTest, IsDefault_WithSelectors) {
   CaseSelectorList b;
-  b.push_back(create<SintLiteral>(ty.i32, 2));
+  b.push_back(create<SintLiteral>(ty.i32(), 2));
 
   auto* c = create<CaseStatement>(b, create<BlockStatement>(StatementList{}));
   EXPECT_FALSE(c->IsDefault());
@@ -101,7 +101,7 @@
 
 TEST_F(CaseStatementTest, IsValid_NullBodyStatement) {
   CaseSelectorList b;
-  b.push_back(create<SintLiteral>(ty.i32, 2));
+  b.push_back(create<SintLiteral>(ty.i32(), 2));
 
   auto* body = create<BlockStatement>(StatementList{
       create<DiscardStatement>(),
@@ -113,7 +113,7 @@
 
 TEST_F(CaseStatementTest, IsValid_InvalidBodyStatement) {
   CaseSelectorList b;
-  b.push_back(create<SintLiteral>(ty.i32, 2));
+  b.push_back(create<SintLiteral>(ty.i32(), 2));
 
   auto* body = create<BlockStatement>(
 
@@ -127,7 +127,7 @@
 
 TEST_F(CaseStatementTest, ToStr_WithSelectors_i32) {
   CaseSelectorList b;
-  b.push_back(create<SintLiteral>(ty.i32, -2));
+  b.push_back(create<SintLiteral>(ty.i32(), -2));
 
   auto* body = create<BlockStatement>(StatementList{
       create<DiscardStatement>(),
@@ -144,7 +144,7 @@
 
 TEST_F(CaseStatementTest, ToStr_WithSelectors_u32) {
   CaseSelectorList b;
-  b.push_back(create<UintLiteral>(ty.u32, 2));
+  b.push_back(create<UintLiteral>(ty.u32(), 2));
 
   auto* body = create<BlockStatement>(StatementList{
       create<DiscardStatement>(),
@@ -161,8 +161,8 @@
 
 TEST_F(CaseStatementTest, ToStr_WithMultipleSelectors) {
   CaseSelectorList b;
-  b.push_back(create<SintLiteral>(ty.i32, 1));
-  b.push_back(create<SintLiteral>(ty.i32, 2));
+  b.push_back(create<SintLiteral>(ty.i32(), 1));
+  b.push_back(create<SintLiteral>(ty.i32(), 2));
 
   auto* body = create<BlockStatement>(StatementList{
       create<DiscardStatement>(),
diff --git a/src/ast/expression_test.cc b/src/ast/expression_test.cc
index c6887e3..9dde377 100644
--- a/src/ast/expression_test.cc
+++ b/src/ast/expression_test.cc
@@ -35,13 +35,13 @@
 
 TEST_F(ExpressionTest, set_result_type) {
   FakeExpr e;
-  e.set_result_type(ty.i32);
+  e.set_result_type(ty.i32());
   ASSERT_NE(e.result_type(), nullptr);
   EXPECT_TRUE(e.result_type()->Is<type::I32>());
 }
 
 TEST_F(ExpressionTest, set_result_type_alias) {
-  auto* a = ty.alias("a", ty.i32);
+  auto* a = ty.alias("a", ty.i32());
   auto* b = ty.alias("b", a);
 
   FakeExpr e;
diff --git a/src/ast/float_literal_test.cc b/src/ast/float_literal_test.cc
index 41be541..fd4dfe7 100644
--- a/src/ast/float_literal_test.cc
+++ b/src/ast/float_literal_test.cc
@@ -28,13 +28,13 @@
 using FloatLiteralTest = TestHelper;
 
 TEST_F(FloatLiteralTest, Value) {
-  auto* f = create<FloatLiteral>(ty.f32, 47.2f);
+  auto* f = create<FloatLiteral>(ty.f32(), 47.2f);
   ASSERT_TRUE(f->Is<FloatLiteral>());
   EXPECT_EQ(f->value(), 47.2f);
 }
 
 TEST_F(FloatLiteralTest, Is) {
-  ast::Literal* l = create<FloatLiteral>(ty.f32, 42.f);
+  ast::Literal* l = create<FloatLiteral>(ty.f32(), 42.f);
   EXPECT_FALSE(l->Is<BoolLiteral>());
   EXPECT_FALSE(l->Is<SintLiteral>());
   EXPECT_FALSE(l->Is<IntLiteral>());
@@ -44,13 +44,13 @@
 }
 
 TEST_F(FloatLiteralTest, ToStr) {
-  auto* f = create<FloatLiteral>(ty.f32, 42.1f);
+  auto* f = create<FloatLiteral>(ty.f32(), 42.1f);
 
   EXPECT_EQ(f->to_str(), "42.099998");
 }
 
 TEST_F(FloatLiteralTest, ToName) {
-  auto* f = create<FloatLiteral>(ty.f32, 42.1f);
+  auto* f = create<FloatLiteral>(ty.f32(), 42.1f);
   EXPECT_EQ(f->name(), "__float42.0999985");
 }
 
diff --git a/src/ast/function_test.cc b/src/ast/function_test.cc
index d5beabd..636042a 100644
--- a/src/ast/function_test.cc
+++ b/src/ast/function_test.cc
@@ -31,22 +31,22 @@
 
 TEST_F(FunctionTest, Creation) {
   VariableList params;
-  params.push_back(Var("var", StorageClass::kNone, ty.i32));
+  params.push_back(Var("var", StorageClass::kNone, ty.i32()));
   auto* var = params[0];
 
-  auto* f =
-      Func("func", params, ty.void_, StatementList{}, FunctionDecorationList{});
+  auto* f = Func("func", params, ty.void_(), StatementList{},
+                 FunctionDecorationList{});
   EXPECT_EQ(f->symbol(), mod->Symbols().Register("func"));
   ASSERT_EQ(f->params().size(), 1u);
-  EXPECT_EQ(f->return_type(), ty.void_);
+  EXPECT_EQ(f->return_type(), ty.void_());
   EXPECT_EQ(f->params()[0], var);
 }
 
 TEST_F(FunctionTest, Creation_WithSource) {
   VariableList params;
-  params.push_back(Var("var", StorageClass::kNone, ty.i32));
+  params.push_back(Var("var", StorageClass::kNone, ty.i32()));
 
-  auto* f = Func(Source{Source::Location{20, 2}}, "func", params, ty.void_,
+  auto* f = Func(Source{Source::Location{20, 2}}, "func", params, ty.void_(),
                  StatementList{}, FunctionDecorationList{});
   auto src = f->source();
   EXPECT_EQ(src.range.begin.line, 20u);
@@ -54,8 +54,8 @@
 }
 
 TEST_F(FunctionTest, AddDuplicateReferencedVariables) {
-  auto* v = Var("var", StorageClass::kInput, ty.i32);
-  auto* f = Func("func", VariableList{}, ty.void_, StatementList{},
+  auto* v = Var("var", StorageClass::kInput, ty.i32());
+  auto* f = Func("func", VariableList{}, ty.void_(), StatementList{},
                  FunctionDecorationList{});
 
   f->add_referenced_module_variable(v);
@@ -65,34 +65,34 @@
   f->add_referenced_module_variable(v);
   ASSERT_EQ(f->referenced_module_variables().size(), 1u);
 
-  auto* v2 = Var("var2", StorageClass::kOutput, ty.i32);
+  auto* v2 = Var("var2", StorageClass::kOutput, ty.i32());
   f->add_referenced_module_variable(v2);
   ASSERT_EQ(f->referenced_module_variables().size(), 2u);
   EXPECT_EQ(f->referenced_module_variables()[1], v2);
 }
 
 TEST_F(FunctionTest, GetReferenceLocations) {
-  auto* loc1 = Var("loc1", StorageClass::kInput, ty.i32, nullptr,
+  auto* loc1 = Var("loc1", StorageClass::kInput, ty.i32(), nullptr,
                    ast::VariableDecorationList{
                        create<LocationDecoration>(0),
                    });
 
-  auto* loc2 = Var("loc2", StorageClass::kInput, ty.i32, nullptr,
+  auto* loc2 = Var("loc2", StorageClass::kInput, ty.i32(), nullptr,
                    ast::VariableDecorationList{
                        create<LocationDecoration>(1),
                    });
 
-  auto* builtin1 = Var("builtin1", StorageClass::kInput, ty.i32, nullptr,
+  auto* builtin1 = Var("builtin1", StorageClass::kInput, ty.i32(), nullptr,
                        ast::VariableDecorationList{
                            create<BuiltinDecoration>(Builtin::kPosition),
                        });
 
-  auto* builtin2 = Var("builtin2", StorageClass::kInput, ty.i32, nullptr,
+  auto* builtin2 = Var("builtin2", StorageClass::kInput, ty.i32(), nullptr,
                        ast::VariableDecorationList{
                            create<BuiltinDecoration>(Builtin::kFragDepth),
                        });
 
-  auto* f = Func("func", VariableList{}, ty.void_, StatementList{},
+  auto* f = Func("func", VariableList{}, ty.void_(), StatementList{},
                  FunctionDecorationList{});
 
   f->add_referenced_module_variable(loc1);
@@ -110,27 +110,27 @@
 }
 
 TEST_F(FunctionTest, GetReferenceBuiltins) {
-  auto* loc1 = Var("loc1", StorageClass::kInput, ty.i32, nullptr,
+  auto* loc1 = Var("loc1", StorageClass::kInput, ty.i32(), nullptr,
                    ast::VariableDecorationList{
                        create<LocationDecoration>(0),
                    });
 
-  auto* loc2 = Var("loc2", StorageClass::kInput, ty.i32, nullptr,
+  auto* loc2 = Var("loc2", StorageClass::kInput, ty.i32(), nullptr,
                    ast::VariableDecorationList{
                        create<LocationDecoration>(1),
                    });
 
-  auto* builtin1 = Var("builtin1", StorageClass::kInput, ty.i32, nullptr,
+  auto* builtin1 = Var("builtin1", StorageClass::kInput, ty.i32(), nullptr,
                        ast::VariableDecorationList{
                            create<BuiltinDecoration>(Builtin::kPosition),
                        });
 
-  auto* builtin2 = Var("builtin2", StorageClass::kInput, ty.i32, nullptr,
+  auto* builtin2 = Var("builtin2", StorageClass::kInput, ty.i32(), nullptr,
                        ast::VariableDecorationList{
                            create<BuiltinDecoration>(Builtin::kFragDepth),
                        });
 
-  auto* f = Func("func", VariableList{}, ty.void_, StatementList{},
+  auto* f = Func("func", VariableList{}, ty.void_(), StatementList{},
                  FunctionDecorationList{});
 
   f->add_referenced_module_variable(loc1);
@@ -148,7 +148,7 @@
 }
 
 TEST_F(FunctionTest, AddDuplicateEntryPoints) {
-  auto* f = Func("func", VariableList{}, ty.void_, StatementList{},
+  auto* f = Func("func", VariableList{}, ty.void_(), StatementList{},
                  FunctionDecorationList{});
 
   auto main_sym = mod->Symbols().Register("main");
@@ -163,9 +163,9 @@
 
 TEST_F(FunctionTest, IsValid) {
   VariableList params;
-  params.push_back(Var("var", StorageClass::kNone, ty.i32));
+  params.push_back(Var("var", StorageClass::kNone, ty.i32()));
 
-  auto* f = Func("func", params, ty.void_,
+  auto* f = Func("func", params, ty.void_(),
                  StatementList{
                      create<DiscardStatement>(),
                  },
@@ -175,16 +175,16 @@
 
 TEST_F(FunctionTest, IsValid_InvalidName) {
   VariableList params;
-  params.push_back(Var("var", StorageClass::kNone, ty.i32));
+  params.push_back(Var("var", StorageClass::kNone, ty.i32()));
 
   auto* f =
-      Func("", params, ty.void_, StatementList{}, FunctionDecorationList{});
+      Func("", params, ty.void_(), StatementList{}, FunctionDecorationList{});
   EXPECT_FALSE(f->IsValid());
 }
 
 TEST_F(FunctionTest, IsValid_MissingReturnType) {
   VariableList params;
-  params.push_back(Var("var", StorageClass::kNone, ty.i32));
+  params.push_back(Var("var", StorageClass::kNone, ty.i32()));
 
   auto* f =
       Func("func", params, nullptr, StatementList{}, FunctionDecorationList{});
@@ -193,11 +193,11 @@
 
 TEST_F(FunctionTest, IsValid_NullParam) {
   VariableList params;
-  params.push_back(Var("var", StorageClass::kNone, ty.i32));
+  params.push_back(Var("var", StorageClass::kNone, ty.i32()));
   params.push_back(nullptr);
 
-  auto* f =
-      Func("func", params, ty.void_, StatementList{}, FunctionDecorationList{});
+  auto* f = Func("func", params, ty.void_(), StatementList{},
+                 FunctionDecorationList{});
   EXPECT_FALSE(f->IsValid());
 }
 
@@ -205,16 +205,16 @@
   VariableList params;
   params.push_back(Var("var", StorageClass::kNone, nullptr));
 
-  auto* f =
-      Func("func", params, ty.void_, StatementList{}, FunctionDecorationList{});
+  auto* f = Func("func", params, ty.void_(), StatementList{},
+                 FunctionDecorationList{});
   EXPECT_FALSE(f->IsValid());
 }
 
 TEST_F(FunctionTest, IsValid_NullBodyStatement) {
   VariableList params;
-  params.push_back(Var("var", StorageClass::kNone, ty.i32));
+  params.push_back(Var("var", StorageClass::kNone, ty.i32()));
 
-  auto* f = Func("func", params, ty.void_,
+  auto* f = Func("func", params, ty.void_(),
                  StatementList{
                      create<DiscardStatement>(),
                      nullptr,
@@ -226,9 +226,9 @@
 
 TEST_F(FunctionTest, IsValid_InvalidBodyStatement) {
   VariableList params;
-  params.push_back(Var("var", StorageClass::kNone, ty.i32));
+  params.push_back(Var("var", StorageClass::kNone, ty.i32()));
 
-  auto* f = Func("func", params, ty.void_,
+  auto* f = Func("func", params, ty.void_(),
                  StatementList{
                      create<DiscardStatement>(),
                      nullptr,
@@ -238,7 +238,7 @@
 }
 
 TEST_F(FunctionTest, ToStr) {
-  auto* f = Func("func", VariableList{}, ty.void_,
+  auto* f = Func("func", VariableList{}, ty.void_(),
                  StatementList{
                      create<DiscardStatement>(),
                  },
@@ -255,7 +255,7 @@
 }
 
 TEST_F(FunctionTest, ToStr_WithDecoration) {
-  auto* f = Func("func", VariableList{}, ty.void_,
+  auto* f = Func("func", VariableList{}, ty.void_(),
                  StatementList{
                      create<DiscardStatement>(),
                  },
@@ -274,9 +274,9 @@
 
 TEST_F(FunctionTest, ToStr_WithParams) {
   VariableList params;
-  params.push_back(Var("var", StorageClass::kNone, ty.i32));
+  params.push_back(Var("var", StorageClass::kNone, ty.i32()));
 
-  auto* f = Func("func", params, ty.void_,
+  auto* f = Func("func", params, ty.void_(),
                  StatementList{
                      create<DiscardStatement>(),
                  },
@@ -299,25 +299,25 @@
 }
 
 TEST_F(FunctionTest, TypeName) {
-  auto* f = Func("func", VariableList{}, ty.void_, StatementList{},
+  auto* f = Func("func", VariableList{}, ty.void_(), StatementList{},
                  FunctionDecorationList{});
   EXPECT_EQ(f->type_name(), "__func__void");
 }
 
 TEST_F(FunctionTest, TypeName_WithParams) {
   VariableList params;
-  params.push_back(Var("var1", StorageClass::kNone, ty.i32));
-  params.push_back(Var("var2", StorageClass::kNone, ty.f32));
+  params.push_back(Var("var1", StorageClass::kNone, ty.i32()));
+  params.push_back(Var("var2", StorageClass::kNone, ty.f32()));
 
-  auto* f =
-      Func("func", params, ty.void_, StatementList{}, FunctionDecorationList{});
+  auto* f = Func("func", params, ty.void_(), StatementList{},
+                 FunctionDecorationList{});
   EXPECT_EQ(f->type_name(), "__func__void__i32__f32");
 }
 
 TEST_F(FunctionTest, GetLastStatement) {
   VariableList params;
   auto* stmt = create<DiscardStatement>();
-  auto* f = Func("func", params, ty.void_, StatementList{stmt},
+  auto* f = Func("func", params, ty.void_(), StatementList{stmt},
                  FunctionDecorationList{});
 
   EXPECT_EQ(f->get_last_statement(), stmt);
@@ -325,14 +325,14 @@
 
 TEST_F(FunctionTest, GetLastStatement_nullptr) {
   VariableList params;
-  auto* f =
-      Func("func", params, ty.void_, StatementList{}, FunctionDecorationList{});
+  auto* f = Func("func", params, ty.void_(), StatementList{},
+                 FunctionDecorationList{});
 
   EXPECT_EQ(f->get_last_statement(), nullptr);
 }
 
 TEST_F(FunctionTest, WorkgroupSize_NoneSet) {
-  auto* f = Func("func", VariableList{}, ty.void_, StatementList{},
+  auto* f = Func("func", VariableList{}, ty.void_(), StatementList{},
                  FunctionDecorationList{});
   uint32_t x = 0;
   uint32_t y = 0;
@@ -345,7 +345,7 @@
 
 TEST_F(FunctionTest, WorkgroupSize) {
   auto* f =
-      Func("func", VariableList{}, ty.void_, StatementList{},
+      Func("func", VariableList{}, ty.void_(), StatementList{},
            FunctionDecorationList{create<WorkgroupDecoration>(2u, 4u, 6u)});
 
   uint32_t x = 0;
@@ -360,7 +360,7 @@
 using FunctionListTest = TestHelper;
 
 TEST_F(FunctionListTest, FindSymbol) {
-  auto* func = Func("main", VariableList{}, ty.f32, StatementList{},
+  auto* func = Func("main", VariableList{}, ty.f32(), StatementList{},
                     ast::FunctionDecorationList{});
   FunctionList list;
   list.Add(func);
@@ -373,11 +373,11 @@
 }
 
 TEST_F(FunctionListTest, FindSymbolStage) {
-  auto* fs = Func("main", VariableList{}, ty.f32, StatementList{},
+  auto* fs = Func("main", VariableList{}, ty.f32(), StatementList{},
                   ast::FunctionDecorationList{
                       create<ast::StageDecoration>(PipelineStage::kFragment),
                   });
-  auto* vs = Func("main", VariableList{}, ty.f32, StatementList{},
+  auto* vs = Func("main", VariableList{}, ty.f32(), StatementList{},
                   ast::FunctionDecorationList{
                       create<ast::StageDecoration>(PipelineStage::kVertex),
                   });
@@ -392,7 +392,7 @@
 
 TEST_F(FunctionListTest, FindSymbolStageMissing) {
   FunctionList list;
-  list.Add(Func("main", VariableList{}, ty.f32, StatementList{},
+  list.Add(Func("main", VariableList{}, ty.f32(), StatementList{},
                 ast::FunctionDecorationList{
                     create<ast::StageDecoration>(PipelineStage::kFragment),
                 }));
@@ -402,7 +402,7 @@
 
 TEST_F(FunctionListTest, HasStage) {
   FunctionList list;
-  list.Add(Func("main", VariableList{}, ty.f32, StatementList{},
+  list.Add(Func("main", VariableList{}, ty.f32(), StatementList{},
                 ast::FunctionDecorationList{
                     create<ast::StageDecoration>(PipelineStage::kFragment),
                 }));
diff --git a/src/ast/int_literal_test.cc b/src/ast/int_literal_test.cc
index e207f83..58abbfb 100644
--- a/src/ast/int_literal_test.cc
+++ b/src/ast/int_literal_test.cc
@@ -30,12 +30,12 @@
 using IntLiteralTest = TestHelper;
 
 TEST_F(IntLiteralTest, Sint_IsInt) {
-  auto* i = create<SintLiteral>(ty.i32, 47);
+  auto* i = create<SintLiteral>(ty.i32(), 47);
   ASSERT_TRUE(i->Is<IntLiteral>());
 }
 
 TEST_F(IntLiteralTest, Uint_IsInt) {
-  auto* i = create<UintLiteral>(ty.i32, 42);
+  auto* i = create<UintLiteral>(ty.i32(), 42);
   EXPECT_TRUE(i->Is<IntLiteral>());
 }
 
diff --git a/src/ast/intrinsic_texture_helper_test.cc b/src/ast/intrinsic_texture_helper_test.cc
index b1a16c3..ac48c3e 100644
--- a/src/ast/intrinsic_texture_helper_test.cc
+++ b/src/ast/intrinsic_texture_helper_test.cc
@@ -139,11 +139,11 @@
     ast::Builder* b) const {
   switch (texture_data_type) {
     case ast::intrinsic::test::TextureDataType::kF32:
-      return b->ty.f32;
+      return b->ty.f32();
     case ast::intrinsic::test::TextureDataType::kU32:
-      return b->ty.u32;
+      return b->ty.u32();
     case ast::intrinsic::test::TextureDataType::kI32:
-      return b->ty.i32;
+      return b->ty.i32();
   }
 
   assert(false /* unreachable */);
diff --git a/src/ast/null_literal_test.cc b/src/ast/null_literal_test.cc
index 93b6d44..e50bd42 100644
--- a/src/ast/null_literal_test.cc
+++ b/src/ast/null_literal_test.cc
@@ -28,7 +28,7 @@
 using NullLiteralTest = TestHelper;
 
 TEST_F(NullLiteralTest, Is) {
-  ast::Literal* l = create<NullLiteral>(ty.i32);
+  ast::Literal* l = create<NullLiteral>(ty.i32());
   EXPECT_FALSE(l->Is<BoolLiteral>());
   EXPECT_FALSE(l->Is<SintLiteral>());
   EXPECT_FALSE(l->Is<FloatLiteral>());
@@ -38,13 +38,13 @@
 }
 
 TEST_F(NullLiteralTest, ToStr) {
-  auto* i = create<NullLiteral>(ty.i32);
+  auto* i = create<NullLiteral>(ty.i32());
 
   EXPECT_EQ(i->to_str(), "null __i32");
 }
 
 TEST_F(NullLiteralTest, Name_I32) {
-  auto* i = create<NullLiteral>(ty.i32);
+  auto* i = create<NullLiteral>(ty.i32());
   EXPECT_EQ("__null__i32", i->name());
 }
 
diff --git a/src/ast/scalar_constructor_expression_test.cc b/src/ast/scalar_constructor_expression_test.cc
index 563a086..c4a4559 100644
--- a/src/ast/scalar_constructor_expression_test.cc
+++ b/src/ast/scalar_constructor_expression_test.cc
@@ -25,7 +25,7 @@
 using ScalarConstructorExpressionTest = TestHelper;
 
 TEST_F(ScalarConstructorExpressionTest, Creation) {
-  auto* b = create<BoolLiteral>(ty.bool_, true);
+  auto* b = create<BoolLiteral>(ty.bool_(), true);
   auto* c = create<ScalarConstructorExpression>(b);
   EXPECT_EQ(c->literal(), b);
 }
diff --git a/src/ast/sint_literal_test.cc b/src/ast/sint_literal_test.cc
index 3cdb7bb..2fc5993 100644
--- a/src/ast/sint_literal_test.cc
+++ b/src/ast/sint_literal_test.cc
@@ -29,13 +29,13 @@
 using SintLiteralTest = TestHelper;
 
 TEST_F(SintLiteralTest, Value) {
-  auto* i = create<SintLiteral>(ty.i32, 47);
+  auto* i = create<SintLiteral>(ty.i32(), 47);
   ASSERT_TRUE(i->Is<SintLiteral>());
   EXPECT_EQ(i->value(), 47);
 }
 
 TEST_F(SintLiteralTest, Is) {
-  ast::Literal* l = create<SintLiteral>(ty.i32, 42);
+  ast::Literal* l = create<SintLiteral>(ty.i32(), 42);
   EXPECT_FALSE(l->Is<BoolLiteral>());
   EXPECT_TRUE(l->Is<SintLiteral>());
   EXPECT_FALSE(l->Is<FloatLiteral>());
@@ -44,13 +44,13 @@
 }
 
 TEST_F(SintLiteralTest, ToStr) {
-  auto* i = create<SintLiteral>(ty.i32, -42);
+  auto* i = create<SintLiteral>(ty.i32(), -42);
 
   EXPECT_EQ(i->to_str(), "-42");
 }
 
 TEST_F(SintLiteralTest, Name_I32) {
-  auto* i = create<SintLiteral>(ty.i32, 2);
+  auto* i = create<SintLiteral>(ty.i32(), 2);
   EXPECT_EQ("__sint__i32_2", i->name());
 }
 
diff --git a/src/ast/struct_member_test.cc b/src/ast/struct_member_test.cc
index 2591a64..55ffc64 100644
--- a/src/ast/struct_member_test.cc
+++ b/src/ast/struct_member_test.cc
@@ -28,9 +28,9 @@
 using StructMemberTest = TestHelper;
 
 TEST_F(StructMemberTest, Creation) {
-  auto* st = Member("a", ty.i32, {MemberOffset(4)});
+  auto* st = Member("a", ty.i32(), {MemberOffset(4)});
   EXPECT_EQ(st->symbol(), Symbol(1));
-  EXPECT_EQ(st->type(), ty.i32);
+  EXPECT_EQ(st->type(), ty.i32());
   EXPECT_EQ(st->decorations().size(), 1u);
   EXPECT_TRUE(st->decorations()[0]->Is<StructMemberOffsetDecoration>());
   EXPECT_EQ(st->source().range.begin.line, 0u);
@@ -42,9 +42,9 @@
 TEST_F(StructMemberTest, CreationWithSource) {
   auto* st = Member(
       Source{Source::Range{Source::Location{27, 4}, Source::Location{27, 8}}},
-      "a", ty.i32);
+      "a", ty.i32());
   EXPECT_EQ(st->symbol(), Symbol(1));
-  EXPECT_EQ(st->type(), ty.i32);
+  EXPECT_EQ(st->type(), ty.i32());
   EXPECT_EQ(st->decorations().size(), 0u);
   EXPECT_EQ(st->source().range.begin.line, 27u);
   EXPECT_EQ(st->source().range.begin.column, 4u);
@@ -53,12 +53,12 @@
 }
 
 TEST_F(StructMemberTest, IsValid) {
-  auto* st = Member("a", ty.i32);
+  auto* st = Member("a", ty.i32());
   EXPECT_TRUE(st->IsValid());
 }
 
 TEST_F(StructMemberTest, IsValid_EmptySymbol) {
-  auto* st = Member("", ty.i32);
+  auto* st = Member("", ty.i32());
   EXPECT_FALSE(st->IsValid());
 }
 
@@ -68,19 +68,19 @@
 }
 
 TEST_F(StructMemberTest, IsValid_Null_Decoration) {
-  auto* st = Member("a", ty.i32, {MemberOffset(4), nullptr});
+  auto* st = Member("a", ty.i32(), {MemberOffset(4), nullptr});
   EXPECT_FALSE(st->IsValid());
 }
 
 TEST_F(StructMemberTest, ToStr) {
-  auto* st = Member("a", ty.i32, {MemberOffset(4)});
+  auto* st = Member("a", ty.i32(), {MemberOffset(4)});
   std::ostringstream out;
   st->to_str(out, 2);
   EXPECT_EQ(demangle(out.str()), "  StructMember{[[ offset 4 ]] a: __i32}\n");
 }
 
 TEST_F(StructMemberTest, ToStrNoDecorations) {
-  auto* st = Member("a", ty.i32);
+  auto* st = Member("a", ty.i32());
   std::ostringstream out;
   st->to_str(out, 2);
   EXPECT_EQ(demangle(out.str()), "  StructMember{a: __i32}\n");
diff --git a/src/ast/struct_test.cc b/src/ast/struct_test.cc
index a34a2a6..8274c5a 100644
--- a/src/ast/struct_test.cc
+++ b/src/ast/struct_test.cc
@@ -30,7 +30,7 @@
 using StructTest = TestHelper;
 
 TEST_F(StructTest, Creation) {
-  auto* s = create<Struct>(StructMemberList{Member("a", ty.i32)},
+  auto* s = create<Struct>(StructMemberList{Member("a", ty.i32())},
                            StructDecorationList{});
   EXPECT_EQ(s->members().size(), 1u);
   EXPECT_TRUE(s->decorations().empty());
@@ -44,7 +44,7 @@
   StructDecorationList decos;
   decos.push_back(create<StructBlockDecoration>());
 
-  auto* s = create<Struct>(StructMemberList{Member("a", ty.i32)}, decos);
+  auto* s = create<Struct>(StructMemberList{Member("a", ty.i32())}, decos);
   EXPECT_EQ(s->members().size(), 1u);
   ASSERT_EQ(s->decorations().size(), 1u);
   EXPECT_TRUE(s->decorations()[0]->Is<StructBlockDecoration>());
@@ -60,7 +60,7 @@
 
   auto* s = create<Struct>(
       Source{Source::Range{Source::Location{27, 4}, Source::Location{27, 8}}},
-      StructMemberList{Member("a", ty.i32)}, decos);
+      StructMemberList{Member("a", ty.i32())}, decos);
   EXPECT_EQ(s->members().size(), 1u);
   ASSERT_EQ(s->decorations().size(), 1u);
   EXPECT_TRUE(s->decorations()[0]->Is<StructBlockDecoration>());
@@ -76,13 +76,13 @@
 }
 
 TEST_F(StructTest, IsValid_Null_StructMember) {
-  auto* s = create<Struct>(StructMemberList{Member("a", ty.i32), nullptr},
+  auto* s = create<Struct>(StructMemberList{Member("a", ty.i32()), nullptr},
                            StructDecorationList{});
   EXPECT_FALSE(s->IsValid());
 }
 
 TEST_F(StructTest, IsValid_Invalid_StructMember) {
-  auto* s = create<Struct>(StructMemberList{Member("", ty.i32)},
+  auto* s = create<Struct>(StructMemberList{Member("", ty.i32())},
                            ast::StructDecorationList{});
   EXPECT_FALSE(s->IsValid());
 }
@@ -90,7 +90,7 @@
 TEST_F(StructTest, ToStr) {
   StructDecorationList decos;
   decos.push_back(create<StructBlockDecoration>());
-  auto* s = create<Struct>(StructMemberList{Member("a", ty.i32)}, decos);
+  auto* s = create<Struct>(StructMemberList{Member("a", ty.i32())}, decos);
 
   std::ostringstream out;
   s->to_str(out, 2);
diff --git a/src/ast/switch_statement_test.cc b/src/ast/switch_statement_test.cc
index 5f05e6a..d51eb55 100644
--- a/src/ast/switch_statement_test.cc
+++ b/src/ast/switch_statement_test.cc
@@ -30,7 +30,7 @@
 
 TEST_F(SwitchStatementTest, Creation) {
   CaseSelectorList lit;
-  lit.push_back(create<SintLiteral>(ty.i32, 1));
+  lit.push_back(create<SintLiteral>(ty.i32(), 1));
 
   auto* ident = Expr("ident");
   CaseStatementList body;
@@ -56,7 +56,7 @@
 
 TEST_F(SwitchStatementTest, IsSwitch) {
   CaseSelectorList lit;
-  lit.push_back(create<SintLiteral>(ty.i32, 2));
+  lit.push_back(create<SintLiteral>(ty.i32(), 2));
 
   auto* ident = Expr("ident");
   CaseStatementList body;
@@ -69,7 +69,7 @@
 
 TEST_F(SwitchStatementTest, IsValid) {
   CaseSelectorList lit;
-  lit.push_back(create<SintLiteral>(ty.i32, 2));
+  lit.push_back(create<SintLiteral>(ty.i32(), 2));
 
   auto* ident = Expr("ident");
   CaseStatementList body;
@@ -82,7 +82,7 @@
 
 TEST_F(SwitchStatementTest, IsValid_Null_Condition) {
   CaseSelectorList lit;
-  lit.push_back(create<SintLiteral>(ty.i32, 2));
+  lit.push_back(create<SintLiteral>(ty.i32(), 2));
 
   CaseStatementList body;
   body.push_back(
@@ -94,7 +94,7 @@
 
 TEST_F(SwitchStatementTest, IsValid_Invalid_Condition) {
   CaseSelectorList lit;
-  lit.push_back(create<SintLiteral>(ty.i32, 2));
+  lit.push_back(create<SintLiteral>(ty.i32(), 2));
 
   auto* ident = Expr("");
   CaseStatementList body;
@@ -107,7 +107,7 @@
 
 TEST_F(SwitchStatementTest, IsValid_Null_BodyStatement) {
   CaseSelectorList lit;
-  lit.push_back(create<SintLiteral>(ty.i32, 2));
+  lit.push_back(create<SintLiteral>(ty.i32(), 2));
 
   auto* ident = Expr("ident");
   CaseStatementList body;
@@ -148,7 +148,7 @@
 
 TEST_F(SwitchStatementTest, ToStr) {
   CaseSelectorList lit;
-  lit.push_back(create<SintLiteral>(ty.i32, 2));
+  lit.push_back(create<SintLiteral>(ty.i32(), 2));
 
   auto* ident = Expr("ident");
   CaseStatementList body;
diff --git a/src/ast/type_constructor_expression_test.cc b/src/ast/type_constructor_expression_test.cc
index b7bbfb0..4f1b3b1 100644
--- a/src/ast/type_constructor_expression_test.cc
+++ b/src/ast/type_constructor_expression_test.cc
@@ -33,8 +33,8 @@
   ExpressionList expr;
   expr.push_back(Expr("expr"));
 
-  auto* t = create<TypeConstructorExpression>(ty.f32, expr);
-  EXPECT_EQ(t->type(), ty.f32);
+  auto* t = create<TypeConstructorExpression>(ty.f32(), expr);
+  EXPECT_EQ(t->type(), ty.f32());
   ASSERT_EQ(t->values().size(), 1u);
   EXPECT_EQ(t->values()[0], expr[0]);
 }
@@ -44,7 +44,7 @@
   expr.push_back(Expr("expr"));
 
   auto* t = create<TypeConstructorExpression>(Source{Source::Location{20, 2}},
-                                              ty.f32, expr);
+                                              ty.f32(), expr);
   auto src = t->source();
   EXPECT_EQ(src.range.begin.line, 20u);
   EXPECT_EQ(src.range.begin.column, 2u);
@@ -54,7 +54,7 @@
   ExpressionList expr;
   expr.push_back(Expr("expr"));
 
-  auto* t = create<TypeConstructorExpression>(ty.f32, expr);
+  auto* t = create<TypeConstructorExpression>(ty.f32(), expr);
   EXPECT_TRUE(t->Is<TypeConstructorExpression>());
 }
 
@@ -62,14 +62,14 @@
   ExpressionList expr;
   expr.push_back(Expr("expr"));
 
-  auto* t = create<TypeConstructorExpression>(ty.f32, expr);
+  auto* t = create<TypeConstructorExpression>(ty.f32(), expr);
   EXPECT_TRUE(t->IsValid());
 }
 
 TEST_F(TypeConstructorExpressionTest, IsValid_EmptyValue) {
   ExpressionList expr;
 
-  auto* t = create<TypeConstructorExpression>(ty.f32, expr);
+  auto* t = create<TypeConstructorExpression>(ty.f32(), expr);
   EXPECT_TRUE(t->IsValid());
 }
 
@@ -86,7 +86,7 @@
   expr.push_back(Expr("expr"));
   expr.push_back(nullptr);
 
-  auto* t = create<TypeConstructorExpression>(ty.f32, expr);
+  auto* t = create<TypeConstructorExpression>(ty.f32(), expr);
   EXPECT_FALSE(t->IsValid());
 }
 
@@ -94,12 +94,12 @@
   ExpressionList expr;
   expr.push_back(Expr(""));
 
-  auto* t = create<TypeConstructorExpression>(ty.f32, expr);
+  auto* t = create<TypeConstructorExpression>(ty.f32(), expr);
   EXPECT_FALSE(t->IsValid());
 }
 
 TEST_F(TypeConstructorExpressionTest, ToStr) {
-  type::Vector vec(ty.f32, 3);
+  type::Vector vec(ty.f32(), 3);
   ExpressionList expr;
   expr.push_back(Expr("expr_1"));
   expr.push_back(Expr("expr_2"));
diff --git a/src/ast/uint_literal_test.cc b/src/ast/uint_literal_test.cc
index db3e1bb..1216bb2 100644
--- a/src/ast/uint_literal_test.cc
+++ b/src/ast/uint_literal_test.cc
@@ -28,13 +28,13 @@
 using UintLiteralTest = TestHelper;
 
 TEST_F(UintLiteralTest, Value) {
-  auto* u = create<UintLiteral>(ty.u32, 47);
+  auto* u = create<UintLiteral>(ty.u32(), 47);
   ASSERT_TRUE(u->Is<UintLiteral>());
   EXPECT_EQ(u->value(), 47u);
 }
 
 TEST_F(UintLiteralTest, Is) {
-  ast::Literal* l = create<UintLiteral>(ty.u32, 42);
+  ast::Literal* l = create<UintLiteral>(ty.u32(), 42);
   EXPECT_FALSE(l->Is<BoolLiteral>());
   EXPECT_FALSE(l->Is<SintLiteral>());
   EXPECT_FALSE(l->Is<FloatLiteral>());
@@ -43,7 +43,7 @@
 }
 
 TEST_F(UintLiteralTest, ToStr) {
-  auto* u = create<UintLiteral>(ty.u32, 42);
+  auto* u = create<UintLiteral>(ty.u32(), 42);
   EXPECT_EQ(u->to_str(), "42");
 }
 
diff --git a/src/ast/variable_decl_statement_test.cc b/src/ast/variable_decl_statement_test.cc
index 60b878b..62294fa 100644
--- a/src/ast/variable_decl_statement_test.cc
+++ b/src/ast/variable_decl_statement_test.cc
@@ -25,14 +25,14 @@
 using VariableDeclStatementTest = TestHelper;
 
 TEST_F(VariableDeclStatementTest, Creation) {
-  auto* var = Var("a", StorageClass::kNone, ty.f32);
+  auto* var = Var("a", StorageClass::kNone, ty.f32());
 
   auto* stmt = create<VariableDeclStatement>(var);
   EXPECT_EQ(stmt->variable(), var);
 }
 
 TEST_F(VariableDeclStatementTest, Creation_WithSource) {
-  auto* var = Var("a", StorageClass::kNone, ty.f32);
+  auto* var = Var("a", StorageClass::kNone, ty.f32());
 
   auto* stmt =
       create<VariableDeclStatement>(Source{Source::Location{20, 2}}, var);
@@ -42,20 +42,20 @@
 }
 
 TEST_F(VariableDeclStatementTest, IsVariableDecl) {
-  auto* var = Var("a", StorageClass::kNone, ty.f32);
+  auto* var = Var("a", StorageClass::kNone, ty.f32());
 
   auto* stmt = create<VariableDeclStatement>(var);
   EXPECT_TRUE(stmt->Is<VariableDeclStatement>());
 }
 
 TEST_F(VariableDeclStatementTest, IsValid) {
-  auto* var = Var("a", StorageClass::kNone, ty.f32);
+  auto* var = Var("a", StorageClass::kNone, ty.f32());
   auto* stmt = create<VariableDeclStatement>(var);
   EXPECT_TRUE(stmt->IsValid());
 }
 
 TEST_F(VariableDeclStatementTest, IsValid_InvalidVariable) {
-  auto* var = Var("", StorageClass::kNone, ty.f32);
+  auto* var = Var("", StorageClass::kNone, ty.f32());
   auto* stmt = create<VariableDeclStatement>(var);
   EXPECT_FALSE(stmt->IsValid());
 }
@@ -66,7 +66,7 @@
 }
 
 TEST_F(VariableDeclStatementTest, ToStr) {
-  auto* var = Var("a", StorageClass::kNone, ty.f32);
+  auto* var = Var("a", StorageClass::kNone, ty.f32());
 
   auto* stmt =
       create<VariableDeclStatement>(Source{Source::Location{20, 2}}, var);
diff --git a/src/ast/variable_test.cc b/src/ast/variable_test.cc
index 331d17f..a7d2319 100644
--- a/src/ast/variable_test.cc
+++ b/src/ast/variable_test.cc
@@ -27,11 +27,11 @@
 using VariableTest = TestHelper;
 
 TEST_F(VariableTest, Creation) {
-  auto* v = Var("my_var", StorageClass::kFunction, ty.i32);
+  auto* v = Var("my_var", StorageClass::kFunction, ty.i32());
 
   EXPECT_EQ(v->symbol(), Symbol(1));
   EXPECT_EQ(v->storage_class(), StorageClass::kFunction);
-  EXPECT_EQ(v->type(), ty.i32);
+  EXPECT_EQ(v->type(), ty.i32());
   EXPECT_EQ(v->source().range.begin.line, 0u);
   EXPECT_EQ(v->source().range.begin.column, 0u);
   EXPECT_EQ(v->source().range.end.line, 0u);
@@ -41,11 +41,11 @@
 TEST_F(VariableTest, CreationWithSource) {
   auto* v = Var(
       Source{Source::Range{Source::Location{27, 4}, Source::Location{27, 5}}},
-      "i", StorageClass::kPrivate, ty.f32, nullptr, VariableDecorationList{});
+      "i", StorageClass::kPrivate, ty.f32(), nullptr, VariableDecorationList{});
 
   EXPECT_EQ(v->symbol(), Symbol(1));
   EXPECT_EQ(v->storage_class(), StorageClass::kPrivate);
-  EXPECT_EQ(v->type(), ty.f32);
+  EXPECT_EQ(v->type(), ty.f32());
   EXPECT_EQ(v->source().range.begin.line, 27u);
   EXPECT_EQ(v->source().range.begin.column, 4u);
   EXPECT_EQ(v->source().range.end.line, 27u);
@@ -55,12 +55,12 @@
 TEST_F(VariableTest, CreationEmpty) {
   auto* v = Var(
       Source{Source::Range{Source::Location{27, 4}, Source::Location{27, 7}}},
-      "a_var", StorageClass::kWorkgroup, ty.i32, nullptr,
+      "a_var", StorageClass::kWorkgroup, ty.i32(), nullptr,
       VariableDecorationList{});
 
   EXPECT_EQ(v->symbol(), Symbol(1));
   EXPECT_EQ(v->storage_class(), StorageClass::kWorkgroup);
-  EXPECT_EQ(v->type(), ty.i32);
+  EXPECT_EQ(v->type(), ty.i32());
   EXPECT_EQ(v->source().range.begin.line, 27u);
   EXPECT_EQ(v->source().range.begin.column, 4u);
   EXPECT_EQ(v->source().range.end.line, 27u);
@@ -68,18 +68,18 @@
 }
 
 TEST_F(VariableTest, IsValid) {
-  auto* v = Var("my_var", StorageClass::kNone, ty.i32);
+  auto* v = Var("my_var", StorageClass::kNone, ty.i32());
   EXPECT_TRUE(v->IsValid());
 }
 
 TEST_F(VariableTest, IsValid_WithConstructor) {
-  auto* v = Var("my_var", StorageClass::kNone, ty.i32, Expr("ident"),
+  auto* v = Var("my_var", StorageClass::kNone, ty.i32(), Expr("ident"),
                 ast::VariableDecorationList{});
   EXPECT_TRUE(v->IsValid());
 }
 
 TEST_F(VariableTest, IsValid_MissingSymbol) {
-  auto* v = Var("", StorageClass::kNone, ty.i32);
+  auto* v = Var("", StorageClass::kNone, ty.i32());
   EXPECT_FALSE(v->IsValid());
 }
 
@@ -94,13 +94,13 @@
 }
 
 TEST_F(VariableTest, IsValid_InvalidConstructor) {
-  auto* v = Var("my_var", StorageClass::kNone, ty.i32, Expr(""),
+  auto* v = Var("my_var", StorageClass::kNone, ty.i32(), Expr(""),
                 ast::VariableDecorationList{});
   EXPECT_FALSE(v->IsValid());
 }
 
 TEST_F(VariableTest, to_str) {
-  auto* v = Var("my_var", StorageClass::kFunction, ty.f32, nullptr,
+  auto* v = Var("my_var", StorageClass::kFunction, ty.f32(), nullptr,
                 ast::VariableDecorationList{});
   std::ostringstream out;
   v->to_str(out, 2);
@@ -113,7 +113,7 @@
 }
 
 TEST_F(VariableTest, WithDecorations) {
-  auto* var = Var("my_var", StorageClass::kFunction, ty.i32, nullptr,
+  auto* var = Var("my_var", StorageClass::kFunction, ty.i32(), nullptr,
                   VariableDecorationList{
                       create<LocationDecoration>(1),
                       create<BuiltinDecoration>(Builtin::kPosition),
@@ -130,7 +130,7 @@
 }
 
 TEST_F(VariableTest, ConstantId) {
-  auto* var = Var("my_var", StorageClass::kFunction, ty.i32, nullptr,
+  auto* var = Var("my_var", StorageClass::kFunction, ty.i32(), nullptr,
                   VariableDecorationList{
                       create<ConstantIdDecoration>(1200),
                   });
@@ -139,7 +139,7 @@
 }
 
 TEST_F(VariableTest, Decorated_to_str) {
-  auto* var = Var("my_var", StorageClass::kFunction, ty.f32, Expr("expr"),
+  auto* var = Var("my_var", StorageClass::kFunction, ty.f32(), Expr("expr"),
                   VariableDecorationList{
                       create<BindingDecoration>(2),
                       create<GroupDecoration>(1),