wgsl: Do not require a semicolon after a struct

Don't generate them either, which generated a lot of test churn.

Fixed: tint:1380
Change-Id: I0a7cfdd2ef0ffe8e7fda111fbc57997b36b949e0
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/77165
Auto-Submit: James Price <jrprice@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/transform/add_spirv_block_decoration_test.cc b/src/transform/add_spirv_block_decoration_test.cc
index 74e4b33..e504c50 100644
--- a/src/transform/add_spirv_block_decoration_test.cc
+++ b/src/transform/add_spirv_block_decoration_test.cc
@@ -38,7 +38,7 @@
   auto* src = R"(
 struct S {
   f : f32;
-};
+}
 
 var<private> p : S;
 
@@ -59,7 +59,7 @@
 struct S {
   [[location(0)]]
   f : f32;
-};
+}
 
 [[stage(fragment)]]
 fn main() -> S {
@@ -87,7 +87,7 @@
 [[internal(spirv_block)]]
 struct u_block {
   inner : f32;
-};
+}
 
 [[group(0), binding(0)]] var<uniform> u : u_block;
 
@@ -116,7 +116,7 @@
 [[internal(spirv_block)]]
 struct u_block {
   inner : array<vec4<f32>, 4u>;
-};
+}
 
 [[group(0), binding(0)]] var<uniform> u : u_block;
 
@@ -149,7 +149,7 @@
 [[internal(spirv_block)]]
 struct u_block {
   inner : array<vec4<f32>, 4u>;
-};
+}
 
 [[group(0), binding(0)]] var<uniform> u : u_block;
 
@@ -182,7 +182,7 @@
 [[internal(spirv_block)]]
 struct S {
   f : f32;
-};
+}
 
 [[group(0), binding(0)]] var<uniform> u : S;
 
@@ -218,12 +218,12 @@
   auto* expect = R"(
 struct Inner {
   f : f32;
-};
+}
 
 [[internal(spirv_block)]]
 struct Outer {
   i : Inner;
-};
+}
 
 [[group(0), binding(0)]] var<uniform> u : Outer;
 
@@ -263,19 +263,19 @@
   auto* expect = R"(
 struct Inner {
   f : f32;
-};
+}
 
 [[internal(spirv_block)]]
 struct Outer {
   i : Inner;
-};
+}
 
 [[group(0), binding(0)]] var<uniform> u0 : Outer;
 
 [[internal(spirv_block)]]
 struct u1_block {
   inner : Inner;
-};
+}
 
 [[group(0), binding(1)]] var<uniform> u1 : u1_block;
 
@@ -315,18 +315,18 @@
   auto* expect = R"(
 struct Inner {
   f : f32;
-};
+}
 
 struct Outer {
   i : Inner;
-};
+}
 
 var<private> p : Outer;
 
 [[internal(spirv_block)]]
 struct u_block {
   inner : Inner;
-};
+}
 
 [[group(0), binding(1)]] var<uniform> u : u_block;
 
@@ -371,19 +371,19 @@
   auto* expect = R"(
 struct Inner {
   f : f32;
-};
+}
 
 [[internal(spirv_block)]]
 struct S {
   i : Inner;
-};
+}
 
 [[group(0), binding(0)]] var<uniform> u0 : S;
 
 [[internal(spirv_block)]]
 struct u1_block {
   inner : Inner;
-};
+}
 
 [[group(0), binding(1)]] var<uniform> u1 : u1_block;
 
@@ -420,12 +420,12 @@
   auto* expect = R"(
 struct S {
   f : f32;
-};
+}
 
 [[internal(spirv_block)]]
 struct u_block {
   inner : S;
-};
+}
 
 [[group(0), binding(0)]] var<uniform> u : u_block;
 
@@ -463,12 +463,12 @@
   auto* expect = R"(
 struct S {
   f : f32;
-};
+}
 
 [[internal(spirv_block)]]
 struct u0_block {
   inner : S;
-};
+}
 
 [[group(0), binding(0)]] var<uniform> u0 : u0_block;
 
@@ -516,14 +516,14 @@
   auto* expect = R"(
 struct Inner {
   f : f32;
-};
+}
 
 type MyInner = Inner;
 
 [[internal(spirv_block)]]
 struct Outer {
   i : MyInner;
-};
+}
 
 type MyOuter = Outer;
 
@@ -532,7 +532,7 @@
 [[internal(spirv_block)]]
 struct u1_block {
   inner : Inner;
-};
+}
 
 [[group(0), binding(1)]] var<uniform> u1 : u1_block;
 
diff --git a/src/transform/array_length_from_uniform_test.cc b/src/transform/array_length_from_uniform_test.cc
index 77fb0c3..b9139a9 100644
--- a/src/transform/array_length_from_uniform_test.cc
+++ b/src/transform/array_length_from_uniform_test.cc
@@ -63,7 +63,7 @@
   auto* expect = R"(
 struct tint_symbol {
   buffer_size : array<vec4<u32>, 1u>;
-};
+}
 
 [[group(0), binding(30)]] var<uniform> tint_symbol_1 : tint_symbol;
 
@@ -106,14 +106,14 @@
   auto* expect = R"(
 struct tint_symbol {
   buffer_size : array<vec4<u32>, 1u>;
-};
+}
 
 [[group(0), binding(30)]] var<uniform> tint_symbol_1 : tint_symbol;
 
 struct SB {
   x : i32;
   arr : array<i32>;
-};
+}
 
 [[group(0), binding(0)]] var<storage, read> sb : SB;
 
@@ -149,7 +149,7 @@
   auto* expect = R"(
 struct tint_symbol {
   buffer_size : array<vec4<u32>, 1u>;
-};
+}
 
 [[group(0), binding(30)]] var<uniform> tint_symbol_1 : tint_symbol;
 
@@ -193,7 +193,7 @@
   auto* expect = R"(
 struct tint_symbol {
   buffer_size : array<vec4<u32>, 1u>;
-};
+}
 
 [[group(0), binding(30)]] var<uniform> tint_symbol_1 : tint_symbol;
 
@@ -201,7 +201,7 @@
   x : i32;
   y : f32;
   arr : [[stride(64)]] array<i32>;
-};
+}
 
 [[group(0), binding(0)]] var<storage, read> sb : SB;
 
@@ -259,24 +259,24 @@
   auto* expect = R"(
 struct tint_symbol {
   buffer_size : array<vec4<u32>, 2u>;
-};
+}
 
 [[group(0), binding(30)]] var<uniform> tint_symbol_1 : tint_symbol;
 
 struct SB1 {
   x : i32;
   arr1 : array<i32>;
-};
+}
 
 struct SB2 {
   x : i32;
   arr2 : array<vec4<f32>>;
-};
+}
 
 struct SB4 {
   x : i32;
   arr4 : array<vec4<f32>>;
-};
+}
 
 [[group(0), binding(2)]] var<storage, read> sb1 : SB1;
 
@@ -348,24 +348,24 @@
   auto* expect = R"(
 struct tint_symbol {
   buffer_size : array<vec4<u32>, 1u>;
-};
+}
 
 [[group(0), binding(30)]] var<uniform> tint_symbol_1 : tint_symbol;
 
 struct SB1 {
   x : i32;
   arr1 : array<i32>;
-};
+}
 
 struct SB2 {
   x : i32;
   arr2 : array<vec4<f32>>;
-};
+}
 
 struct SB4 {
   x : i32;
   arr4 : array<vec4<f32>>;
-};
+}
 
 [[group(0), binding(2)]] var<storage, read> sb1 : SB1;
 
@@ -407,7 +407,7 @@
 struct SB {
   x : i32;
   arr : array<i32>;
-};
+}
 
 [[group(0), binding(0)]] var<storage, read> sb : SB;
 
@@ -457,19 +457,19 @@
   auto* expect = R"(
 struct tint_symbol {
   buffer_size : array<vec4<u32>, 1u>;
-};
+}
 
 [[group(0), binding(30)]] var<uniform> tint_symbol_1 : tint_symbol;
 
 struct SB1 {
   x : i32;
   arr1 : array<i32>;
-};
+}
 
 struct SB2 {
   x : i32;
   arr2 : array<vec4<f32>>;
-};
+}
 
 [[group(0), binding(2)]] var<storage, read> sb1 : SB1;
 
diff --git a/src/transform/binding_remapper_test.cc b/src/transform/binding_remapper_test.cc
index 87e205a..de85cb0 100644
--- a/src/transform/binding_remapper_test.cc
+++ b/src/transform/binding_remapper_test.cc
@@ -28,7 +28,7 @@
   auto* src = R"(
 struct S {
   a : f32;
-};
+}
 
 [[group(2), binding(1)]] var<storage, read> a : S;
 
