diff --git a/src/tint/transform/decompose_strided_matrix_test.cc b/src/tint/transform/decompose_strided_matrix_test.cc
index 8784839..23b30d5 100644
--- a/src/tint/transform/decompose_strided_matrix_test.cc
+++ b/src/tint/transform/decompose_strided_matrix_test.cc
@@ -24,11 +24,12 @@
 #include "src/tint/transform/test_helper.h"
 #include "src/tint/transform/unshadow.h"
 
+using namespace tint::number_suffixes;  // NOLINT
+
 namespace tint::transform {
 namespace {
 
 using DecomposeStridedMatrixTest = TransformTest;
-using f32 = ProgramBuilder::f32;
 
 TEST_F(DecomposeStridedMatrixTest, ShouldRunEmptyModule) {
     auto* src = R"()";
@@ -82,7 +83,7 @@
            },
            {
                b.Stage(ast::PipelineStage::kCompute),
-               b.WorkgroupSize(1),
+               b.WorkgroupSize(1_i),
            });
 
     auto* expect = R"(
@@ -98,7 +99,7 @@
   return mat2x2<f32>(arr[0u], arr[1u]);
 }
 
-@stage(compute) @workgroup_size(1)
+@stage(compute) @workgroup_size(1i)
 fn f() {
   let x : mat2x2<f32> = arr_to_mat2x2_stride_32(s.m);
 }
@@ -132,14 +133,15 @@
                           }),
              });
     b.Global("s", b.ty.Of(S), ast::StorageClass::kUniform, b.GroupAndBinding(0, 0));
-    b.Func("f", {}, b.ty.void_(),
-           {
-               b.Decl(b.Let("x", b.ty.vec2<f32>(), b.IndexAccessor(b.MemberAccessor("s", "m"), 1))),
-           },
-           {
-               b.Stage(ast::PipelineStage::kCompute),
-               b.WorkgroupSize(1),
-           });
+    b.Func(
+        "f", {}, b.ty.void_(),
+        {
+            b.Decl(b.Let("x", b.ty.vec2<f32>(), b.IndexAccessor(b.MemberAccessor("s", "m"), 1_i))),
+        },
+        {
+            b.Stage(ast::PipelineStage::kCompute),
+            b.WorkgroupSize(1_i),
+        });
 
     auto* expect = R"(
 struct S {
@@ -150,9 +152,9 @@
 
 @group(0) @binding(0) var<uniform> s : S;
 
-@stage(compute) @workgroup_size(1)
+@stage(compute) @workgroup_size(1i)
 fn f() {
-  let x : vec2<f32> = s.m[1];
+  let x : vec2<f32> = s.m[1i];
 }
 )";
 
@@ -190,7 +192,7 @@
            },
            {
                b.Stage(ast::PipelineStage::kCompute),
-               b.WorkgroupSize(1),
+               b.WorkgroupSize(1_i),
            });
 
     auto* expect = R"(
@@ -203,7 +205,7 @@
 
 @group(0) @binding(0) var<uniform> s : S;
 
-@stage(compute) @workgroup_size(1)
+@stage(compute) @workgroup_size(1i)
 fn f() {
   let x : mat2x2<f32> = s.m;
 }
@@ -244,7 +246,7 @@
            },
            {
                b.Stage(ast::PipelineStage::kCompute),
-               b.WorkgroupSize(1),
+               b.WorkgroupSize(1_i),
            });
 
     auto* expect = R"(
@@ -260,7 +262,7 @@
   return mat2x2<f32>(arr[0u], arr[1u]);
 }
 
-@stage(compute) @workgroup_size(1)
+@stage(compute) @workgroup_size(1i)
 fn f() {
   let x : mat2x2<f32> = arr_to_mat2x2_stride_32(s.m);
 }
@@ -295,14 +297,15 @@
              });
     b.Global("s", b.ty.Of(S), ast::StorageClass::kStorage, ast::Access::kReadWrite,
              b.GroupAndBinding(0, 0));
-    b.Func("f", {}, b.ty.void_(),
-           {
-               b.Decl(b.Let("x", b.ty.vec2<f32>(), b.IndexAccessor(b.MemberAccessor("s", "m"), 1))),
-           },
-           {
-               b.Stage(ast::PipelineStage::kCompute),
-               b.WorkgroupSize(1),
-           });
+    b.Func(
+        "f", {}, b.ty.void_(),
+        {
+            b.Decl(b.Let("x", b.ty.vec2<f32>(), b.IndexAccessor(b.MemberAccessor("s", "m"), 1_i))),
+        },
+        {
+            b.Stage(ast::PipelineStage::kCompute),
+            b.WorkgroupSize(1_i),
+        });
 
     auto* expect = R"(
 struct S {
@@ -313,9 +316,9 @@
 
 @group(0) @binding(0) var<storage, read_write> s : S;
 
-@stage(compute) @workgroup_size(1)
+@stage(compute) @workgroup_size(1i)
 fn f() {
-  let x : vec2<f32> = s.m[1];
+  let x : vec2<f32> = s.m[1i];
 }
 )";
 