@@ -67,7 +67,7 @@
   auto* expect = R"(
 struct S {
   a : f32;
-};
+}
 
 [[group(1), binding(2)]] var<storage, read> a : S;
 
@@ -111,7 +111,7 @@
   auto* expect = R"(
 struct S {
   a : f32;
-};
+}
 
 [[group(2), binding(1)]] var<storage, write> a : S;
 
@@ -215,7 +215,7 @@
   auto* expect = R"(
 struct S {
   a : f32;
-};
+}
 
 [[group(4), binding(5)]] var<storage, write> a : S;
 
@@ -264,7 +264,7 @@
   auto* expect = R"(
 struct S {
   i : i32;
-};
+}
 
 [[internal(disable_validation__binding_point_collision), group(1), binding(1)]] var<storage, read> a : S;
 
@@ -321,7 +321,7 @@
   auto* expect = R"(
 struct S {
   i : i32;
-};
+}
 
 [[group(1), binding(1)]] var<storage, read> a : S;
 
diff --git a/src/transform/calculate_array_length_test.cc b/src/transform/calculate_array_length_test.cc
index 4b42bf9..83e0ac7 100644
--- a/src/transform/calculate_array_length_test.cc
+++ b/src/transform/calculate_array_length_test.cc
@@ -85,7 +85,7 @@
 struct SB {
   x : i32;
   arr : array<i32>;
-};
+}
 
 [[internal(intrinsic_buffer_size)]]
 fn tint_symbol([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, result : ptr<function, u32>)
@@ -161,7 +161,7 @@
 struct SB {
   x : i32;
   arr : array<i32>;
-};
+}
 
 [[internal(intrinsic_buffer_size)]]
 fn tint_symbol([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, result : ptr<function, u32>)
@@ -235,7 +235,7 @@
   x : i32;
   y : f32;
   arr : [[stride(64)]] array<i32>;
-};
+}
 
 [[internal(intrinsic_buffer_size)]]
 fn tint_symbol([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, result : ptr<function, u32>)
@@ -281,7 +281,7 @@
 struct SB {
   x : i32;
   arr : array<i32>;
-};
+}
 
 [[internal(intrinsic_buffer_size)]]
 fn tint_symbol([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, result : ptr<function, u32>)
@@ -345,7 +345,7 @@
 struct SB1 {
   x : i32;
   arr1 : array<i32>;
-};
+}
 
 [[internal(intrinsic_buffer_size)]]
 fn tint_symbol([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB1, result : ptr<function, u32>)
@@ -353,7 +353,7 @@
 struct SB2 {
   x : i32;
   arr2 : array<vec4<f32>>;
-};
+}
 
 [[internal(intrinsic_buffer_size)]]
 fn tint_symbol_3([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB2, result : ptr<function, u32>)
@@ -412,7 +412,7 @@
 struct SB {
   x : i32;
   arr : array<i32>;
-};
+}
 
 [[internal(intrinsic_buffer_size)]]
 fn tint_symbol([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, result : ptr<function, u32>)
diff --git a/src/transform/canonicalize_entry_point_io_test.cc b/src/transform/canonicalize_entry_point_io_test.cc
index e2daa97..3c16ee5 100644
--- a/src/transform/canonicalize_entry_point_io_test.cc
+++ b/src/transform/canonicalize_entry_point_io_test.cc
@@ -121,7 +121,7 @@
   loc1 : f32;
   [[location(2)]]
   loc2 : vec4<u32>;
-};
+}
 
 fn frag_main_inner(loc1 : f32, loc2 : vec4<u32>, coord : vec4<f32>) {
   var col : f32 = (coord.x * loc1);
@@ -159,7 +159,7 @@
   loc2 : vec4<u32>;
   [[builtin(position)]]
   coord : vec4<f32>;
-};
+}
 
 fn frag_main_inner(loc1 : f32, loc2 : vec4<u32>, coord : vec4<f32>) {
   var col : f32 = (coord.x * loc1);
@@ -195,7 +195,7 @@
 struct tint_symbol_1 {
   [[location(1)]]
   loc1 : f32;
-};
+}
 
 fn frag_main_inner(loc1 : myf32) {
   var x : myf32 = loc1;
@@ -244,12 +244,12 @@
 
 struct FragBuiltins {
   coord : vec4<f32>;
-};
+}
 
 struct FragLocations {
   loc1 : f32;
   loc2 : vec4<u32>;
-};
+}
 
 fn frag_main_inner(loc0 : f32, locations : FragLocations, builtins : FragBuiltins) {
   var col : f32 = ((builtins.coord.x * locations.loc1) + loc0);
@@ -290,12 +290,12 @@
   auto* expect = R"(
 struct FragBuiltins {
   coord : vec4<f32>;
-};
+}
 
 struct FragLocations {
   loc1 : f32;
   loc2 : vec4<u32>;
-};
+}
 
 struct tint_symbol_1 {
   [[location(0)]]
@@ -304,7 +304,7 @@
   loc1 : f32;
   [[location(2)]]
   loc2 : vec4<u32>;
-};
+}
 
 fn frag_main_inner(loc0 : f32, locations : FragLocations, builtins : FragBuiltins) {
   var col : f32 = ((builtins.coord.x * locations.loc1) + loc0);
@@ -345,12 +345,12 @@
   auto* expect = R"(
 struct FragBuiltins {
   coord : vec4<f32>;
-};
+}
 
 struct FragLocations {
   loc1 : f32;
   loc2 : vec4<u32>;
-};
+}
 
 struct tint_symbol_1 {
   [[location(0)]]
@@ -361,7 +361,7 @@
   loc2 : vec4<u32>;
   [[builtin(position)]]
   coord : vec4<f32>;
-};
+}
 
 fn frag_main_inner(loc0 : f32, locations : FragLocations, builtins : FragBuiltins) {
   var col : f32 = ((builtins.coord.x * locations.loc1) + loc0);
@@ -423,7 +423,7 @@
 struct tint_symbol {
   [[builtin(frag_depth)]]
   value : f32;
-};
+}
 
 fn frag_main_inner() -> f32 {
   return 1.0;
@@ -458,7 +458,7 @@
 struct tint_symbol {
   [[builtin(frag_depth)]]
   value : f32;
-};
+}
 
 fn frag_main_inner() -> f32 {
   return 1.0;
@@ -510,7 +510,7 @@
   color : vec4<f32>;
   depth : f32;
   mask : u32;
-};
+}
 
 fn frag_main_inner() -> FragOutput {
   var output : FragOutput;
@@ -560,7 +560,7 @@
   color : vec4<f32>;
   depth : f32;
   mask : u32;
-};
+}
 
 struct tint_symbol {
   [[location(0)]]
@@ -569,7 +569,7 @@
   depth : f32;
   [[builtin(sample_mask)]]
   mask : u32;
-};
+}
 
 fn frag_main_inner() -> FragOutput {
   var output : FragOutput;
@@ -621,7 +621,7 @@
   color : vec4<f32>;
   depth : f32;
   mask : u32;
-};
+}
 
 struct tint_symbol {
   [[location(0)]]
@@ -630,7 +630,7 @@
   depth : f32;
   [[builtin(sample_mask)]]
   mask : u32;
-};
+}
 
 fn frag_main_inner() -> FragOutput {
   var output : FragOutput;
@@ -694,7 +694,7 @@
 struct FragmentInput {
   value : f32;
   mul : f32;
-};
+}
 
 fn foo(x : FragmentInput) -> f32 {
   return (x.value * x.mul);
@@ -754,7 +754,7 @@
 struct FragmentInput {
   value : f32;
   mul : f32;
-};
+}
 
 fn foo(x : FragmentInput) -> f32 {
   return (x.value * x.mul);
@@ -765,7 +765,7 @@
   value : f32;
   [[location(1)]]
   mul : f32;
-};
+}
 
 fn frag_main1_inner(inputs : FragmentInput) {
   var x : f32 = foo(inputs);
@@ -781,7 +781,7 @@
   value : f32;
   [[location(1)]]
   mul : f32;
-};
+}
 
 fn frag_main2_inner(inputs : FragmentInput) {
   var x : f32 = foo(inputs);
@@ -828,7 +828,7 @@
 struct FragmentInput {
   value : f32;
   mul : f32;
-};
+}
 
 fn foo(x : FragmentInput) -> f32 {
   return (x.value * x.mul);
@@ -839,7 +839,7 @@
   value : f32;
   [[location(1)]]
   mul : f32;
-};
+}
 
 fn frag_main1_inner(inputs : FragmentInput) {
   var x : f32 = foo(inputs);
@@ -855,7 +855,7 @@
   value : f32;
   [[location(1)]]
   mul : f32;
-};
+}
 
 fn frag_main2_inner(inputs : FragmentInput) {
   var x : f32 = foo(inputs);
@@ -904,7 +904,7 @@
 struct FragmentInput {
   col1 : f32;
   col2 : f32;
-};
+}
 
 var<private> global_inputs : FragmentInput;
 
@@ -921,7 +921,7 @@
   col1 : f32;
   [[location(1)]]
   col2 : f32;
-};
+}
 
 fn frag_main1_inner(inputs : FragmentInput) {
   global_inputs = inputs;
@@ -978,12 +978,12 @@
 struct FragmentInput {
   col1 : myf32;
   col2 : myf32;
-};
+}
 
 struct FragmentOutput {
   col1 : myf32;
   col2 : myf32;
-};
+}
 
 type MyFragmentInput = FragmentInput;
 
@@ -998,14 +998,14 @@
   col1 : f32;
   [[location(1)]]
   col2 : f32;
-};
+}
 
 struct tint_symbol_2 {
   [[location(0)]]
   col1 : f32;
   [[location(1)]]
   col2 : f32;
-};
+}
 
 fn frag_main_inner(inputs : MyFragmentInput) -> MyFragmentOutput {
   var x : myf32 = foo(inputs);
@@ -1062,12 +1062,12 @@
   loc1 : f32;
   loc2 : f32;
   loc3 : f32;
-};
+}
 
 struct FragmentIn {
   loc1 : f32;
   loc2 : f32;
-};
+}
 
 struct tint_symbol {
   [[location(1), interpolate(flat)]]
@@ -1078,7 +1078,7 @@
   loc3 : f32;
   [[builtin(position)]]
   pos : vec4<f32>;
-};
+}
 
 fn vert_main_inner() -> VertexOut {
   return VertexOut();
@@ -1102,7 +1102,7 @@
   loc2 : f32;
   [[location(3), interpolate(perspective, centroid)]]
   loc3 : f32;
-};
+}
 
 fn frag_main_inner(inputs : FragmentIn, loc3 : f32) {
   let x = ((inputs.loc1 + inputs.loc2) + loc3);
@@ -1200,7 +1200,7 @@
   u : u32;
   vi : vec4<i32>;
   vu : vec4<u32>;
-};
+}
 
 struct VertexOut {
   i : i32;
@@ -1208,14 +1208,14 @@
   vi : vec4<i32>;
   vu : vec4<u32>;
   pos : vec4<f32>;
-};
+}
 
 struct FragmentInterface {
   i : i32;
   u : u32;
   vi : vec4<i32>;
   vu : vec4<u32>;
-};
+}
 
 fn vert_main_inner(in : VertexIn) -> VertexOut {
   return VertexOut(in.i, in.u, in.vi, in.vu, vec4<f32>());
@@ -1273,12 +1273,12 @@
   auto* expect = R"(
 struct VertexOut {
   pos : vec4<f32>;
-};
+}
 
 struct tint_symbol {
   [[builtin(position), invariant]]
   pos : vec4<f32>;
-};
+}
 
 fn main1_inner() -> VertexOut {
   return VertexOut();
@@ -1295,7 +1295,7 @@
 struct tint_symbol_1 {
   [[builtin(position), invariant]]
   value : vec4<f32>;
-};
+}
 
 fn main2_inner() -> vec4<f32> {
   return vec4<f32>();
@@ -1344,12 +1344,12 @@
   coord : vec4<f32>;
   [[align(128)]]
   loc0 : f32;
-};
+}
 
 struct FragmentOutput {
   [[size(16)]]
   value : f32;
-};
+}
 
 struct tint_symbol_1 {
   [[location(0), interpolate(linear, sample)]]
@@ -1358,12 +1358,12 @@
   value : f32;
   [[builtin(position)]]
   coord : vec4<f32>;
-};
+}
 
 struct tint_symbol_2 {
   [[location(1), interpolate(flat)]]
   value : f32;
-};
+}
 
 fn frag_main_inner(inputs : FragmentInput) -> FragmentOutput {
   return FragmentOutput(((inputs.coord.x * inputs.value) + inputs.loc0));
@@ -1422,13 +1422,13 @@
   d : u32;
   a : f32;
   c : i32;
-};
+}
 
 struct FragmentInputExtra {
   d : u32;
   pos : vec4<f32>;
   a : f32;
-};
+}
 
 struct tint_symbol {
   [[location(0)]]
@@ -1441,7 +1441,7 @@
   d : u32;
   [[builtin(position)]]
   pos : vec4<f32>;
-};
+}
 
 fn vert_main_inner() -> VertexOutput {
   return VertexOutput();
@@ -1472,7 +1472,7 @@
   pos : vec4<f32>;
   [[builtin(front_facing)]]
   ff : bool;
-};
+}
 
 fn frag_main_inner(ff : bool, c : i32, inputs : FragmentInputExtra, b : u32) {
 }
@@ -1502,7 +1502,7 @@
 struct tint_symbol_2 {
   [[location(0)]]
   col : f32;
-};
+}
 
 fn tint_symbol_1_inner(col : f32) {
 }
@@ -1532,7 +1532,7 @@
 struct tint_symbol {
   [[builtin(sample_mask)]]
   fixed_sample_mask : u32;
-};
+}
 
 fn frag_main_inner() {
 }
@@ -1566,7 +1566,7 @@
 struct tint_symbol {
   [[builtin(sample_mask)]]
   fixed_sample_mask : u32;
-};
+}
 
 fn frag_main_inner() {
   return;
@@ -1601,7 +1601,7 @@
 struct tint_symbol {
   [[builtin(sample_mask)]]
   value : u32;
-};
+}
 
 fn frag_main_inner() -> u32 {
   return 7u;
@@ -1638,7 +1638,7 @@
   value : f32;
   [[builtin(sample_mask)]]
   fixed_sample_mask : u32;
-};
+}
 
 fn frag_main_inner() -> f32 {
   return 1.0;
@@ -1681,7 +1681,7 @@
   depth : f32;
   mask : u32;
   value : f32;
-};
+}
 
 struct tint_symbol {
   [[location(0)]]
@@ -1690,7 +1690,7 @@
   depth : f32;
   [[builtin(sample_mask)]]
   mask : u32;
-};
+}
 
 fn frag_main_inner() -> Output {
   return Output(0.5, 7u, 1.0);
@@ -1733,7 +1733,7 @@
 struct Output {
   depth : f32;
   value : f32;
-};
+}
 
 struct tint_symbol {
   [[location(0)]]
@@ -1742,7 +1742,7 @@
   depth : f32;
   [[builtin(sample_mask)]]
   fixed_sample_mask : u32;
-};
+}
 
 fn frag_main_inner() -> Output {
   return Output(0.5, 1.0);
@@ -1793,7 +1793,7 @@
 struct tint_symbol {
   [[builtin(sample_mask)]]
   value : u32;
-};
+}
 
 fn frag_main1_inner() -> u32 {
   return 7u;
@@ -1812,7 +1812,7 @@
   value : f32;
   [[builtin(sample_mask)]]
   fixed_sample_mask : u32;
-};
+}
 
 fn frag_main2_inner() -> f32 {
   return 1.0;
@@ -1830,7 +1830,7 @@
 struct tint_symbol_2 {
   [[builtin(position)]]
   value : vec4<f32>;
-};
+}
 
 fn vert_main1_inner() -> vec4<f32> {
   return vec4<f32>();
@@ -1874,7 +1874,7 @@
 struct FragOut {
   fixed_sample_mask : vec4<f32>;
   fixed_sample_mask_1 : vec4<f32>;
-};
+}
 
 struct tint_symbol {
   [[location(0)]]
@@ -1883,7 +1883,7 @@
   fixed_sample_mask_1 : vec4<f32>;
   [[builtin(sample_mask)]]
   fixed_sample_mask_2 : u32;
-};
+}
 
 fn frag_main_inner() -> FragOut {
   return FragOut();
@@ -1956,7 +1956,7 @@
   value : vec4<f32>;
   [[builtin(pointsize)]]
   vertex_point_size : f32;
-};
+}
 
 fn vert_main_inner() -> vec4<f32> {
   return vec4<f32>();
@@ -1999,7 +1999,7 @@
 
 struct VertOut {
   pos : vec4<f32>;
-};
+}
 
 fn vert_main_inner() -> VertOut {
   return VertOut();
@@ -2036,14 +2036,14 @@
   auto* expect = R"(
 struct VertOut {
   pos : vec4<f32>;
-};
+}
 
 struct tint_symbol {
   [[builtin(position)]]
   pos : vec4<f32>;
   [[builtin(pointsize)]]
   vertex_point_size : f32;
-};
+}
 
 fn vert_main_inner() -> VertOut {
   return VertOut();
@@ -2112,16 +2112,16 @@
 
 struct VertIn1 {
   collide : f32;
-};
+}
 
 struct VertIn2 {
   collide : f32;
-};
+}
 
 struct VertOut {
   vertex_point_size : f32;
   vertex_point_size_1 : vec4<f32>;
-};
+}
 
 fn vert_main_inner(collide : VertIn1, collide_1 : VertIn2) -> VertOut {
   let x = (collide.collide + collide_1.collide);
@@ -2170,23 +2170,23 @@
   auto* expect = R"(
 struct VertIn1 {
   collide : f32;
-};
+}
 
 struct VertIn2 {
   collide : f32;
-};
+}
 
 struct VertOut {
   vertex_point_size : vec4<f32>;
   vertex_point_size_1 : vec4<f32>;
-};
+}
 
 struct tint_symbol_1 {
   [[location(0)]]
   collide : f32;
   [[location(1)]]
   collide_2 : f32;
-};
+}
 
 struct tint_symbol_2 {
   [[location(0)]]
@@ -2195,7 +2195,7 @@
   vertex_point_size_1 : vec4<f32>;
   [[builtin(pointsize)]]
   vertex_point_size_2 : f32;
-};
+}
 
 fn vert_main_inner(collide : VertIn1, collide_1 : VertIn2) -> VertOut {
   let x = (collide.collide + collide_1.collide);
@@ -2246,23 +2246,23 @@
   auto* expect = R"(
 struct VertIn1 {
   collide : f32;
-};
+}
 
 struct VertIn2 {
   collide : f32;
-};
+}
 
 struct VertOut {
   vertex_point_size : vec4<f32>;
   vertex_point_size_1 : vec4<f32>;
-};
+}
 
 struct tint_symbol_1 {
   [[location(0)]]
   collide : f32;
   [[location(1)]]
   collide_2 : f32;
-};
+}
 
 struct tint_symbol_2 {
   [[location(0)]]
@@ -2271,7 +2271,7 @@
   vertex_point_size_1 : vec4<f32>;
   [[builtin(pointsize)]]
   vertex_point_size_2 : f32;
-};
+}
 
 fn vert_main_inner(collide : VertIn1, collide_1 : VertIn2) -> VertOut {
   let x = (collide.collide + collide_1.collide);
diff --git a/src/transform/decompose_memory_access_test.cc b/src/transform/decompose_memory_access_test.cc
index 046d88c..c28f48e 100644
--- a/src/transform/decompose_memory_access_test.cc
+++ b/src/transform/decompose_memory_access_test.cc
@@ -102,7 +102,7 @@
   t : mat4x3<f32>;
   u : mat4x4<f32>;
   v : array<vec3<f32>, 2>;
-};
+}
 
 [[group(0), binding(0)]] var<storage, read_write> sb : SB;
 