@@ -355,7 +358,7 @@
            },
            {
                b.Stage(ast::PipelineStage::kCompute),
-               b.WorkgroupSize(1),
+               b.WorkgroupSize(1_i),
            });
 
     auto* expect = R"(
@@ -371,7 +374,7 @@
   return @stride(32) array<vec2<f32>, 2u>(m[0u], m[1u]);
 }
 
-@stage(compute) @workgroup_size(1)
+@stage(compute) @workgroup_size(1i)
 fn f() {
   s.m = mat2x2_stride_32_to_arr(mat2x2<f32>(vec2<f32>(1.0, 2.0), vec2<f32>(3.0, 4.0)));
 }
@@ -408,11 +411,11 @@
              b.GroupAndBinding(0, 0));
     b.Func("f", {}, b.ty.void_(),
            {
-               b.Assign(b.IndexAccessor(b.MemberAccessor("s", "m"), 1), b.vec2<f32>(1.0f, 2.0f)),
+               b.Assign(b.IndexAccessor(b.MemberAccessor("s", "m"), 1_i), b.vec2<f32>(1.0f, 2.0f)),
            },
            {
                b.Stage(ast::PipelineStage::kCompute),
-               b.WorkgroupSize(1),
+               b.WorkgroupSize(1_i),
            });
 
     auto* expect = R"(
@@ -424,9 +427,9 @@
 
 @group(0) @binding(0) var<storage, read_write> s : S;
 
-@stage(compute) @workgroup_size(1)
+@stage(compute) @workgroup_size(1i)
 fn f() {
-  s.m[1] = vec2<f32>(1.0, 2.0);
+  s.m[1i] = vec2<f32>(1.0, 2.0);
 }
 )";
 
@@ -471,14 +474,14 @@
             b.Decl(b.Let("a", nullptr, b.AddressOf(b.MemberAccessor("s", "m")))),
             b.Decl(b.Let("b", nullptr, b.AddressOf(b.Deref(b.AddressOf(b.Deref("a")))))),
             b.Decl(b.Let("x", nullptr, b.Deref("b"))),
-            b.Decl(b.Let("y", nullptr, b.IndexAccessor(b.Deref("b"), 1))),
-            b.Decl(b.Let("z", nullptr, b.IndexAccessor("x", 1))),
+            b.Decl(b.Let("y", nullptr, b.IndexAccessor(b.Deref("b"), 1_i))),
+            b.Decl(b.Let("z", nullptr, b.IndexAccessor("x", 1_i))),
             b.Assign(b.Deref("b"), b.mat2x2<f32>(b.vec2<f32>(1.0f, 2.0f), b.vec2<f32>(3.0f, 4.0f))),
-            b.Assign(b.IndexAccessor(b.Deref("b"), 1), b.vec2<f32>(5.0f, 6.0f)),
+            b.Assign(b.IndexAccessor(b.Deref("b"), 1_i), b.vec2<f32>(5.0f, 6.0f)),
         },
         {
             b.Stage(ast::PipelineStage::kCompute),
-            b.WorkgroupSize(1),
+            b.WorkgroupSize(1_i),
         });
 
     auto* expect = R"(
@@ -498,13 +501,13 @@
   return @stride(32) array<vec2<f32>, 2u>(m[0u], m[1u]);
 }
 
-@stage(compute) @workgroup_size(1)
+@stage(compute) @workgroup_size(1i)
 fn f() {
   let x = arr_to_mat2x2_stride_32(s.m);
-  let y = s.m[1];
-  let z = x[1];
+  let y = s.m[1i];
+  let z = x[1i];
   s.m = mat2x2_stride_32_to_arr(mat2x2<f32>(vec2<f32>(1.0, 2.0), vec2<f32>(3.0, 4.0)));
-  s.m[1] = vec2<f32>(5.0, 6.0);
+  s.m[1i] = vec2<f32>(5.0, 6.0);
 }
 )";
 
@@ -542,7 +545,7 @@
            },
            {
                b.Stage(ast::PipelineStage::kCompute),
-               b.WorkgroupSize(1),
+               b.WorkgroupSize(1_i),
            });
 
     auto* expect = R"(
@@ -555,7 +558,7 @@
 
 var<private> s : S;
 
-@stage(compute) @workgroup_size(1)
+@stage(compute) @workgroup_size(1i)
 fn f() {
   let x : mat2x2<f32> = s.m;
 }
@@ -596,7 +599,7 @@
            },
            {
                b.Stage(ast::PipelineStage::kCompute),
-               b.WorkgroupSize(1),
+               b.WorkgroupSize(1_i),
            });
 
     auto* expect = R"(
@@ -609,7 +612,7 @@
 
 var<private> s : S;
 
-@stage(compute) @workgroup_size(1)
+@stage(compute) @workgroup_size(1i)
 fn f() {
   s.m = mat2x2<f32>(vec2<f32>(1.0, 2.0), vec2<f32>(3.0, 4.0));
 }