@@ -298,7 +298,7 @@
   t : mat4x3<f32>;
   u : mat4x4<f32>;
   v : array<vec3<f32>, 2>;
-};
+}
 
 [[group(0), binding(0)]] var<uniform> ub : UB;
 
@@ -494,7 +494,7 @@
   t : mat4x3<f32>;
   u : mat4x4<f32>;
   v : array<vec3<f32>, 2>;
-};
+}
 
 [[group(0), binding(0)]] var<storage, read_write> sb : SB;
 
@@ -686,7 +686,7 @@
   t : mat4x3<f32>;
   u : mat4x4<f32>;
   v : array<vec3<f32>, 2>;
-};
+}
 
 [[group(0), binding(0)]] var<storage, read_write> sb : SB;
 
@@ -844,7 +844,7 @@
   t : mat4x3<f32>;
   u : mat4x4<f32>;
   v : array<vec3<f32>, 2>;
-};
+}
 
 [[group(0), binding(0)]] var<storage, read_write> sb : SB;
 
@@ -1021,19 +1021,19 @@
   a : i32;
   b : vec3<f32>;
   c : i32;
-};
+}
 
 struct S2 {
   a : i32;
   b : [[stride(32)]] array<S1, 3>;
   c : i32;
-};
+}
 
 struct SB {
   [[size(128)]]
   a : i32;
   b : [[stride(256)]] array<S2>;
-};
+}
 
 [[group(0), binding(0)]] var<storage, read_write> sb : SB;
 
@@ -1087,19 +1087,19 @@
   a : i32;
   b : vec3<f32>;
   c : i32;
-};
+}
 
 struct S2 {
   a : i32;
   b : [[stride(32)]] array<S1, 3>;
   c : i32;
-};
+}
 
 struct SB {
   [[size(128)]]
   a : i32;
   b : [[stride(256)]] array<S2>;
-};
+}
 
 [[group(0), binding(0)]] var<storage, read_write> sb : SB;
 
@@ -1164,7 +1164,7 @@
   a : i32;
   b : vec3<f32>;
   c : i32;
-};
+}
 
 type A1 = S1;
 
@@ -1174,7 +1174,7 @@
   a : i32;
   b : A1_Array;
   c : i32;
-};
+}
 
 type A2 = S2;
 
@@ -1184,7 +1184,7 @@
   [[size(128)]]
   a : i32;
   b : A2_Array;
-};
+}
 
 [[group(0), binding(0)]] var<storage, read_write> sb : SB;
 
@@ -1248,7 +1248,7 @@
   padding : vec4<f32>;
   a : atomic<i32>;
   b : atomic<u32>;
-};
+}
 
 [[group(0), binding(0)]] var<storage, read_write> sb : SB;
 
@@ -1356,7 +1356,7 @@
   padding : vec4<f32>;
   a : atomic<i32>;
   b : atomic<u32>;
-};
+}
 
 var<workgroup> w : S;
 
diff --git a/src/transform/decompose_strided_matrix_test.cc b/src/transform/decompose_strided_matrix_test.cc
index 41555dc..db31c62 100644
--- a/src/transform/decompose_strided_matrix_test.cc
+++ b/src/transform/decompose_strided_matrix_test.cc
@@ -91,7 +91,7 @@
   [[size(16)]]
   padding : u32;
   m : [[stride(32)]] array<vec2<f32>, 2u>;
-};
+}
 
 [[group(0), binding(0)]] var<uniform> s : S;
 
@@ -152,7 +152,7 @@
   [[size(16)]]
   padding : u32;
   m : [[stride(32)]] array<vec2<f32>, 2u>;
-};
+}
 
 [[group(0), binding(0)]] var<uniform> s : S;
 
@@ -210,7 +210,7 @@
   padding : u32;
   [[stride(8), internal(disable_validation__ignore_stride)]]
   m : mat2x2<f32>;
-};
+}
 
 [[group(0), binding(0)]] var<uniform> s : S;
 
@@ -267,7 +267,7 @@
   [[size(8)]]
   padding : u32;
   m : [[stride(32)]] array<vec2<f32>, 2u>;
-};
+}
 
 [[group(0), binding(0)]] var<storage, read_write> s : S;
 
@@ -328,7 +328,7 @@
   [[size(16)]]
   padding : u32;
   m : [[stride(32)]] array<vec2<f32>, 2u>;
-};
+}
 
 [[group(0), binding(0)]] var<storage, read_write> s : S;
 
@@ -386,7 +386,7 @@
   [[size(8)]]
   padding : u32;
   m : [[stride(32)]] array<vec2<f32>, 2u>;
-};
+}
 
 [[group(0), binding(0)]] var<storage, read_write> s : S;
 
@@ -447,7 +447,7 @@
   [[size(8)]]
   padding : u32;
   m : [[stride(32)]] array<vec2<f32>, 2u>;
-};
+}
 
 [[group(0), binding(0)]] var<storage, read_write> s : S;
 
@@ -519,7 +519,7 @@
   [[size(8)]]
   padding : u32;
   m : [[stride(32)]] array<vec2<f32>, 2u>;
-};
+}
 
 [[group(0), binding(0)]] var<storage, read_write> s : S;
 
@@ -588,7 +588,7 @@
   padding : u32;
   [[stride(32), internal(disable_validation__ignore_stride)]]
   m : mat2x2<f32>;
-};
+}
 
 var<private> s : S;
 
@@ -646,7 +646,7 @@
   padding : u32;
   [[stride(32), internal(disable_validation__ignore_stride)]]
   m : mat2x2<f32>;
-};
+}
 
 var<private> s : S;
 
diff --git a/src/transform/first_index_offset_test.cc b/src/transform/first_index_offset_test.cc
index 8d537e0..6368d29 100644
--- a/src/transform/first_index_offset_test.cc
+++ b/src/transform/first_index_offset_test.cc
@@ -61,7 +61,7 @@
   auto* expect = R"(
 struct tint_symbol {
   first_vertex_index : u32;
-};
+}
 
 [[binding(1), group(2)]] var<uniform> tint_symbol_1 : tint_symbol;
 
@@ -107,7 +107,7 @@
   auto* expect = R"(
 struct tint_symbol {
   first_instance_index : u32;
-};
+}
 
 [[binding(1), group(7)]] var<uniform> tint_symbol_1 : tint_symbol;
 
@@ -159,7 +159,7 @@
 struct tint_symbol {
   first_vertex_index : u32;
   first_instance_index : u32;
-};
+}
 
 [[binding(1), group(2)]] var<uniform> tint_symbol_1 : tint_symbol;
 
@@ -172,7 +172,7 @@
   instance_idx : u32;
   [[builtin(vertex_index)]]
   vert_idx : u32;
-};
+}
 
 [[stage(vertex)]]
 fn entry(inputs : Inputs) -> [[builtin(position)]] vec4<f32> {
@@ -216,7 +216,7 @@
   auto* expect = R"(
 struct tint_symbol {
   first_vertex_index : u32;
-};
+}
 
 [[binding(1), group(2)]] var<uniform> tint_symbol_1 : tint_symbol;
 
@@ -279,7 +279,7 @@
 struct tint_symbol {
   first_vertex_index : u32;
   first_instance_index : u32;
-};
+}
 
 [[binding(1), group(2)]] var<uniform> tint_symbol_1 : tint_symbol;
 
diff --git a/src/transform/localize_struct_array_assignment_test.cc b/src/transform/localize_struct_array_assignment_test.cc
index 197aa02..2b3b0c9 100644
--- a/src/transform/localize_struct_array_assignment_test.cc
+++ b/src/transform/localize_struct_array_assignment_test.cc
@@ -70,15 +70,15 @@
 [[block]]
 struct Uniforms {
   i : u32;
-};
+}
 
 struct InnerS {
   v : i32;
-};
+}
 
 struct OuterS {
   a1 : array<InnerS, 8>;
-};
+}
 
 [[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
 
@@ -132,19 +132,19 @@
 [[block]]
 struct Uniforms {
   i : u32;
-};
+}
 
 struct InnerS {
   v : i32;
-};
+}
 
 struct S1 {
   a : array<InnerS, 8>;
-};
+}
 
 struct OuterS {
   s2 : S1;
-};
+}
 
 [[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
 
@@ -196,15 +196,15 @@
 struct Uniforms {
   i : u32;
   j : u32;
-};
+}
 
 struct InnerS {
   v : i32;
-};
+}
 
 struct OuterS {
   a1 : array<array<InnerS, 8>, 8>;
-};
+}
 
 [[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
 
@@ -258,19 +258,19 @@
 [[block]]
 struct Uniforms {
   i : u32;
-};
+}
 
 struct InnerS {
   v : i32;
-};
+}
 
 struct S1 {
   s2 : InnerS;
-};
+}
 
 struct OuterS {
   a1 : array<S1, 8>;
-};
+}
 
 [[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
 
@@ -326,19 +326,19 @@
 struct Uniforms {
   i : u32;
   j : u32;
-};
+}
 
 struct InnerS {
   v : i32;
-};
+}
 
 struct S1 {
   a2 : array<InnerS, 8>;
-};
+}
 
 struct OuterS {
   a1 : array<S1, 8>;
-};
+}
 
 [[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
 
@@ -403,19 +403,19 @@
 struct Uniforms {
   i : u32;
   j : u32;
-};
+}
 
 struct InnerS {
   v : i32;
-};
+}
 
 struct S1 {
   a2 : array<InnerS, 8>;
-};
+}
 
 struct OuterS {
   a1 : array<S1, 8>;
-};
+}
 
 var<private> nextIndex : u32;
 
@@ -476,15 +476,15 @@
 [[block]]
 struct Uniforms {
   i : u32;
-};
+}
 
 struct InnerS {
   v : i32;
-};
+}
 
 struct OuterS {
   a1 : array<InnerS, 8>;
-};
+}
 
 [[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
 
@@ -544,15 +544,15 @@
 [[block]]
 struct Uniforms {
   i : u32;
-};
+}
 
 struct InnerS {
   v : i32;
-};
+}
 
 struct OuterS {
   a1 : array<InnerS, 8>;
-};
+}
 
 [[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
 
@@ -584,12 +584,12 @@
 [[block]]
 struct Uniforms {
   i : u32;
-};
+}
 
 [[block]]
 struct OuterS {
   a1 : array<u32, 8>;
-};
+}
 
 [[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
 
diff --git a/src/transform/module_scope_var_to_entry_point_param_test.cc b/src/transform/module_scope_var_to_entry_point_param_test.cc
index 0f7d518..87507ce 100644
--- a/src/transform/module_scope_var_to_entry_point_param_test.cc
+++ b/src/transform/module_scope_var_to_entry_point_param_test.cc
@@ -218,7 +218,7 @@
   auto* expect = R"(
 struct S {
   a : f32;
-};
+}
 
 [[stage(compute), workgroup_size(1)]]
 fn main([[group(0), binding(0), internal(disable_validation__entry_point_parameter), internal(disable_validation__ignore_storage_class)]] tint_symbol : ptr<uniform, S>, [[group(0), binding(1), internal(disable_validation__entry_point_parameter), internal(disable_validation__ignore_storage_class)]] tint_symbol_1 : ptr<storage, S>) {
@@ -246,7 +246,7 @@
   auto* expect = R"(
 struct tint_symbol_1 {
   arr : array<f32>;
-};
+}
 
 [[stage(compute), workgroup_size(1)]]
 fn main([[group(0), binding(0), internal(disable_validation__entry_point_parameter), internal(disable_validation__ignore_storage_class)]] tint_symbol : ptr<storage, tint_symbol_1>) {
@@ -275,7 +275,7 @@
   auto* expect = R"(
 struct tint_symbol_1 {
   arr : array<f32>;
-};
+}
 
 type myarray = array<f32>;
 
@@ -308,11 +308,11 @@
   auto* expect = R"(
 struct S {
   f : f32;
-};
+}
 
 struct tint_symbol_1 {
   arr : array<S>;
-};
+}
 
 [[stage(compute), workgroup_size(1)]]
 fn main([[group(0), binding(0), internal(disable_validation__entry_point_parameter), internal(disable_validation__ignore_storage_class)]] tint_symbol : ptr<storage, tint_symbol_1>) {
@@ -360,7 +360,7 @@
   auto* expect = R"(
 struct S {
   a : f32;
-};
+}
 
 fn no_uses() {
 }
@@ -479,7 +479,7 @@
   auto* expect = R"(
 struct tint_symbol_2 {
   m : mat2x2<f32>;
-};
+}
 
 [[stage(compute), workgroup_size(1)]]
 fn main([[internal(disable_validation__entry_point_parameter)]] tint_symbol_1 : ptr<workgroup, tint_symbol_2>) {
@@ -512,15 +512,15 @@
   auto* expect = R"(
 struct S1 {
   m : mat2x2<f32>;
-};
+}
 
 struct S2 {
   s : S1;
-};
+}
 
 struct tint_symbol_2 {
   m : array<S2, 4u>;
-};
+}
 
 [[stage(compute), workgroup_size(1)]]
 fn main([[internal(disable_validation__entry_point_parameter)]] tint_symbol_1 : ptr<workgroup, tint_symbol_2>) {
@@ -556,12 +556,12 @@
   auto* expect = R"(
 struct S {
   m : mat2x2<f32>;
-};
+}
 
 struct tint_symbol_3 {
   a : S;
   b : S;
-};
+}
 
 [[stage(compute), workgroup_size(1)]]
 fn main([[internal(disable_validation__entry_point_parameter)]] tint_symbol_1 : ptr<workgroup, tint_symbol_3>) {
@@ -602,7 +602,7 @@
   auto* expect = R"(
 struct S {
   a : f32;
-};
+}
 
 [[stage(compute), workgroup_size(1)]]
 fn main() {
diff --git a/src/transform/multiplanar_external_texture_test.cc b/src/transform/multiplanar_external_texture_test.cc
index 631d76b..e4c1d55 100644
--- a/src/transform/multiplanar_external_texture_test.cc
+++ b/src/transform/multiplanar_external_texture_test.cc
@@ -84,7 +84,7 @@
   ug : f32;
   vg : f32;
   ub : f32;
-};
+}
 
 [[group(0), binding(1)]] var ext_tex_plane_1 : texture_2d<f32>;
 
@@ -128,7 +128,7 @@
   ug : f32;
   vg : f32;
   ub : f32;
-};
+}
 
 [[group(0), binding(2)]] var ext_tex_plane_1 : texture_2d<f32>;
 
@@ -181,7 +181,7 @@
   ug : f32;
   vg : f32;
   ub : f32;
-};
+}
 
 [[group(0), binding(1)]] var ext_tex_plane_1 : texture_2d<f32>;
 
@@ -238,7 +238,7 @@
   ug : f32;
   vg : f32;
   ub : f32;
-};
+}
 
 [[group(0), binding(2)]] var ext_tex_plane_1 : texture_2d<f32>;
 
@@ -311,7 +311,7 @@
   ug : f32;
   vg : f32;
   ub : f32;
-};
+}
 
 [[group(0), binding(4)]] var ext_tex_plane_1 : texture_2d<f32>;
 
@@ -393,7 +393,7 @@
   ug : f32;
   vg : f32;
   ub : f32;
-};
+}
 
 fn textureSampleExternal(plane0 : texture_2d<f32>, plane1 : texture_2d<f32>, smp : sampler, coord : vec2<f32>, params : ExternalTextureParams) -> vec4<f32> {
   if ((params.numPlanes == 1u)) {
@@ -459,7 +459,7 @@
   ug : f32;
   vg : f32;
   ub : f32;
-};
+}
 
 fn textureSampleExternal(plane0 : texture_2d<f32>, plane1 : texture_2d<f32>, smp : sampler, coord : vec2<f32>, params : ExternalTextureParams) -> vec4<f32> {
   if ((params.numPlanes == 1u)) {
@@ -527,7 +527,7 @@
   ug : f32;
   vg : f32;
   ub : f32;
-};
+}
 
 fn textureSampleExternal(plane0 : texture_2d<f32>, plane1 : texture_2d<f32>, smp : sampler, coord : vec2<f32>, params : ExternalTextureParams) -> vec4<f32> {
   if ((params.numPlanes == 1u)) {
@@ -605,7 +605,7 @@
   ug : f32;
   vg : f32;
   ub : f32;
-};
+}
 
 fn textureSampleExternal(plane0 : texture_2d<f32>, plane1 : texture_2d<f32>, smp : sampler, coord : vec2<f32>, params : ExternalTextureParams) -> vec4<f32> {
   if ((params.numPlanes == 1u)) {
diff --git a/src/transform/num_workgroups_from_uniform_test.cc b/src/transform/num_workgroups_from_uniform_test.cc
index 9d1b81d..ecb221a 100644
--- a/src/transform/num_workgroups_from_uniform_test.cc
+++ b/src/transform/num_workgroups_from_uniform_test.cc
@@ -68,7 +68,7 @@
   auto* expect = R"(
 struct tint_symbol_2 {
   num_workgroups : vec3<u32>;
-};
+}
 
 [[group(0), binding(30)]] var<uniform> tint_symbol_3 : tint_symbol_2;
 
@@ -110,13 +110,13 @@
   auto* expect = R"(
 struct tint_symbol_2 {
   num_workgroups : vec3<u32>;
-};
+}
 
 [[group(0), binding(30)]] var<uniform> tint_symbol_3 : tint_symbol_2;
 
 struct Builtins {
   num_wgs : vec3<u32>;
-};
+}
 
 fn main_inner(in : Builtins) {
   let groups_x = in.num_wgs.x;
@@ -158,7 +158,7 @@
   auto* expect = R"(
 struct tint_symbol_2 {
   num_workgroups : vec3<u32>;
-};
+}
 
 [[group(0), binding(30)]] var<uniform> tint_symbol_3 : tint_symbol_2;
 
@@ -166,14 +166,14 @@
   gid : vec3<u32>;
   num_wgs : vec3<u32>;
   wgid : vec3<u32>;
-};
+}
 
 struct tint_symbol_1 {
   [[builtin(global_invocation_id)]]
   gid : vec3<u32>;
   [[builtin(workgroup_id)]]
   wgid : vec3<u32>;
-};
+}
 
 fn main_inner(in : Builtins) {
   let groups_x = in.num_wgs.x;
@@ -233,19 +233,19 @@
   auto* expect = R"(
 struct tint_symbol_6 {
   num_workgroups : vec3<u32>;
-};
+}
 
 [[group(0), binding(30)]] var<uniform> tint_symbol_7 : tint_symbol_6;
 
 struct Builtins1 {
   num_wgs : vec3<u32>;
-};
+}
 
 struct Builtins2 {
   gid : vec3<u32>;
   num_wgs : vec3<u32>;
   wgid : vec3<u32>;
-};
+}
 
 fn main1_inner(in : Builtins1) {
   let groups_x = in.num_wgs.x;
@@ -263,7 +263,7 @@
   gid : vec3<u32>;
   [[builtin(workgroup_id)]]
   wgid : vec3<u32>;
-};
+}
 
 fn main2_inner(in : Builtins2) {
   let groups_x = in.num_wgs.x;
@@ -313,14 +313,14 @@
 struct Builtins {
   gid : vec3<u32>;
   wgid : vec3<u32>;
-};
+}
 
 struct tint_symbol_1 {
   [[builtin(global_invocation_id)]]
   gid : vec3<u32>;
   [[builtin(workgroup_id)]]
   wgid : vec3<u32>;
-};
+}
 
 fn main_inner(in : Builtins) {
 }
diff --git a/src/transform/pad_array_elements_test.cc b/src/transform/pad_array_elements_test.cc
index 7483f3f..05ca2da 100644
--- a/src/transform/pad_array_elements_test.cc
+++ b/src/transform/pad_array_elements_test.cc
@@ -52,7 +52,7 @@
 struct tint_padded_array_element {
   [[size(8)]]
   el : i32;
-};
+}
 
 var<private> arr : array<tint_padded_array_element, 4u>;
 )";
@@ -72,11 +72,11 @@
 struct tint_padded_array_element {
   [[size(8)]]
   el : i32;
-};
+}
 
 struct S {
   rta : array<tint_padded_array_element>;
-};
+}
 )";
 
   auto got = Run<PadArrayElements>(src);
@@ -97,7 +97,7 @@
 struct tint_padded_array_element {
   [[size(16)]]
   el : i32;
-};
+}
 
 fn f() {
   var arr : array<tint_padded_array_element, 4u>;
@@ -122,7 +122,7 @@
 struct tint_padded_array_element {
   [[size(12)]]
   el : i32;
-};
+}
 
 fn f(a : array<tint_padded_array_element, 4u>) -> i32 {
   return a[2].el;
@@ -175,7 +175,7 @@
 struct tint_padded_array_element {
   [[size(16)]]
   el : i32;
-};
+}
 
 type Array = array<tint_padded_array_element, 4u>;
 
@@ -207,24 +207,24 @@
 struct tint_padded_array_element {
   [[size(8)]]
   el : i32;
-};
+}
 
 struct tint_padded_array_element_1 {
   [[size(8)]]
   el : i32;
-};
+}
 
 struct tint_padded_array_element_2 {
   [[size(12)]]
   el : i32;
-};
+}
 
 struct S {
   a : array<tint_padded_array_element, 4u>;
   b : array<tint_padded_array_element_1, 8u>;
   c : array<tint_padded_array_element, 4u>;
   d : array<tint_padded_array_element_2, 8u>;
-};
+}
 )";
 
   auto got = Run<PadArrayElements>(src);
@@ -244,38 +244,38 @@
 struct tint_padded_array_element {
   [[size(512)]]
   el : i32;
-};
+}
 
 struct tint_padded_array_element_2 {
   [[size(32)]]
   el : i32;
-};
+}
 
 struct tint_padded_array_element_1 {
   [[size(512)]]
   el : array<tint_padded_array_element_2, 4u>;
-};
+}
 
 struct tint_padded_array_element_5 {
   [[size(8)]]
   el : i32;
-};
+}
 
 struct tint_padded_array_element_4 {
   [[size(64)]]
   el : array<tint_padded_array_element_5, 4u>;
-};
+}
 
 struct tint_padded_array_element_3 {
   [[size(512)]]
   el : array<tint_padded_array_element_4, 4u>;
-};
+}
 
 struct S {
   a : array<tint_padded_array_element, 4u>;
   b : array<tint_padded_array_element_1, 4u>;
   c : array<tint_padded_array_element_3, 4u>;
-};
+}
 )";
 
   auto got = Run<PadArrayElements>(src);
@@ -299,38 +299,38 @@
 struct tint_padded_array_element {
   [[size(512)]]
   el : i32;
-};
+}
 
 struct tint_padded_array_element_2 {
   [[size(32)]]
   el : i32;
-};
+}
 
 struct tint_padded_array_element_1 {
   [[size(512)]]
   el : array<tint_padded_array_element_2, 4u>;
-};
+}
 
 struct tint_padded_array_element_5 {
   [[size(8)]]
   el : i32;
-};
+}
 
 struct tint_padded_array_element_4 {
   [[size(64)]]
   el : array<tint_padded_array_element_5, 4u>;
-};
+}
 
 struct tint_padded_array_element_3 {
   [[size(512)]]
   el : array<tint_padded_array_element_4, 4u>;
-};
+}
 
 struct S {
   a : array<tint_padded_array_element, 4u>;
   b : array<tint_padded_array_element_1, 4u>;
   c : array<tint_padded_array_element_3, 4u>;
-};
+}
 
 fn f(s : S) -> i32 {
   return ((s.a[2].el + s.b[1].el[2].el) + s.c[3].el[1].el[2].el);
@@ -365,7 +365,7 @@
 struct tint_padded_array_element {
   [[size(8)]]
   el : i32;
-};
+}
 
 type T1 = array<tint_padded_array_element, 1u>;
 
@@ -374,7 +374,7 @@
 struct tint_padded_array_element_1 {
   [[size(8)]]
   el : i32;
-};
+}
 
 fn f1(a : array<tint_padded_array_element_1, 2u>) {
 }
@@ -384,7 +384,7 @@
 struct tint_padded_array_element_2 {
   [[size(8)]]
   el : i32;
-};
+}
 
 fn f2() {
   var v : array<tint_padded_array_element_2, 3u>;
diff --git a/src/transform/promote_initializers_to_const_var_test.cc b/src/transform/promote_initializers_to_const_var_test.cc
index b32d153..8e2dc25 100644
--- a/src/transform/promote_initializers_to_const_var_test.cc
+++ b/src/transform/promote_initializers_to_const_var_test.cc
@@ -67,7 +67,7 @@
   a : i32;
   b : f32;
   c : vec3<f32>;
-};
+}
 
 fn f() {
   let tint_symbol = S(1, 2.0, vec3<f32>());
@@ -126,7 +126,7 @@
   a : i32;
   b : f32;
   c : vec3<f32>;
-};
+}
 
 fn f() {
   var insert_after = 1;
@@ -288,17 +288,17 @@
   auto* expect = R"(
 struct S1 {
   a : i32;
-};
+}
 
 struct S2 {
   a : i32;
   b : S1;
   c : i32;
-};
+}
 
 struct S3 {
   a : S2;
-};
+}
 
 fn f() {
   let tint_symbol = S1(2);
@@ -331,11 +331,11 @@
   auto* expect = R"(
 struct S1 {
   a : i32;
-};
+}
 
 struct S2 {
   a : array<S1, 3u>;
-};
+}
 
 fn f() {
   let tint_symbol = S1(1);
@@ -358,7 +358,7 @@
   a : i32;
   b : f32;
   c : i32;
-};
+}
 
 fn f() {
   var local_arr = array<f32, 4u>(0.0, 1.0, 2.0, 3.0);
diff --git a/src/transform/remove_phonies_test.cc b/src/transform/remove_phonies_test.cc
index 837e34c..6d6c86d 100644
--- a/src/transform/remove_phonies_test.cc
+++ b/src/transform/remove_phonies_test.cc
@@ -204,7 +204,7 @@
   auto* expect = R"(
 struct S {
   arr : array<i32>;
-};
+}
 
 [[group(0), binding(0)]] var<storage, read_write> s : S;
 
diff --git a/src/transform/robustness_test.cc b/src/transform/robustness_test.cc
index 4c0025e..a471381 100644
--- a/src/transform/robustness_test.cc
+++ b/src/transform/robustness_test.cc
@@ -630,7 +630,7 @@
 struct S {
   a : f32;
   b : array<f32>;
-};
+}
 
 [[group(0), binding(0)]] var<storage, read> s : S;
 
@@ -794,7 +794,7 @@
 struct S {
   a : f32;
   b : array<f32>;
-};
+}
 
 [[group(0), binding(0)]] var<storage, read> s : S;
 
@@ -874,7 +874,7 @@
 struct S {
   a : array<f32, 4>;
   b : array<f32>;
-};
+}
 
 [[group(0), binding(0)]] var<storage, read> s : S;
 
@@ -882,7 +882,7 @@
 
 struct U {
   a : UArr;
-};
+}
 
 [[group(1), binding(0)]] var<uniform> u : U;
 
@@ -937,7 +937,7 @@
 struct S {
   a : array<f32, 4>;
   b : array<f32>;
-};
+}
 
 [[group(0), binding(0)]] var<storage, read> s : S;
 
@@ -945,7 +945,7 @@
 
 struct U {
   a : UArr;
-};
+}
 
 [[group(1), binding(0)]] var<uniform> u : U;
 
@@ -1002,7 +1002,7 @@
 struct S {
   a : array<f32, 4>;
   b : array<f32>;
-};
+}
 
 [[group(0), binding(0)]] var<storage, read> s : S;
 
@@ -1010,7 +1010,7 @@
 
 struct U {
   a : UArr;
-};
+}
 
 [[group(1), binding(0)]] var<uniform> u : U;
 
@@ -1067,7 +1067,7 @@
 struct S {
   a : array<f32, 4>;
   b : array<f32>;
-};
+}
 
 [[group(0), binding(0)]] var<storage, read> s : S;
 
@@ -1075,7 +1075,7 @@
 
 struct U {
   a : UArr;
-};
+}
 
 [[group(1), binding(0)]] var<uniform> u : U;
 
diff --git a/src/transform/simplify_pointers_test.cc b/src/transform/simplify_pointers_test.cc
index 0fdf806..6b55d32 100644
--- a/src/transform/simplify_pointers_test.cc
+++ b/src/transform/simplify_pointers_test.cc
@@ -168,7 +168,7 @@
   auto* expect = R"(
 struct S {
   i : i32;
-};
+}
 
 fn arr() {
   var a : array<S, 2>;
@@ -325,11 +325,11 @@
 
 struct Inner {
   a : array<i32, 2>;
-};
+}
 
 struct Outer {
   a : array<Inner, 2>;
-};
+}
 
 fn f() {
   var arr : array<Outer, 2>;
diff --git a/src/transform/unshadow_test.cc b/src/transform/unshadow_test.cc
index 2a4cbed..ddba826 100644
--- a/src/transform/unshadow_test.cc
+++ b/src/transform/unshadow_test.cc
@@ -102,7 +102,7 @@
   auto* expect = R"(
 struct a {
   m : i32;
-};
+}
 
 fn X() {
   var a_1 = true;
diff --git a/src/transform/vertex_pulling_test.cc b/src/transform/vertex_pulling_test.cc
index b43d4a4..10b8ee8 100644
--- a/src/transform/vertex_pulling_test.cc
+++ b/src/transform/vertex_pulling_test.cc
@@ -109,7 +109,7 @@
   auto* expect = R"(
 struct TintVertexData {
   tint_vertex_data : [[stride(4)]] array<u32>;
-};
+}
 
 [[stage(vertex)]]
 fn main() -> [[builtin(position)]] vec4<f32> {
@@ -138,7 +138,7 @@
   auto* expect = R"(
 struct TintVertexData {
   tint_vertex_data : [[stride(4)]] array<u32>;
-};
+}
 
 [[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
@@ -176,7 +176,7 @@
   auto* expect = R"(
 struct TintVertexData {
   tint_vertex_data : [[stride(4)]] array<u32>;
-};
+}
 
 [[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
@@ -214,7 +214,7 @@
   auto* expect = R"(
 struct TintVertexData {
   tint_vertex_data : [[stride(4)]] array<u32>;
-};
+}
 
 [[binding(0), group(5)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
@@ -257,14 +257,14 @@
   auto* expect = R"(
 struct TintVertexData {
   tint_vertex_data : [[stride(4)]] array<u32>;
-};
+}
 
 [[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
 struct Inputs {
   [[location(0)]]
   var_a : f32;
-};
+}
 
 [[stage(vertex)]]
 fn main([[builtin(vertex_index)]] tint_pulling_vertex_index : u32) -> [[builtin(position)]] vec4<f32> {
@@ -305,7 +305,7 @@
   auto* expect = R"(
 struct TintVertexData {
   tint_vertex_data : [[stride(4)]] array<u32>;
-};
+}
 
 [[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
@@ -365,7 +365,7 @@
   auto* expect = R"(
 struct TintVertexData {
   tint_vertex_data : [[stride(4)]] array<u32>;
-};
+}
 
 [[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
@@ -376,7 +376,7 @@
   custom_vertex_index : u32;
   [[builtin(instance_index)]]
   custom_instance_index : u32;
-};
+}
 
 struct Inputs {
   [[location(0)]]
@@ -387,7 +387,7 @@
   custom_vertex_index : u32;
   [[builtin(instance_index)]]
   custom_instance_index : u32;
-};
+}
 
 [[stage(vertex)]]
 fn main(tint_symbol_1 : tint_symbol) -> [[builtin(position)]] vec4<f32> {
@@ -447,7 +447,7 @@
   auto* expect = R"(
 struct TintVertexData {
   tint_vertex_data : [[stride(4)]] array<u32>;
-};
+}
 
 [[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
@@ -458,14 +458,14 @@
   var_a : f32;
   [[location(1)]]
   var_b : f32;
-};
+}
 
 struct Indices {
   [[builtin(vertex_index)]]
   custom_vertex_index : u32;
   [[builtin(instance_index)]]
   custom_instance_index : u32;
-};
+}
 
 [[stage(vertex)]]
 fn main(indices : Indices) -> [[builtin(position)]] vec4<f32> {
@@ -514,7 +514,7 @@
   auto* expect = R"(
 struct TintVertexData {
   tint_vertex_data : [[stride(4)]] array<u32>;
-};
+}
 
 [[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
@@ -559,7 +559,7 @@
   auto* expect = R"(
 struct TintVertexData {
   tint_vertex_data : [[stride(4)]] array<u32>;
-};
+}
 
 [[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
@@ -615,7 +615,7 @@
   auto* expect = R"(
 struct TintVertexData {
   tint_vertex_data_1 : [[stride(4)]] array<u32>;
-};
+}
 
 [[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0_1 : TintVertexData;
 
@@ -692,7 +692,7 @@
   auto* expect = R"(
 struct TintVertexData {
   tint_vertex_data : [[stride(4)]] array<u32>;
-};
+}
 
 [[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
@@ -852,7 +852,7 @@
       R"(
 struct TintVertexData {
   tint_vertex_data : [[stride(4)]] array<u32>;
-};
+}
 
 [[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
@@ -1011,7 +1011,7 @@
   auto* expect = R"(
 struct TintVertexData {
   tint_vertex_data : [[stride(4)]] array<u32>;
-};
+}
 
 [[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
diff --git a/src/transform/wrap_arrays_in_structs_test.cc b/src/transform/wrap_arrays_in_structs_test.cc
index a93f995..21aa7c84c 100644
--- a/src/transform/wrap_arrays_in_structs_test.cc
+++ b/src/transform/wrap_arrays_in_structs_test.cc
@@ -41,7 +41,7 @@
   auto* expect = R"(
 struct tint_array_wrapper {
   arr : array<i32, 4u>;
-};
+}
 
 var<private> arr : tint_array_wrapper;
 )";
@@ -61,7 +61,7 @@
   auto* expect = R"(
 struct tint_array_wrapper {
   arr : array<i32, 4u>;
-};
+}
 
 fn f() {
   var arr : tint_array_wrapper;
@@ -83,7 +83,7 @@
   auto* expect = R"(
 struct tint_array_wrapper {
   arr : array<i32, 4u>;
-};
+}
 
 fn f(a : tint_array_wrapper) -> i32 {
   return a.arr[2];
@@ -104,7 +104,7 @@
   auto* expect = R"(
 struct tint_array_wrapper {
   arr : array<i32, 4u>;
-};
+}
 
 fn f() -> tint_array_wrapper {
   return tint_array_wrapper(array<i32, 4u>(1, 2, 3, 4));
@@ -133,13 +133,13 @@
   auto* expect = R"(
 struct tint_array_wrapper {
   arr : array<i32, 2u>;
-};
+}
 
 type Inner = tint_array_wrapper;
 
 struct tint_array_wrapper_1 {
   arr : array<tint_array_wrapper, 2u>;
-};
+}
 
 type Array = tint_array_wrapper_1;
 
@@ -169,17 +169,17 @@
   auto* expect = R"(
 struct tint_array_wrapper {
   arr : array<i32, 4u>;
-};
+}
 
 struct tint_array_wrapper_1 {
   arr : array<i32, 8u>;
-};
+}
 
 struct S {
   a : tint_array_wrapper;
   b : tint_array_wrapper_1;
   c : tint_array_wrapper;
-};
+}
 )";
 
   auto got = Run<WrapArraysInStructs>(src);
@@ -198,21 +198,21 @@
   auto* expect = R"(
 struct tint_array_wrapper {
   arr : array<i32, 4u>;
-};
+}
 
 struct tint_array_wrapper_1 {
   arr : array<tint_array_wrapper, 4u>;
-};
+}
 
 struct tint_array_wrapper_2 {
   arr : array<tint_array_wrapper_1, 4u>;
-};
+}
 
 struct S {
   a : tint_array_wrapper;
   b : tint_array_wrapper_1;
   c : tint_array_wrapper_2;
-};
+}
 )";
 
   auto got = Run<WrapArraysInStructs>(src);
@@ -235,21 +235,21 @@
   auto* expect = R"(
 struct tint_array_wrapper {
   arr : array<i32, 4u>;
-};
+}
 
 struct tint_array_wrapper_1 {
   arr : array<tint_array_wrapper, 4u>;
-};
+}
 
 struct tint_array_wrapper_2 {
   arr : array<tint_array_wrapper_1, 4u>;
-};
+}
 
 struct S {
   a : tint_array_wrapper;
   b : tint_array_wrapper_1;
   c : tint_array_wrapper_2;
-};
+}
 
 fn f(s : S) -> i32 {
   return ((s.a.arr[2] + s.b.arr[1].arr[2]) + s.c.arr[3].arr[1].arr[2]);
@@ -283,7 +283,7 @@
 
 struct tint_array_wrapper {
   arr : array<i32, 1u>;
-};
+}
 
 type T1 = tint_array_wrapper;
 
@@ -291,7 +291,7 @@
 
 struct tint_array_wrapper_1 {
   arr : array<i32, 2u>;
-};
+}
 
 fn f1(a : tint_array_wrapper_1) {
 }
@@ -300,7 +300,7 @@
 
 struct tint_array_wrapper_2 {
   arr : array<i32, 3u>;
-};
+}
 
 fn f2() {
   var v : tint_array_wrapper_2;
diff --git a/src/transform/zero_init_workgroup_memory_test.cc b/src/transform/zero_init_workgroup_memory_test.cc
index f76e3a7..166036e 100644
--- a/src/transform/zero_init_workgroup_memory_test.cc
+++ b/src/transform/zero_init_workgroup_memory_test.cc
@@ -118,7 +118,7 @@
 struct Params {
   [[builtin(local_invocation_index)]]
   local_idx : u32;
-};
+}
 
 [[stage(compute), workgroup_size(1)]]
 fn f(params : Params) {
@@ -187,7 +187,7 @@
 struct S {
   x : i32;
   y : array<i32, 8>;
-};
+}
 
 var<workgroup> a : i32;
 
@@ -251,7 +251,7 @@
 struct S {
   x : i32;
   y : array<i32, 8>;
-};
+}
 
 var<workgroup> a : i32;
 
@@ -318,7 +318,7 @@
 struct S {
   x : i32;
   y : array<i32, 8>;
-};
+}
 
 var<workgroup> a : i32;
 
@@ -389,7 +389,7 @@
   x : array<array<i32, 8>, 10>;
   y : array<i32, 8>;
   z : array<array<array<i32, 8>, 10>, 20>;
-};
+}
 
 var<workgroup> a : i32;
 
@@ -473,7 +473,7 @@
 struct S {
   x : i32;
   y : array<i32, 8>;
-};
+}
 
 var<workgroup> a : i32;
 
@@ -546,7 +546,7 @@
 struct S {
   x : i32;
   y : array<i32, 8>;
-};
+}
 
 var<workgroup> a : i32;
 
@@ -711,7 +711,7 @@
   b : f32;
   u : atomic<u32>;
   c : u32;
-};
+}
 
 var<workgroup> w : S;
 
@@ -786,7 +786,7 @@
   b : f32;
   u : atomic<u32>;
   c : u32;
-};
+}
 
 var<workgroup> w : array<S, 4>;