wgsl: Replace [[decoration]] with @decoration

Deprecate the old syntax. Migrate everything to the new syntax.

Bug: tint:1382
Change-Id: Ide12b2e927b17dc93b9714c7049090864cc568d3
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/77260
Reviewed-by: James Price <jrprice@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: David Neto <dneto@google.com>
Commit-Queue: David Neto <dneto@google.com>
diff --git a/docs/origin-trial-changes.md b/docs/origin-trial-changes.md
index a4acf8c..bc03ac6 100644
--- a/docs/origin-trial-changes.md
+++ b/docs/origin-trial-changes.md
@@ -11,7 +11,8 @@
 The following features have been deprecated and will be removed in M102:
 
 * The `[[block]]` attribute has been deprecated. [tint:1324](https://crbug.com/tint/1324)
-* `elseif` has been replaced with `else if` [tint:1289](https://crbug.com/tint/1289)
+* Attributes now use the `@decoration` syntax instead of the `[[decoration]]` syntax. [tint:1382](https://crbug.com/tint/1382)
+* `elseif` has been replaced with `else if`. [tint:1289](https://crbug.com/tint/1289)
 
 ### New Features
 
diff --git a/docs/spirv-input-output-variables.md b/docs/spirv-input-output-variables.md
index d4b2553..0f149e0 100644
--- a/docs/spirv-input-output-variables.md
+++ b/docs/spirv-input-output-variables.md
@@ -85,8 +85,8 @@
 Current translation, through SPIR-V, SPIR-V reader, WGSL writer:
 
 ```groovy
-    [[location(0)]] var<out> frag_colour : vec4<f32>;
-    [[location(0)]] var<in> the_colour : vec4<f32>;
+    @location(0) var<out> frag_colour : vec4<f32>;
+    @location(0) var<in> the_colour : vec4<f32>;
 
     fn bar_() -> void {
       const x_14 : vec4<f32> = the_colour;
@@ -94,7 +94,7 @@
       return;
     }
 
-    [[stage(fragment)]]
+    @stage(fragment)
     fn main() -> void {
       bar_();
       return;
@@ -123,14 +123,14 @@
 
     // Declare a structure type to collect the return values.
     struct main_result_type {
-      [[location(0)]] frag_color : vec4<f32>;
+      @location(0) frag_color : vec4<f32>;
     };
 
-    [[stage(fragment)]]
+    @stage(fragment)
     fn main(
 
       // 'in' variables are entry point parameters
-      [[location(0)]] the_color_arg : vec4<f32>
+      @location(0) the_color_arg : vec4<f32>
 
     ) -> main_result_type {
 
diff --git a/docs/translations.md b/docs/translations.md
index d7b2713..b22ed20 100644
--- a/docs/translations.md
+++ b/docs/translations.md
@@ -188,4 +188,4 @@
 ```
 
 ## MSL
-`[[function_constant(<id>)]]`
+`@function_constant(<id>)`
diff --git a/fuzzers/tint_ast_fuzzer/mutations/replace_identifier_test.cc b/fuzzers/tint_ast_fuzzer/mutations/replace_identifier_test.cc
index afc4ced..707b15a 100644
--- a/fuzzers/tint_ast_fuzzer/mutations/replace_identifier_test.cc
+++ b/fuzzers/tint_ast_fuzzer/mutations/replace_identifier_test.cc
@@ -287,13 +287,12 @@
   // Can't replace `a` with `b` since the latter has a wrong access mode
   // (`read` for uniform storage class).
   std::string shader = R"(
-[[block]]
 struct S {
   a: i32;
 };
 
 var<private> a: S;
-[[group(1), binding(1)]] var<uniform> b: S;
+@group(1) @binding(1) var<uniform> b: S;
 fn f() {
   *&a = S(4);
 }
@@ -323,13 +322,12 @@
 TEST(ReplaceIdentifierTest, NotApplicable6) {
   // Can't replace `ptr_b` with `a` since the latter is not a pointer.
   std::string shader = R"(
-[[block]]
 struct S {
   a: i32;
 };
 
 var<private> a: S;
-[[group(1), binding(1)]] var<uniform> b: S;
+@group(1) @binding(1) var<uniform> b: S;
 fn f() {
   let ptr_b = &b;
   *&a = *ptr_b;
@@ -360,14 +358,13 @@
   // Can't replace `ptr_b` with `c` since the latter has a wrong access mode and
   // storage class.
   std::string shader = R"(
-[[block]]
 struct S {
   a: i32;
 };
 
 var<private> a: S;
-[[group(1), binding(1)]] var<uniform> b: S;
-[[group(1), binding(2)]] var<storage, write> c: S;
+@group(1) @binding(1) var<uniform> b: S;
+@group(1) @binding(2) var<storage, write> c: S;
 fn f() {
   let ptr_b = &b;
   *&a = *ptr_b;
@@ -397,14 +394,13 @@
 TEST(ReplaceIdentifierTest, NotApplicable9) {
   // Can't replace `b` with `e` since the latter is not a reference.
   std::string shader = R"(
-[[block]]
 struct S {
   a: i32;
 };
 
 var<private> a: S;
 let e = 3;
-[[group(1), binding(1)]] var<uniform> b: S;
+@group(1) @binding(1) var<uniform> b: S;
 fn f() {
   *&a = *&b;
 }
@@ -434,14 +430,13 @@
 TEST(ReplaceIdentifierTest, NotApplicable10) {
   // Can't replace `b` with `e` since the latter has a wrong access mode.
   std::string shader = R"(
-[[block]]
 struct S {
   a: i32;
 };
 
 var<private> a: S;
-[[group(0), binding(0)]] var<storage, write> e: S;
-[[group(1), binding(1)]] var<uniform> b: S;
+@group(0) @binding(0) var<storage, write> e: S;
+@group(1) @binding(1) var<uniform> b: S;
 fn f() {
   *&a = *&b;
 }
diff --git a/fuzzers/tint_regex_fuzzer/regex_fuzzer_tests.cc b/fuzzers/tint_regex_fuzzer/regex_fuzzer_tests.cc
index bd56e0f..e5f175b 100644
--- a/fuzzers/tint_regex_fuzzer/regex_fuzzer_tests.cc
+++ b/fuzzers/tint_regex_fuzzer/regex_fuzzer_tests.cc
@@ -198,16 +198,16 @@
       R"(fn clamp_0acf8f() {
         var res: vec2<f32> = clamp(vec2<f32>(), vec2<f32>(), vec2<f32>());
       }
-      [[stage(vertex)]]
-      fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+      @stage(vertex)
+      fn vertex_main() -> @builtin(position) vec4<f32> {
          clamp_0acf8f();"
          return vec4<f32>();
       }
-      [[stage(fragment)]]
+      @stage(fragment)
       fn fragment_main() {
         clamp_0acf8f();
       }
-      [[stage(compute), workgroup_size(1)]]
+      @stage(compute) @workgroup_size(1)
       fn compute_main() {"
         var<private> foo: f32 = 0.0;
         clamp_0acf8f();
@@ -219,13 +219,13 @@
   std::vector<std::pair<size_t, size_t>> ground_truth = {
       std::make_pair(3, 12),   std::make_pair(28, 3),  std::make_pair(37, 4),
       std::make_pair(49, 5),   std::make_pair(60, 3),  std::make_pair(68, 4),
-      std::make_pair(81, 4),   std::make_pair(111, 5), std::make_pair(133, 2),
-      std::make_pair(143, 4),  std::make_pair(155, 7), std::make_pair(175, 4),
-      std::make_pair(196, 12), std::make_pair(222, 6), std::make_pair(234, 3),
-      std::make_pair(258, 5),  std::make_pair(282, 2), std::make_pair(294, 4),
-      std::make_pair(311, 12), std::make_pair(343, 5), std::make_pair(359, 14),
-      std::make_pair(385, 2),  std::make_pair(396, 4), std::make_pair(414, 3),
-      std::make_pair(427, 3),  std::make_pair(432, 3), std::make_pair(451, 12)};
+      std::make_pair(81, 4),   std::make_pair(110, 5), std::make_pair(130, 2),
+      std::make_pair(140, 4),  std::make_pair(151, 7), std::make_pair(169, 4),
+      std::make_pair(190, 12), std::make_pair(216, 6), std::make_pair(228, 3),
+      std::make_pair(251, 5),  std::make_pair(273, 2), std::make_pair(285, 4),
+      std::make_pair(302, 12), std::make_pair(333, 5), std::make_pair(349, 14),
+      std::make_pair(373, 2),  std::make_pair(384, 4), std::make_pair(402, 3),
+      std::make_pair(415, 3),  std::make_pair(420, 3), std::make_pair(439, 12)};
 
   ASSERT_EQ(ground_truth, identifiers_pos);
 }
@@ -234,18 +234,18 @@
   std::string wgsl_code =
       R"(fn clamp_0acf8f() {
         var res: vec2<f32> = clamp(vec2<f32>(), vec2<f32>(), vec2<f32>());
-      } 
-      [[stage(vertex)]]
-      fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+      }
+      @stage(vertex)
+      fn vertex_main() -> @builtin(position) vec4<f32> {
         clamp_0acf8f();
         var foo_1: i32 = 3;
         return vec4<f32>();
       }
-      [[stage(fragment)]]
+      @stage(fragment)
       fn fragment_main() {
         clamp_0acf8f();
       }
-      [[stage(compute), workgroup_size(1)]]
+      @stage(compute) @workgroup_size(1)
       fn compute_main() {
         var<private> foo: f32 = 0.0;
         var foo_2: i32 = 10;
@@ -277,17 +277,17 @@
           var res: vec2<f32> = clamp(vec2<f32>(), vec2<f32>(), vec2<f32>());
           }
         }
-        [[stage(vertex)]]
-        fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+        @stage(vertex)
+        fn vertex_main() -> @builtin(position) vec4<f32> {
           clamp_0acf8f();
           var foo_1: i32 = 3;
           return vec4<f32>();
         }
-        [[stage(fragment)]]
+        @stage(fragment)
         fn fragment_main() {
           clamp_0acf8f();
         }
-        [[stage(compute), workgroup_size(1)]]
+        @stage(compute) @workgroup_size(1)
         fn compute_main() {
           var<private> foo: f32 = 0.0;
           var foo_2: i32 = 10;
@@ -323,17 +323,17 @@
         var res: vec2<f32> = clamp(vec2<f32>(), vec2<f32>(), vec2<f32>());
         }
       }
-      [[stage(vertex)]]
-      fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+      @stage(vertex)
+      fn vertex_main() -> @builtin(position) vec4<f32> {
         clamp_0acf8f();
         var foo_1: i32 = 3;
         return vec4<f32>();
       }
-      [[stage(fragment)]]
+      @stage(fragment)
       fn fragment_main() {
         clamp_0acf8f();
       }
-      [[stage(compute), workgroup_size(1)]]
+      @stage(compute) @workgroup_size(1)
       fn compute_main() {
         var<private> foo: f32 = 0.0;
         var foo_2: i32 = 10;
@@ -362,17 +362,17 @@
       R"(fn clamp_0acf8f() {
         var res: vec2<f32> = clamp(vec2<f32>(), vec2<f32>(), vec2<f32>());
       }
-      [[stage(vertex)]]
-      fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+      @stage(vertex)
+      fn vertex_main() -> @builtin(position) vec4<f32> {
         clamp_0acf8f();
         var foo_1: i32 = 3;
         return vec4<f32>();
       }
-      [[stage(fragment)]]
+      @stage(fragment)
       fn fragment_main() {
         clamp_0acf8f();
       }
-      [[stage(compute), workgroup_size(1)]]
+      @stage(compute) @workgroup_size(1)
       fn compute_main() {
         var<private> foo: f32 = 0.0;
         var foo_2: i32 = 10;
@@ -395,17 +395,17 @@
       R"(fn clamp_0acf8f() {
         var res: vec2<f32> = clamp(vec2<f32>(), vec2<f32>(), vec2<f32>());return true;
       }
-      [[stage(vertex)]]
-      fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+      @stage(vertex)
+      fn vertex_main() -> @builtin(position) vec4<f32> {
         clamp_0acf8f();
         var foo_1: i32 = 3;
         return vec4<f32>();
       }
-      [[stage(fragment)]]
+      @stage(fragment)
       fn fragment_main() {
         clamp_0acf8f();
       }
-      [[stage(compute), workgroup_size(1)]]
+      @stage(compute) @workgroup_size(1)
       fn compute_main() {
         var<private> foo: f32 = 0.0;
         var foo_2: i32 = 10;
@@ -422,23 +422,23 @@
       R"(fn clamp_0acf8f() {
           var res: vec2<f32> = clamp(vec2<f32>(), vec2<f32>(), vec2<f32>());
         }
-        [[stage(vertex)]]
-        fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+        @stage(vertex)
+        fn vertex_main() -> @builtin(position) vec4<f32> {
           clamp_0acf8f();
           var foo_1: i32 = 3;
           return vec4<f32>();
         }
-        [[stage(fragment)]]
+        @stage(fragment)
         fn fragment_main() {
           clamp_0acf8f();
         }
-        [[stage(compute), workgroup_size(1)]]
+        @stage(compute) @workgroup_size(1)
         fn compute_main() {
           var<private> foo: f32 = 0.0;
           var foo_2: i32 = 10;
           clamp_0acf8f();
         }
-        fn vert_main() -> [[builtin(position)]] vec4<f32> {
+        fn vert_main() -> @builtin(position) vec4<f32> {
           clamp_0acf8f();
           var foo_1: i32 = 3;
           return vec4<f32>();
@@ -447,7 +447,7 @@
         var foo_3 : i32 = -20;)";
 
   std::vector<size_t> function_positions = GetFunctionBodyPositions(wgsl_code);
-  std::vector<size_t> expected_positions = {193, 622};
+  std::vector<size_t> expected_positions = {187, 607};
   ASSERT_EQ(expected_positions, function_positions);
 }
 
@@ -456,23 +456,23 @@
       R"(fn clamp_0acf8f() {
           var res: vec2<f32> = clamp(vec2<f32>(), vec2<f32>(), vec2<f32>())
         }
-        [[stage(vertex)]]
-        fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+        @stage(vertex)
+        fn vertex_main() -> @builtin(position) vec4<f32> {
           clamp_0acf8f()
           var foo_1: i32 = 3
           return vec4<f32>()
         }
-        [[stage(fragment)]]
+        @stage(fragment)
         fn fragment_main() {
           clamp_0acf8f();
         }
-        [[stage(compute), workgroup_size(1)]]
+        @stage(compute) @workgroup_size(1)
         fn compute_main() {
           var<private> foo: f32 = 0.0;
           var foo_2: i32 = 10;
           clamp_0acf8f();
         }
-        fn vert_main() -> [[builtin(position)]] vec4<f32> {
+        fn vert_main() -> @builtin(position) vec4<f32> {
           clamp_0acf8f()
           var foo_1: i32 = 3
           return vec4<f32>()
@@ -489,23 +489,23 @@
       R"(fn clamp_0acf8f() {
           var res: vec2<f32> = clamp(vec2<f32>(), vec2<f32>(), vec2<f32>())
         }
-        [[stage(vertex)]]
-        fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+        @stage(vertex)
+        fn vertex_main() -> @builtin(position) vec4<f32> {
           clamp_0acf8f()
           var foo_1: i32 = 3
           return vec4<f32>()
         }
-        [[stage(fragment)]]
+        @stage(fragment)
         fn fragment_main() {
           clamp_0acf8f();
         }
-        [[stage(compute), workgroup_size(1)]]
+        @stage(compute) @workgroup_size(1)
         fn compute_main() {
           var<private> foo: f32 = 0.0;
           var foo_2: i32 = 10;
           clamp_0acf8f();
         }
-        fn vert_main() -> [[builtin(position)]] vec4<f32> {
+        fn vert_main() -> @builtin(position) vec4<f32> {
           clamp_0acf8f()
           var foo_1: i32 = 3
           return vec4<f32>()
diff --git a/src/ast/array.cc b/src/ast/array.cc
index e8339f8..a620dd0 100644
--- a/src/ast/array.cc
+++ b/src/ast/array.cc
@@ -54,7 +54,7 @@
   std::ostringstream out;
   for (auto* deco : decorations) {
     if (auto* stride = deco->As<ast::StrideDecoration>()) {
-      out << "[[stride(" << stride->stride << ")]] ";
+      out << "@stride(" << stride->stride << ") ";
     }
   }
   out << "array<" << type->FriendlyName(symbols);
diff --git a/src/ast/array_test.cc b/src/ast/array_test.cc
index 3ada2c7..5a7f02c 100644
--- a/src/ast/array_test.cc
+++ b/src/ast/array_test.cc
@@ -63,7 +63,7 @@
   auto* i32 = create<I32>();
   auto* arr =
       create<Array>(i32, Expr(5), DecorationList{create<StrideDecoration>(32)});
-  EXPECT_EQ(arr->FriendlyName(Symbols()), "[[stride(32)]] array<i32, 5>");
+  EXPECT_EQ(arr->FriendlyName(Symbols()), "@stride(32) array<i32, 5>");
 }
 
 }  // namespace
diff --git a/src/ast/disable_validation_decoration.h b/src/ast/disable_validation_decoration.h
index 099a669..5eea9bf 100644
--- a/src/ast/disable_validation_decoration.h
+++ b/src/ast/disable_validation_decoration.h
@@ -65,7 +65,7 @@
   ~DisableValidationDecoration() override;
 
   /// @return a short description of the internal decoration which will be
-  /// displayed in WGSL as `[[internal(<name>)]]` (but is not parsable).
+  /// displayed in WGSL as `@internal(<name>)` (but is not parsable).
   std::string InternalName() const override;
 
   /// Performs a deep clone of this object using the CloneContext `ctx`.
diff --git a/src/ast/internal_decoration.h b/src/ast/internal_decoration.h
index eb0b814..50f920c 100644
--- a/src/ast/internal_decoration.h
+++ b/src/ast/internal_decoration.h
@@ -35,7 +35,7 @@
   ~InternalDecoration() override;
 
   /// @return a short description of the internal decoration which will be
-  /// displayed in WGSL as `[[internal(<name>)]]` (but is not parsable).
+  /// displayed in WGSL as `@internal(<name>)` (but is not parsable).
   virtual std::string InternalName() const = 0;
 
   /// @returns the WGSL name for the decoration
diff --git a/src/ast/module_clone_test.cc b/src/ast/module_clone_test.cc
index b2415dc..29e9891 100644
--- a/src/ast/module_clone_test.cc
+++ b/src/ast/module_clone_test.cc
@@ -28,13 +28,13 @@
   // See also fuzzers/tint_ast_clone_fuzzer.cc for further coverage of cloning.
   Source::File file("test.wgsl", R"([[block]]
 struct S0 {
-  [[size(4)]]
+  @size(4)
   m0 : u32;
   m1 : array<u32>;
 };
 
 [[block]] struct S1 {
-  [[size(4)]]
+  @size(4)
   m0 : u32;
   m1 : array<u32, 6>;
 };
@@ -42,21 +42,21 @@
 let c0 : i32 = 10;
 let c1 : bool = true;
 
-type t0 = [[stride(16)]] array<vec4<f32>>;
+type t0 = @stride(16) array<vec4<f32>>;
 type t1 = array<vec4<f32>>;
 
 var<private> g0 : u32 = 20u;
 var<private> g1 : f32 = 123.0;
-[[group(0), binding(0)]] var g2 : texture_2d<f32>;
-[[group(1), binding(0)]] var g3 : texture_depth_2d;
-[[group(2), binding(0)]] var g4 : texture_storage_2d<rg32float, write>;
-[[group(3), binding(0)]] var g5 : texture_depth_cube_array;
-[[group(4), binding(0)]] var g6 : texture_external;
+@group(0) @binding(0) var g2 : texture_2d<f32>;
+@group(1) @binding(0) var g3 : texture_depth_2d;
+@group(2) @binding(0) var g4 : texture_storage_2d<rg32float, write>;
+@group(3) @binding(0) var g5 : texture_depth_cube_array;
+@group(4) @binding(0) var g6 : texture_external;
 
 var<private> g7 : vec3<f32>;
-[[group(0), binding(1)]] var<storage, write> g8 : S0;
-[[group(1), binding(1)]] var<storage, read> g9 : S0;
-[[group(2), binding(1)]] var<storage, read_write> g10 : S0;
+@group(0) @binding(1) var<storage, write> g8 : S0;
+@group(1) @binding(1) var<storage, read> g9 : S0;
+@group(2) @binding(1) var<storage, read_write> g10 : S0;
 
 fn f0(p0 : bool) -> f32 {
   if (p0) {
@@ -101,7 +101,7 @@
   return 1.0;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   f1(1.0, 2);
 }
diff --git a/src/ast/struct_member_offset_decoration.h b/src/ast/struct_member_offset_decoration.h
index 8c6f3ac..da1a661 100644
--- a/src/ast/struct_member_offset_decoration.h
+++ b/src/ast/struct_member_offset_decoration.h
@@ -23,14 +23,14 @@
 namespace ast {
 
 /// A struct member offset decoration
-/// @note The WGSL spec removed the `[[offset(n)]]` decoration for `[[size(n)]]`
-/// and `[[align(n)]]` in https://github.com/gpuweb/gpuweb/pull/1447. However
+/// @note The WGSL spec removed the `@offset(n)` decoration for `@size(n)`
+/// and `@align(n)` in https://github.com/gpuweb/gpuweb/pull/1447. However
 /// this decoration is kept because the SPIR-V reader has to deal with absolute
 /// offsets, and transforming these to size / align is complex and can be done
 /// in a number of ways. The Resolver is responsible for consuming the size and
 /// align decorations and transforming these into absolute offsets. It is
-/// trivial for the Resolver to handle `[[offset(n)]]` or `[[size(n)]]` /
-/// `[[align(n)]]` decorations, so this is what we do, keeping all the layout
+/// trivial for the Resolver to handle `@offset(n)` or `@size(n)` /
+/// `@align(n)` decorations, so this is what we do, keeping all the layout
 /// logic in one place.
 class StructMemberOffsetDecoration
     : public Castable<StructMemberOffsetDecoration, Decoration> {
diff --git a/src/inspector/inspector_test.cc b/src/inspector/inspector_test.cc
index 1d237f8..713887b 100644
--- a/src/inspector/inspector_test.cc
+++ b/src/inspector/inspector_test.cc
@@ -2726,7 +2726,7 @@
 
 TEST_F(InspectorGetSamplerTextureUsesTest, None) {
   std::string shader = R"(
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
 })";
 
@@ -2739,12 +2739,12 @@
 
 TEST_F(InspectorGetSamplerTextureUsesTest, Simple) {
   std::string shader = R"(
-[[group(0), binding(1)]] var mySampler: sampler;
-[[group(0), binding(2)]] var myTexture: texture_2d<f32>;
+@group(0) @binding(1) var mySampler: sampler;
+@group(0) @binding(2) var myTexture: texture_2d<f32>;
 
-[[stage(fragment)]]
-fn main([[location(0)]] fragUV: vec2<f32>,
-        [[location(1)]] fragPosition: vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@location(0) fragUV: vec2<f32>,
+        @location(1) fragPosition: vec4<f32>) -> @location(0) vec4<f32> {
   return textureSample(myTexture, mySampler, fragUV) * fragPosition;
 })";
 
@@ -2762,12 +2762,12 @@
 
 TEST_F(InspectorGetSamplerTextureUsesTest, UnknownEntryPoint) {
   std::string shader = R"(
-[[group(0), binding(1)]] var mySampler: sampler;
-[[group(0), binding(2)]] var myTexture: texture_2d<f32>;
+@group(0) @binding(1) var mySampler: sampler;
+@group(0) @binding(2) var myTexture: texture_2d<f32>;
 
-[[stage(fragment)]]
-fn main([[location(0)]] fragUV: vec2<f32>,
-        [[location(1)]] fragPosition: vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@location(0) fragUV: vec2<f32>,
+        @location(1) fragPosition: vec4<f32>) -> @location(0) vec4<f32> {
   return textureSample(myTexture, mySampler, fragUV) * fragPosition;
 })";
 
@@ -2778,12 +2778,12 @@
 
 TEST_F(InspectorGetSamplerTextureUsesTest, MultipleCalls) {
   std::string shader = R"(
-[[group(0), binding(1)]] var mySampler: sampler;
-[[group(0), binding(2)]] var myTexture: texture_2d<f32>;
+@group(0) @binding(1) var mySampler: sampler;
+@group(0) @binding(2) var myTexture: texture_2d<f32>;
 
-[[stage(fragment)]]
-fn main([[location(0)]] fragUV: vec2<f32>,
-        [[location(1)]] fragPosition: vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@location(0) fragUV: vec2<f32>,
+        @location(1) fragPosition: vec4<f32>) -> @location(0) vec4<f32> {
   return textureSample(myTexture, mySampler, fragUV) * fragPosition;
 })";
 
@@ -2799,16 +2799,16 @@
 
 TEST_F(InspectorGetSamplerTextureUsesTest, BothIndirect) {
   std::string shader = R"(
-[[group(0), binding(1)]] var mySampler: sampler;
-[[group(0), binding(2)]] var myTexture: texture_2d<f32>;
+@group(0) @binding(1) var mySampler: sampler;
+@group(0) @binding(2) var myTexture: texture_2d<f32>;
 
 fn doSample(t: texture_2d<f32>, s: sampler, uv: vec2<f32>) -> vec4<f32> {
   return textureSample(t, s, uv);
 }
 
-[[stage(fragment)]]
-fn main([[location(0)]] fragUV: vec2<f32>,
-        [[location(1)]] fragPosition: vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@location(0) fragUV: vec2<f32>,
+        @location(1) fragPosition: vec4<f32>) -> @location(0) vec4<f32> {
   return doSample(myTexture, mySampler, fragUV) * fragPosition;
 })";
 
@@ -2826,16 +2826,16 @@
 
 TEST_F(InspectorGetSamplerTextureUsesTest, SamplerIndirect) {
   std::string shader = R"(
-[[group(0), binding(1)]] var mySampler: sampler;
-[[group(0), binding(2)]] var myTexture: texture_2d<f32>;
+@group(0) @binding(1) var mySampler: sampler;
+@group(0) @binding(2) var myTexture: texture_2d<f32>;
 
 fn doSample(s: sampler, uv: vec2<f32>) -> vec4<f32> {
   return textureSample(myTexture, s, uv);
 }
 
-[[stage(fragment)]]
-fn main([[location(0)]] fragUV: vec2<f32>,
-        [[location(1)]] fragPosition: vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@location(0) fragUV: vec2<f32>,
+        @location(1) fragPosition: vec4<f32>) -> @location(0) vec4<f32> {
   return doSample(mySampler, fragUV) * fragPosition;
 })";
 
@@ -2853,16 +2853,16 @@
 
 TEST_F(InspectorGetSamplerTextureUsesTest, TextureIndirect) {
   std::string shader = R"(
-[[group(0), binding(1)]] var mySampler: sampler;
-[[group(0), binding(2)]] var myTexture: texture_2d<f32>;
+@group(0) @binding(1) var mySampler: sampler;
+@group(0) @binding(2) var myTexture: texture_2d<f32>;
 
 fn doSample(t: texture_2d<f32>, uv: vec2<f32>) -> vec4<f32> {
   return textureSample(t, mySampler, uv);
 }
 
-[[stage(fragment)]]
-fn main([[location(0)]] fragUV: vec2<f32>,
-        [[location(1)]] fragPosition: vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@location(0) fragUV: vec2<f32>,
+        @location(1) fragPosition: vec4<f32>) -> @location(0) vec4<f32> {
   return doSample(myTexture, fragUV) * fragPosition;
 })";
 
@@ -2880,16 +2880,16 @@
 
 TEST_F(InspectorGetSamplerTextureUsesTest, NeitherIndirect) {
   std::string shader = R"(
-[[group(0), binding(1)]] var mySampler: sampler;
-[[group(0), binding(2)]] var myTexture: texture_2d<f32>;
+@group(0) @binding(1) var mySampler: sampler;
+@group(0) @binding(2) var myTexture: texture_2d<f32>;
 
 fn doSample(uv: vec2<f32>) -> vec4<f32> {
   return textureSample(myTexture, mySampler, uv);
 }
 
-[[stage(fragment)]]
-fn main([[location(0)]] fragUV: vec2<f32>,
-        [[location(1)]] fragPosition: vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@location(0) fragUV: vec2<f32>,
+        @location(1) fragPosition: vec4<f32>) -> @location(0) vec4<f32> {
   return doSample(fragUV) * fragPosition;
 })";
 
@@ -2907,8 +2907,8 @@
 
 TEST_F(InspectorGetSamplerTextureUsesTest, Complex) {
   std::string shader = R"(
-[[group(0), binding(1)]] var mySampler: sampler;
-[[group(0), binding(2)]] var myTexture: texture_2d<f32>;
+@group(0) @binding(1) var mySampler: sampler;
+@group(0) @binding(2) var myTexture: texture_2d<f32>;
 
 
 fn doSample(t: texture_2d<f32>, s: sampler, uv: vec2<f32>) -> vec4<f32> {
@@ -2927,21 +2927,21 @@
   return X(t, s, uv) + Y(t, s, uv);
 }
 
-[[stage(fragment)]]
-fn via_call([[location(0)]] fragUV: vec2<f32>,
-        [[location(1)]] fragPosition: vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn via_call(@location(0) fragUV: vec2<f32>,
+        @location(1) fragPosition: vec4<f32>) -> @location(0) vec4<f32> {
   return Z(myTexture, mySampler, fragUV) * fragPosition;
 }
 
-[[stage(fragment)]]
-fn via_ptr([[location(0)]] fragUV: vec2<f32>,
-        [[location(1)]] fragPosition: vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn via_ptr(@location(0) fragUV: vec2<f32>,
+        @location(1) fragPosition: vec4<f32>) -> @location(0) vec4<f32> {
   return textureSample(myTexture, mySampler, fragUV) + fragPosition;
 }
 
-[[stage(fragment)]]
-fn direct([[location(0)]] fragUV: vec2<f32>,
-        [[location(1)]] fragPosition: vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn direct(@location(0) fragUV: vec2<f32>,
+        @location(1) fragPosition: vec4<f32>) -> @location(0) vec4<f32> {
   return textureSample(myTexture, mySampler, fragUV) + fragPosition;
 })";
 
@@ -3075,16 +3075,16 @@
 // ::GetSamplerTextureUses was called.
 TEST_F(InspectorRegressionTest, tint967) {
   std::string shader = R"(
-[[group(0), binding(1)]] var mySampler: sampler;
-[[group(0), binding(2)]] var myTexture: texture_2d<f32>;
+@group(0) @binding(1) var mySampler: sampler;
+@group(0) @binding(2) var myTexture: texture_2d<f32>;
 
 fn doSample(t: texture_2d<f32>, s: sampler, uv: vec2<f32>) -> vec4<f32> {
   return textureSample(t, s, uv);
 }
 
-[[stage(fragment)]]
-fn main([[location(0)]] fragUV: vec2<f32>,
-        [[location(1)]] fragPosition: vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@location(0) fragUV: vec2<f32>,
+        @location(1) fragPosition: vec4<f32>) -> @location(0) vec4<f32> {
   return doSample(myTexture, mySampler, fragUV) * fragPosition;
 })";
 
diff --git a/src/reader/spirv/function_call_test.cc b/src/reader/spirv/function_call_test.cc
index c3efe3f..1626fc8 100644
--- a/src/reader/spirv/function_call_test.cc
+++ b/src/reader/spirv/function_call_test.cc
@@ -61,7 +61,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn x_100() {
   x_100_1();
 }
@@ -188,7 +188,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn x_100() {
   x_100_1();
 }
diff --git a/src/reader/spirv/function_memory_test.cc b/src/reader/spirv/function_memory_test.cc
index 189fdbe..9526586 100644
--- a/src/reader/spirv/function_memory_test.cc
+++ b/src/reader/spirv/function_memory_test.cc
@@ -858,7 +858,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
@@ -899,7 +899,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
@@ -950,14 +950,14 @@
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions())
       << assembly << p->error();
   const auto module_str = test::ToString(p->program());
-  EXPECT_THAT(module_str, HasSubstr(R"(type RTArr = [[stride(4)]] array<u32>;
+  EXPECT_THAT(module_str, HasSubstr(R"(type RTArr = @stride(4) array<u32>;
 
 struct S {
   field0 : u32;
   field1 : RTArr;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> myvar : S;
+@group(0) @binding(0) var<storage, read_write> myvar : S;
 )"));
 }
 
diff --git a/src/reader/spirv/function_var_test.cc b/src/reader/spirv/function_var_test.cc
index 9e09f66..eb1d179 100644
--- a/src/reader/spirv/function_var_test.cc
+++ b/src/reader/spirv/function_var_test.cc
@@ -338,9 +338,8 @@
   EXPECT_TRUE(fe.EmitFunctionVariables());
 
   auto ast_body = fe.ast_body();
-  EXPECT_THAT(
-      test::ToString(p->program(), ast_body),
-      HasSubstr("var x_200 : array<u32, 2u> = array<u32, 2u>();"));
+  EXPECT_THAT(test::ToString(p->program(), ast_body),
+              HasSubstr("var x_200 : array<u32, 2u> = array<u32, 2u>();"));
 }
 
 TEST_F(SpvParserFunctionVarTest,
@@ -368,7 +367,7 @@
 
   auto ast_body = fe.ast_body();
   EXPECT_THAT(test::ToString(p->program(), ast_body),
-              HasSubstr("var x_200 : Arr = [[stride(16)]] array<u32, 2u>();"));
+              HasSubstr("var x_200 : Arr = @stride(16) array<u32, 2u>();"));
 }
 
 TEST_F(SpvParserFunctionVarTest, EmitFunctionVariables_StructInitializer) {
diff --git a/src/reader/spirv/parser_impl_function_decl_test.cc b/src/reader/spirv/parser_impl_function_decl_test.cc
index b3eecc1..925883d 100644
--- a/src/reader/spirv/parser_impl_function_decl_test.cc
+++ b/src/reader/spirv/parser_impl_function_decl_test.cc
@@ -124,13 +124,13 @@
   const auto program_ast = test::ToString(program);
   EXPECT_THAT(program_ast, HasSubstr(R"(
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   x_2_1 : vec4<f32>;
 }
 )")) << program_ast;
 
   EXPECT_THAT(program_ast, HasSubstr(R"(
-[[stage(vertex)]]
+@stage(vertex)
 fn main() -> main_out {
 )"));
 }
@@ -148,7 +148,7 @@
   Program program = p->program();
   const auto program_ast = test::ToString(program);
   EXPECT_THAT(program_ast, HasSubstr(R"(
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
 )"));
 }
@@ -166,7 +166,7 @@
   Program program = p->program();
   const auto program_ast = test::ToString(program);
   EXPECT_THAT(program_ast, HasSubstr(R"(
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
 )"));
 }
@@ -186,11 +186,11 @@
   Program program = p->program();
   const auto program_ast = test::ToString(program);
   EXPECT_THAT(program_ast, HasSubstr(R"(
-[[stage(fragment)]]
+@stage(fragment)
 fn first_shader() {
 )"));
   EXPECT_THAT(program_ast, HasSubstr(R"(
-[[stage(fragment)]]
+@stage(fragment)
 fn second_shader() {
 )"));
 }
@@ -213,7 +213,7 @@
   Program program = p->program();
   const auto program_ast = test::ToString(program);
   EXPECT_THAT(program_ast, HasSubstr(R"(
-[[stage(compute), workgroup_size(2, 4, 8)]]
+@stage(compute) @workgroup_size(2, 4, 8)
 fn comp_main() {
 )")) << program_ast;
 }
@@ -239,7 +239,7 @@
   Program program = p->program();
   const auto program_ast = test::ToString(program);
   EXPECT_THAT(program_ast, HasSubstr(R"(
-[[stage(compute), workgroup_size(3, 5, 7)]]
+@stage(compute) @workgroup_size(3, 5, 7)
 fn comp_main() {
 )")) << program_ast;
 }
@@ -270,7 +270,7 @@
   Program program = p->program();
   const auto program_ast = test::ToString(program);
   EXPECT_THAT(program_ast, HasSubstr(R"(
-[[stage(compute), workgroup_size(3, 5, 7)]]
+@stage(compute) @workgroup_size(3, 5, 7)
 fn comp_main() {
 )")) << program_ast;
 }
@@ -300,7 +300,7 @@
   Program program = p->program();
   const auto program_ast = test::ToString(program);
   EXPECT_THAT(program_ast, HasSubstr(R"(
-[[stage(compute), workgroup_size(3, 5, 7)]]
+@stage(compute) @workgroup_size(3, 5, 7)
 fn comp_main() {
 )")) << program_ast;
 }
@@ -334,7 +334,7 @@
   Program program = p->program();
   const auto program_ast = test::ToString(program);
   EXPECT_THAT(program_ast, HasSubstr(R"(
-[[stage(compute), workgroup_size(3, 5, 7)]]
+@stage(compute) @workgroup_size(3, 5, 7)
 fn comp_main() {
 )")) << program_ast;
 }
diff --git a/src/reader/spirv/parser_impl_handle_test.cc b/src/reader/spirv/parser_impl_handle_test.cc
index a5f0cba..2e08b30 100644
--- a/src/reader/spirv/parser_impl_handle_test.cc
+++ b/src/reader/spirv/parser_impl_handle_test.cc
@@ -1254,7 +1254,7 @@
          %ptr = OpTypePointer UniformConstant %sampler
          %10 = OpVariable %ptr UniformConstant
 )",
-            R"([[group(0), binding(0)]] var x_10 : sampler;)"}));
+            R"(@group(0) @binding(0) var x_10 : sampler;)"}));
 
 INSTANTIATE_TEST_SUITE_P(
     Images,
@@ -1265,7 +1265,7 @@
             "", R"(
          %10 = OpVariable %ptr_f_texture_1d UniformConstant
 )",
-            R"([[group(0), binding(0)]] var x_10 : texture_1d<f32>;)"},
+            R"(@group(0) @binding(0) var x_10 : texture_1d<f32>;)"},
         DeclUnderspecifiedHandleCase{
             R"(
          OpDecorate %10 NonWritable
@@ -1273,7 +1273,7 @@
             R"(
          %10 = OpVariable %ptr_f_storage_1d UniformConstant
 )",
-            R"([[group(0), binding(0)]] var x_10 : texture_1d<f32>;)"},
+            R"(@group(0) @binding(0) var x_10 : texture_1d<f32>;)"},
         DeclUnderspecifiedHandleCase{
             R"(
          OpDecorate %10 NonReadable
@@ -1281,7 +1281,7 @@
             R"(
          %10 = OpVariable %ptr_f_storage_1d UniformConstant
 )",
-            R"([[group(0), binding(0)]] var x_10 : texture_storage_1d<rg32float, write>;)"}));
+            R"(@group(0) @binding(0) var x_10 : texture_storage_1d<rg32float, write>;)"}));
 
 // Test handle declaration or error, when there is an image access.
 
@@ -1405,8 +1405,7 @@
         {"%float 1D 0 1 1 1 Unknown", "%result = OpImageQuerySamples %uint %im",
          "WGSL arrayed textures must be 2d_array or cube_array: ", ""},
         {"%float 2D 0 0 1 1 Unknown", "%result = OpImageQuerySamples %uint %im",
-         "",
-         "[[group(2), binding(1)]] var x_20 : texture_multisampled_2d<f32>;"},
+         "", "@group(2) @binding(1) var x_20 : texture_multisampled_2d<f32>;"},
         {"%float 2D 0 1 1 1 Unknown", "%result = OpImageQuerySamples %uint %im",
          "WGSL multisampled textures must be 2d and non-arrayed: ", ""},
         {"%float 3D 0 0 1 1 Unknown", "%result = OpImageQuerySamples %uint %im",
@@ -1560,36 +1559,36 @@
         ImageAccessCase{"%float 2D 0 0 0 1 Unknown",
                         "%result = OpImageGather "
                         "%v4float %sampled_image %coords12 %int_1",
-                        R"([[group(0), binding(0)]] var x_10 : sampler;
+                        R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
                         "textureGather(1, x_20, x_10, coords12)"},
         // OpImageGather 2D ConstOffset signed
         ImageAccessCase{
             "%float 2D 0 0 0 1 Unknown",
             "%result = OpImageGather "
             "%v4float %sampled_image %coords12 %int_1 ConstOffset %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
             "textureGather(1, x_20, x_10, coords12, vec2<i32>(3, 4))"},
         // OpImageGather 2D ConstOffset unsigned
         ImageAccessCase{"%float 2D 0 0 0 1 Unknown",
                         "%result = OpImageGather "
                         "%v4float %sampled_image %coords12 %int_1 ConstOffset "
                         "%u_offsets2d",
-                        R"([[group(0), binding(0)]] var x_10 : sampler;
+                        R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
                         "textureGather(1, x_20, x_10, coords12, "
                         "vec2<i32>(vec2<u32>(3u, 4u)))"},
         // OpImageGather 2D Array
         ImageAccessCase{"%float 2D 0 1 0 1 Unknown",
                         "%result = OpImageGather "
                         "%v4float %sampled_image %coords123 %int_1",
-                        R"([[group(0), binding(0)]] var x_10 : sampler;
+                        R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d_array<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d_array<f32>;)",
                         "textureGather(1, x_20, x_10, coords123.xy, "
                         "i32(round(coords123.z)))"},
         // OpImageGather 2D Array ConstOffset signed
@@ -1597,9 +1596,9 @@
             "%float 2D 0 1 0 1 Unknown",
             "%result = OpImageGather "
             "%v4float %sampled_image %coords123 %int_1 ConstOffset %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d_array<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d_array<f32>;)",
             "textureGather(1, x_20, x_10, coords123.xy, "
             "i32(round(coords123.z)), vec2<i32>(3, 4))"},
         // OpImageGather 2D Array ConstOffset unsigned
@@ -1607,9 +1606,9 @@
                         "%result = OpImageGather "
                         "%v4float %sampled_image %coords123 %int_1 ConstOffset "
                         "%u_offsets2d",
-                        R"([[group(0), binding(0)]] var x_10 : sampler;
+                        R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d_array<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d_array<f32>;)",
                         "textureGather(1, x_20, x_10, coords123.xy, "
                         "i32(round(coords123.z)), "
                         "vec2<i32>(vec2<u32>(3u, 4u)))"},
@@ -1617,53 +1616,53 @@
         ImageAccessCase{"%float Cube 0 0 0 1 Unknown",
                         "%result = OpImageGather "
                         "%v4float %sampled_image %coords123 %int_1",
-                        R"([[group(0), binding(0)]] var x_10 : sampler;
+                        R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_cube<f32>;)",
+@group(2) @binding(1) var x_20 : texture_cube<f32>;)",
                         "textureGather(1, x_20, x_10, coords123)"},
         // OpImageGather Cube Array
         ImageAccessCase{"%float Cube 0 1 0 1 Unknown",
                         "%result = OpImageGather "
                         "%v4float %sampled_image %coords1234 %int_1",
-                        R"([[group(0), binding(0)]] var x_10 : sampler;
+                        R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_cube_array<f32>;)",
+@group(2) @binding(1) var x_20 : texture_cube_array<f32>;)",
                         "textureGather(1, x_20, x_10, coords1234.xyz, "
                         "i32(round(coords1234.w)))"},
         // OpImageGather 2DDepth
         ImageAccessCase{"%float 2D 1 0 0 1 Unknown",
                         "%result = OpImageGather "
                         "%v4float %sampled_image %coords12 %int_1",
-                        R"([[group(0), binding(0)]] var x_10 : sampler;
+                        R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d;)",
+@group(2) @binding(1) var x_20 : texture_depth_2d;)",
                         "textureGather(x_20, x_10, coords12)"},
         // OpImageGather 2DDepth ConstOffset signed
         ImageAccessCase{
             "%float 2D 1 0 0 1 Unknown",
             "%result = OpImageGather "
             "%v4float %sampled_image %coords12 %int_1 ConstOffset %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d;)",
+@group(2) @binding(1) var x_20 : texture_depth_2d;)",
             "textureGather(x_20, x_10, coords12, vec2<i32>(3, 4))"},
         // OpImageGather 2DDepth ConstOffset unsigned
         ImageAccessCase{"%float 2D 1 0 0 1 Unknown",
                         "%result = OpImageGather "
                         "%v4float %sampled_image %coords12 %int_1 ConstOffset "
                         "%u_offsets2d",
-                        R"([[group(0), binding(0)]] var x_10 : sampler;
+                        R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d;)",
+@group(2) @binding(1) var x_20 : texture_depth_2d;)",
                         "textureGather(x_20, x_10, coords12, "
                         "vec2<i32>(vec2<u32>(3u, 4u)))"},
         // OpImageGather 2DDepth Array
         ImageAccessCase{"%float 2D 1 1 0 1 Unknown",
                         "%result = OpImageGather "
                         "%v4float %sampled_image %coords123 %int_1",
-                        R"([[group(0), binding(0)]] var x_10 : sampler;
+                        R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d_array;)",
+@group(2) @binding(1) var x_20 : texture_depth_2d_array;)",
                         "textureGather(x_20, x_10, coords123.xy, "
                         "i32(round(coords123.z)))"},
         // OpImageGather 2DDepth Array ConstOffset signed
@@ -1671,9 +1670,9 @@
             "%float 2D 1 1 0 1 Unknown",
             "%result = OpImageGather "
             "%v4float %sampled_image %coords123 %int_1 ConstOffset %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d_array;)",
+@group(2) @binding(1) var x_20 : texture_depth_2d_array;)",
             "textureGather(x_20, x_10, coords123.xy, "
             "i32(round(coords123.z)), vec2<i32>(3, 4))"},
         // OpImageGather 2DDepth Array ConstOffset unsigned
@@ -1681,9 +1680,9 @@
                         "%result = OpImageGather "
                         "%v4float %sampled_image %coords123 %int_1 ConstOffset "
                         "%u_offsets2d",
-                        R"([[group(0), binding(0)]] var x_10 : sampler;
+                        R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d_array;)",
+@group(2) @binding(1) var x_20 : texture_depth_2d_array;)",
                         "textureGather(x_20, x_10, coords123.xy, "
                         "i32(round(coords123.z)), "
                         "vec2<i32>(vec2<u32>(3u, 4u)))"},
@@ -1691,17 +1690,17 @@
         ImageAccessCase{"%float Cube 1 0 0 1 Unknown",
                         "%result = OpImageGather "
                         "%v4float %sampled_image %coords123 %int_1",
-                        R"([[group(0), binding(0)]] var x_10 : sampler;
+                        R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_cube;)",
+@group(2) @binding(1) var x_20 : texture_depth_cube;)",
                         "textureGather(x_20, x_10, coords123)"},
         // OpImageGather DepthCube Array
         ImageAccessCase{"%float Cube 1 1 0 1 Unknown",
                         "%result = OpImageGather "
                         "%v4float %sampled_image %coords1234 %int_1",
-                        R"([[group(0), binding(0)]] var x_10 : sampler;
+                        R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_cube_array;)",
+@group(2) @binding(1) var x_20 : texture_depth_cube_array;)",
                         "textureGather(x_20, x_10, coords1234.xyz, "
                         "i32(round(coords1234.w)))"}}));
 
@@ -1714,18 +1713,18 @@
             "%float 2D 1 0 0 1 Unknown",
             "%result = OpImageDrefGather "
             "%v4float %sampled_image %coords12 %depth",
-            R"([[group(0), binding(0)]] var x_10 : sampler_comparison;
+            R"(@group(0) @binding(0) var x_10 : sampler_comparison;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d;)",
+@group(2) @binding(1) var x_20 : texture_depth_2d;)",
             "textureGatherCompare(x_20, x_10, coords12, 0.200000003)"},
         // OpImageDrefGather 2DDepth ConstOffset signed
         ImageAccessCase{
             "%float 2D 1 0 0 1 Unknown",
             "%result = OpImageDrefGather "
             "%v4float %sampled_image %coords12 %depth ConstOffset %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler_comparison;
+            R"(@group(0) @binding(0) var x_10 : sampler_comparison;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d;)",
+@group(2) @binding(1) var x_20 : texture_depth_2d;)",
             "textureGatherCompare(x_20, x_10, coords12, 0.200000003, "
             "vec2<i32>(3, 4))"},
         // OpImageDrefGather 2DDepth ConstOffset unsigned
@@ -1734,62 +1733,59 @@
             "%result = OpImageDrefGather "
             "%v4float %sampled_image %coords12 %depth ConstOffset "
             "%u_offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler_comparison;
+            R"(@group(0) @binding(0) var x_10 : sampler_comparison;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d;)",
+@group(2) @binding(1) var x_20 : texture_depth_2d;)",
             "textureGatherCompare(x_20, x_10, coords12, 0.200000003, "
             "vec2<i32>(vec2<u32>(3u, 4u)))"},
         // OpImageDrefGather 2DDepth Array
-        ImageAccessCase{
-            "%float 2D 1 1 0 1 Unknown",
-            "%result = OpImageDrefGather "
-            "%v4float %sampled_image %coords123 %depth",
-            R"([[group(0), binding(0)]] var x_10 : sampler_comparison;
+        ImageAccessCase{"%float 2D 1 1 0 1 Unknown",
+                        "%result = OpImageDrefGather "
+                        "%v4float %sampled_image %coords123 %depth",
+                        R"(@group(0) @binding(0) var x_10 : sampler_comparison;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d_array;)",
-            "textureGatherCompare(x_20, x_10, coords123.xy, "
-            "i32(round(coords123.z)), 0.200000003)"},
+@group(2) @binding(1) var x_20 : texture_depth_2d_array;)",
+                        "textureGatherCompare(x_20, x_10, coords123.xy, "
+                        "i32(round(coords123.z)), 0.200000003)"},
         // OpImageDrefGather 2DDepth Array ConstOffset signed
         ImageAccessCase{
             "%float 2D 1 1 0 1 Unknown",
             "%result = OpImageDrefGather "
             "%v4float %sampled_image %coords123 %depth ConstOffset %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler_comparison;
+            R"(@group(0) @binding(0) var x_10 : sampler_comparison;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d_array;)",
+@group(2) @binding(1) var x_20 : texture_depth_2d_array;)",
             "textureGatherCompare(x_20, x_10, coords123.xy, "
             "i32(round(coords123.z)), 0.200000003, vec2<i32>(3, 4))"},
         // OpImageDrefGather 2DDepth Array ConstOffset unsigned
-        ImageAccessCase{
-            "%float 2D 1 1 0 1 Unknown",
-            "%result = OpImageDrefGather "
-            "%v4float %sampled_image %coords123 %depth ConstOffset "
-            "%u_offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler_comparison;
+        ImageAccessCase{"%float 2D 1 1 0 1 Unknown",
+                        "%result = OpImageDrefGather "
+                        "%v4float %sampled_image %coords123 %depth ConstOffset "
+                        "%u_offsets2d",
+                        R"(@group(0) @binding(0) var x_10 : sampler_comparison;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d_array;)",
-            "textureGatherCompare(x_20, x_10, coords123.xy, "
-            "i32(round(coords123.z)), 0.200000003, "
-            "vec2<i32>(vec2<u32>(3u, 4u)))"},
+@group(2) @binding(1) var x_20 : texture_depth_2d_array;)",
+                        "textureGatherCompare(x_20, x_10, coords123.xy, "
+                        "i32(round(coords123.z)), 0.200000003, "
+                        "vec2<i32>(vec2<u32>(3u, 4u)))"},
         // OpImageDrefGather DepthCube
         ImageAccessCase{
             "%float Cube 1 0 0 1 Unknown",
             "%result = OpImageDrefGather "
             "%v4float %sampled_image %coords123 %depth",
-            R"([[group(0), binding(0)]] var x_10 : sampler_comparison;
+            R"(@group(0) @binding(0) var x_10 : sampler_comparison;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_cube;)",
+@group(2) @binding(1) var x_20 : texture_depth_cube;)",
             "textureGatherCompare(x_20, x_10, coords123, 0.200000003)"},
         // OpImageDrefGather DepthCube Array
-        ImageAccessCase{
-            "%float Cube 1 1 0 1 Unknown",
-            "%result = OpImageDrefGather "
-            "%v4float %sampled_image %coords1234 %depth",
-            R"([[group(0), binding(0)]] var x_10 : sampler_comparison;
+        ImageAccessCase{"%float Cube 1 1 0 1 Unknown",
+                        "%result = OpImageDrefGather "
+                        "%v4float %sampled_image %coords1234 %depth",
+                        R"(@group(0) @binding(0) var x_10 : sampler_comparison;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_cube_array;)",
-            "textureGatherCompare(x_20, x_10, coords1234.xyz, "
-            "i32(round(coords1234.w)), 0.200000003)"}}));
+@group(2) @binding(1) var x_20 : texture_depth_cube_array;)",
+                        "textureGatherCompare(x_20, x_10, coords1234.xyz, "
+                        "i32(round(coords1234.w)), 0.200000003)"}}));
 
 INSTANTIATE_TEST_SUITE_P(
     ImageSampleImplicitLod,
@@ -1800,9 +1796,9 @@
         ImageAccessCase{"%float 2D 0 0 0 1 Unknown",
                         "%result = OpImageSampleImplicitLod "
                         "%v4float %sampled_image %coords12",
-                        R"([[group(0), binding(0)]] var x_10 : sampler;
+                        R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
                         "textureSample(x_20, x_10, coords12)"},
 
         // OpImageSampleImplicitLod arrayed
@@ -1810,9 +1806,9 @@
             "%float 2D 0 1 0 1 Unknown",
             "%result = OpImageSampleImplicitLod "
             "%v4float %sampled_image %coords123",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d_array<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d_array<f32>;)",
             "textureSample(x_20, x_10, coords123.xy, i32(round(coords123.z)))"},
 
         // OpImageSampleImplicitLod with ConstOffset
@@ -1820,9 +1816,9 @@
             "%float 2D 0 0 0 1 Unknown",
             "%result = OpImageSampleImplicitLod "
             "%v4float %sampled_image %coords12 ConstOffset %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
             "textureSample(x_20, x_10, coords12, vec2<i32>(3, 4))"},
 
         // OpImageSampleImplicitLod arrayed with ConstOffset
@@ -1830,18 +1826,18 @@
             "%float 2D 0 1 0 1 Unknown",
             "%result = OpImageSampleImplicitLod "
             "%v4float %sampled_image %coords123 ConstOffset %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d_array<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d_array<f32>;)",
             R"(textureSample(x_20, x_10, coords123.xy, i32(round(coords123.z)), vec2<i32>(3, 4)))"},
 
         // OpImageSampleImplicitLod with Bias
         ImageAccessCase{"%float 2D 0 0 0 1 Unknown",
                         "%result = OpImageSampleImplicitLod "
                         "%v4float %sampled_image %coords12 Bias %float_7",
-                        R"([[group(0), binding(0)]] var x_10 : sampler;
+                        R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
                         "textureSampleBias(x_20, x_10, coords12, 7.0)"},
 
         // OpImageSampleImplicitLod arrayed with Bias
@@ -1849,9 +1845,9 @@
             "%float 2D 0 1 0 1 Unknown",
             "%result = OpImageSampleImplicitLod "
             "%v4float %sampled_image %coords123 Bias %float_7",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d_array<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d_array<f32>;)",
             R"(textureSampleBias(x_20, x_10, coords123.xy, i32(round(coords123.z)), 7.0))"},
 
         // OpImageSampleImplicitLod with Bias and signed ConstOffset
@@ -1860,9 +1856,9 @@
             "%result = OpImageSampleImplicitLod "
             "%v4float %sampled_image %coords12 Bias|ConstOffset "
             "%float_7 %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
             R"(textureSampleBias(x_20, x_10, coords12, 7.0, vec2<i32>(3, 4))"},
 
         // OpImageSampleImplicitLod with Bias and unsigned ConstOffset
@@ -1872,9 +1868,9 @@
             "%result = OpImageSampleImplicitLod "
             "%v4float %sampled_image %coords12 Bias|ConstOffset "
             "%float_7 %u_offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
             R"(textureSampleBias(x_20, x_10, coords12, 7.0, vec2<i32>(vec2<u32>(3u, 4u)))"},
         // OpImageSampleImplicitLod arrayed with Bias
         ImageAccessCase{
@@ -1882,9 +1878,9 @@
             "%result = OpImageSampleImplicitLod "
             "%v4float %sampled_image %coords123 Bias|ConstOffset "
             "%float_7 %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d_array<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d_array<f32>;)",
             R"(textureSampleBias(x_20, x_10, coords123.xy, i32(round(coords123.z)), 7.0, vec2<i32>(3, 4))"}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -1903,11 +1899,11 @@
      %200 = OpImageSampleImplicitLod %v4float %sampled_image %coords12
      %210 = OpImageSampleDrefImplicitLod %float %sampled_dref_image %coords12 %depth
 )",
-                        R"([[group(0), binding(0)]] var x_10 : sampler;
+                        R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d;
+@group(2) @binding(1) var x_20 : texture_depth_2d;
 
-[[group(0), binding(1)]] var x_30 : sampler_comparison;
+@group(0) @binding(1) var x_30 : sampler_comparison;
 )",
                         R"(
   let x_200 : vec4<f32> = vec4<f32>(textureSample(x_20, x_10, coords12), 0.0, 0.0, 0.0);
@@ -1923,9 +1919,9 @@
             "%float 2D 0 0 0 1 Unknown",
             "%result = OpImageSampleDrefImplicitLod "
             "%float %sampled_image %coords12 %depth",
-            R"([[group(0), binding(0)]] var x_10 : sampler_comparison;
+            R"(@group(0) @binding(0) var x_10 : sampler_comparison;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d;
+@group(2) @binding(1) var x_20 : texture_depth_2d;
 )",
             R"(textureSampleCompare(x_20, x_10, coords12, 0.200000003))"},
         // ImageSampleDrefImplicitLod - arrayed
@@ -1933,18 +1929,18 @@
             "%float 2D 0 1 0 1 Unknown",
             "%result = OpImageSampleDrefImplicitLod "
             "%float %sampled_image %coords123 %depth",
-            R"([[group(0), binding(0)]] var x_10 : sampler_comparison;
+            R"(@group(0) @binding(0) var x_10 : sampler_comparison;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d_array;)",
+@group(2) @binding(1) var x_20 : texture_depth_2d_array;)",
             R"(textureSampleCompare(x_20, x_10, coords123.xy, i32(round(coords123.z)), 0.200000003))"},
         // ImageSampleDrefImplicitLod with ConstOffset
         ImageAccessCase{
             "%float 2D 0 0 0 1 Unknown",
             "%result = OpImageSampleDrefImplicitLod %float "
             "%sampled_image %coords12 %depth ConstOffset %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler_comparison;
+            R"(@group(0) @binding(0) var x_10 : sampler_comparison;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d;
+@group(2) @binding(1) var x_20 : texture_depth_2d;
 )",
             R"(textureSampleCompare(x_20, x_10, coords12, 0.200000003, vec2<i32>(3, 4)))"},
         // ImageSampleDrefImplicitLod arrayed with ConstOffset
@@ -1952,9 +1948,9 @@
             "%float 2D 0 1 0 1 Unknown",
             "%result = OpImageSampleDrefImplicitLod %float "
             "%sampled_image %coords123 %depth ConstOffset %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler_comparison;
+            R"(@group(0) @binding(0) var x_10 : sampler_comparison;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d_array;)",
+@group(2) @binding(1) var x_20 : texture_depth_2d_array;)",
             R"(textureSampleCompare(x_20, x_10, coords123.xy, i32(round(coords123.z)), 0.200000003, vec2<i32>(3, 4)))"}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -1968,9 +1964,9 @@
             "%float 2D 1 0 0 1 Unknown",
             "%result = OpImageSampleDrefExplicitLod "
             "%float %sampled_image %coords12 %depth Lod %float_0",
-            R"([[group(0), binding(0)]] var x_10 : sampler_comparison;
+            R"(@group(0) @binding(0) var x_10 : sampler_comparison;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d;
+@group(2) @binding(1) var x_20 : texture_depth_2d;
 )",
             R"(textureSampleCompareLevel(x_20, x_10, coords12, 0.200000003))"},
         // 2D array
@@ -1978,9 +1974,9 @@
             "%float 2D 1 1 0 1 Unknown",
             "%result = OpImageSampleDrefExplicitLod "
             "%float %sampled_image %coords123 %depth Lod %float_0",
-            R"([[group(0), binding(0)]] var x_10 : sampler_comparison;
+            R"(@group(0) @binding(0) var x_10 : sampler_comparison;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d_array;)",
+@group(2) @binding(1) var x_20 : texture_depth_2d_array;)",
             R"(textureSampleCompareLevel(x_20, x_10, coords123.xy, i32(round(coords123.z)), 0.200000003))"},
         // 2D, ConstOffset
         ImageAccessCase{
@@ -1988,9 +1984,9 @@
             "%result = OpImageSampleDrefExplicitLod %float "
             "%sampled_image %coords12 %depth Lod|ConstOffset "
             "%float_0 %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler_comparison;
+            R"(@group(0) @binding(0) var x_10 : sampler_comparison;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d;
+@group(2) @binding(1) var x_20 : texture_depth_2d;
 )",
             R"(textureSampleCompareLevel(x_20, x_10, coords12, 0.200000003, vec2<i32>(3, 4)))"},
         // 2D array, ConstOffset
@@ -1999,27 +1995,27 @@
             "%result = OpImageSampleDrefExplicitLod %float "
             "%sampled_image %coords123 %depth Lod|ConstOffset "
             "%float_0 %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler_comparison;
+            R"(@group(0) @binding(0) var x_10 : sampler_comparison;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d_array;)",
+@group(2) @binding(1) var x_20 : texture_depth_2d_array;)",
             R"(textureSampleCompareLevel(x_20, x_10, coords123.xy, i32(round(coords123.z)), 0.200000003, vec2<i32>(3, 4)))"},
         // Cube
         ImageAccessCase{
             "%float Cube 1 0 0 1 Unknown",
             "%result = OpImageSampleDrefExplicitLod "
             "%float %sampled_image %coords123 %depth Lod %float_0",
-            R"([[group(0), binding(0)]] var x_10 : sampler_comparison;
+            R"(@group(0) @binding(0) var x_10 : sampler_comparison;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_cube;)",
+@group(2) @binding(1) var x_20 : texture_depth_cube;)",
             R"(textureSampleCompareLevel(x_20, x_10, coords123, 0.200000003))"},
         // Cube array
         ImageAccessCase{
             "%float Cube 1 1 0 1 Unknown",
             "%result = OpImageSampleDrefExplicitLod "
             "%float %sampled_image %coords1234 %depth Lod %float_0",
-            R"([[group(0), binding(0)]] var x_10 : sampler_comparison;
+            R"(@group(0) @binding(0) var x_10 : sampler_comparison;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_cube_array;)",
+@group(2) @binding(1) var x_20 : texture_depth_cube_array;)",
             R"(textureSampleCompareLevel(x_20, x_10, coords1234.xyz, i32(round(coords1234.w)), 0.200000003))"}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -2031,9 +2027,9 @@
         ImageAccessCase{"%float 2D 0 0 0 1 Unknown",
                         "%result = OpImageSampleExplicitLod "
                         "%v4float %sampled_image %coords12 Lod %float_null",
-                        R"([[group(0), binding(0)]] var x_10 : sampler;
+                        R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
                         R"(textureSampleLevel(x_20, x_10, coords12, 0.0))"},
 
         // OpImageSampleExplicitLod arrayed - using Lod
@@ -2041,9 +2037,9 @@
             "%float 2D 0 1 0 1 Unknown",
             "%result = OpImageSampleExplicitLod "
             "%v4float %sampled_image %coords123 Lod %float_null",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d_array<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d_array<f32>;)",
             R"(textureSampleLevel(x_20, x_10, coords123.xy, i32(round(coords123.z)), 0.0))"},
 
         // OpImageSampleExplicitLod - using Lod and ConstOffset
@@ -2052,9 +2048,9 @@
             "%result = OpImageSampleExplicitLod "
             "%v4float %sampled_image %coords12 Lod|ConstOffset "
             "%float_null %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
             R"(textureSampleLevel(x_20, x_10, coords12, 0.0, vec2<i32>(3, 4)))"},
 
         // OpImageSampleExplicitLod - using Lod and unsigned ConstOffset
@@ -2064,9 +2060,9 @@
             "%result = OpImageSampleExplicitLod "
             "%v4float %sampled_image %coords12 Lod|ConstOffset "
             "%float_null %u_offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
             R"(textureSampleLevel(x_20, x_10, coords12, 0.0, vec2<i32>(vec2<u32>(3u, 4u)))"},
 
         // OpImageSampleExplicitLod arrayed - using Lod and ConstOffset
@@ -2075,9 +2071,9 @@
             "%result = OpImageSampleExplicitLod "
             "%v4float %sampled_image %coords123 Lod|ConstOffset "
             "%float_null %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d_array<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d_array<f32>;)",
             R"(textureSampleLevel(x_20, x_10, coords123.xy, i32(round(coords123.z)), 0.0, vec2<i32>(3, 4)))"}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -2090,9 +2086,9 @@
             "%float 2D 0 0 0 1 Unknown",
             "%result = OpImageSampleExplicitLod "
             "%v4float %sampled_image %coords12 Grad %vf12 %vf21",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
             R"(textureSampleGrad(x_20, x_10, coords12, vf12, vf21))"},
 
         // OpImageSampleExplicitLod arrayed - using Grad
@@ -2100,9 +2096,9 @@
             "%float 2D 0 1 0 1 Unknown",
             "%result = OpImageSampleExplicitLod "
             "%v4float %sampled_image %coords123 Grad %vf12 %vf21",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d_array<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d_array<f32>;)",
             R"(textureSampleGrad(x_20, x_10, coords123.xy, i32(round(coords123.z)), vf12, vf21))"},
 
         // OpImageSampleExplicitLod - using Grad and ConstOffset
@@ -2111,9 +2107,9 @@
             "%result = OpImageSampleExplicitLod "
             "%v4float %sampled_image %coords12 Grad|ConstOffset "
             "%vf12 %vf21 %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
             R"(textureSampleGrad(x_20, x_10, coords12, vf12, vf21, vec2<i32>(3, 4)))"},
 
         // OpImageSampleExplicitLod - using Grad and unsigned ConstOffset
@@ -2122,9 +2118,9 @@
             "%result = OpImageSampleExplicitLod "
             "%v4float %sampled_image %coords12 Grad|ConstOffset "
             "%vf12 %vf21 %u_offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
             R"(textureSampleGrad(x_20, x_10, coords12, vf12, vf21, vec2<i32>(vec2<u32>(3u, 4u)))"},
 
         // OpImageSampleExplicitLod arrayed - using Grad and ConstOffset
@@ -2133,9 +2129,9 @@
             "%result = OpImageSampleExplicitLod "
             "%v4float %sampled_image %coords123 Grad|ConstOffset "
             "%vf12 %vf21 %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d_array<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d_array<f32>;)",
             R"(textureSampleGrad(x_20, x_10, coords123.xy, i32(round(coords123.z)), vf12, vf21, vec2<i32>(3, 4)))"},
 
         // OpImageSampleExplicitLod arrayed - using Grad and unsigned
@@ -2145,9 +2141,9 @@
             "%result = OpImageSampleExplicitLod "
             "%v4float %sampled_image %coords123 Grad|ConstOffset "
             "%vf12 %vf21 %u_offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d_array<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d_array<f32>;)",
             R"(textureSampleGrad(x_20, x_10, coords123.xy, i32(round(coords123.z)), vf12, vf21, vec2<i32>(vec2<u32>(3u, 4u))))"}));
 
 // Test crbug.com/378:
@@ -2164,17 +2160,17 @@
         {"%float 2D 0 0 0 1 Unknown",
          "%result = OpImageSampleExplicitLod %v4float "
          "%sampled_image %vf12 Lod %f1",
-         R"([[group(0), binding(0)]] var x_10 : sampler;
+         R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
          R"(textureSampleLevel(x_20, x_10, vf12, f1))"},
         // Test a depth case
         {"%float 2D 1 0 0 1 Unknown",
          "%result = OpImageSampleExplicitLod %v4float "
          "%sampled_image %vf12 Lod %f1",
-         R"([[group(0), binding(0)]] var x_10 : sampler;
+         R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d;
+@group(2) @binding(1) var x_20 : texture_depth_2d;
 )",
          R"(vec4<f32>(textureSampleLevel(x_20, x_10, vf12, i32(f1)), 0.0, 0.0, 0.0))"}}));
 
@@ -2213,9 +2209,9 @@
             "%float 1D 0 0 0 1 Unknown",
             "%result = OpImageSampleProjImplicitLod "
             "%v4float %sampled_image %coords12",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_1d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_1d<f32>;)",
             R"(textureSample(x_20, x_10, (coords12.x / coords12.y)))"},
 
         // OpImageSampleProjImplicitLod 2D
@@ -2223,9 +2219,9 @@
             "%float 2D 0 0 0 1 Unknown",
             "%result = OpImageSampleProjImplicitLod "
             "%v4float %sampled_image %coords123",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
             R"(textureSample(x_20, x_10, (coords123.xy / coords123.z)))"},
 
         // OpImageSampleProjImplicitLod 3D
@@ -2233,9 +2229,9 @@
             "%float 3D 0 0 0 1 Unknown",
             "%result = OpImageSampleProjImplicitLod "
             "%v4float %sampled_image %coords1234",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_3d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_3d<f32>;)",
             R"(textureSample(x_20, x_10, (coords1234.xyz / coords1234.w)))"},
 
         // OpImageSampleProjImplicitLod 2D with ConstOffset
@@ -2245,9 +2241,9 @@
             "%float 2D 0 0 0 1 Unknown",
             "%result = OpImageSampleProjImplicitLod "
             "%v4float %sampled_image %coords123 ConstOffset %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
             R"(textureSample(x_20, x_10, (coords123.xy / coords123.z), vec2<i32>(3, 4)))"}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -2261,9 +2257,9 @@
             "%float 2D 0 0 0 1 Unknown",
             "%result = OpImageSampleProjImplicitLod "
             "%v4float %sampled_image %coords123 Bias %float_7",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
             R"(textureSampleBias(x_20, x_10, (coords123.xy / coords123.z), 7.0))"},
 
         // OpImageSampleProjImplicitLod with Bias and signed ConstOffset
@@ -2272,9 +2268,9 @@
             "%result = OpImageSampleProjImplicitLod "
             "%v4float %sampled_image %coords123 Bias|ConstOffset "
             "%float_7 %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
             R"(textureSampleBias(x_20, x_10, (coords123.xy / coords123.z), 7.0, vec2<i32>(3, 4)))"},
 
         // OpImageSampleProjImplicitLod with Bias and unsigned ConstOffset
@@ -2284,9 +2280,9 @@
             "%result = OpImageSampleProjImplicitLod "
             "%v4float %sampled_image %coords123 Bias|ConstOffset "
             "%float_7 %u_offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
             R"(textureSampleBias(x_20, x_10, (coords123.xy / coords123.z), 7.0, vec2<i32>(vec2<u32>(3u, 4u))))"}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -2298,9 +2294,9 @@
             "%float 2D 0 0 0 1 Unknown",
             "%result = OpImageSampleProjExplicitLod "
             "%v4float %sampled_image %coords123 Lod %f1",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
             R"(textureSampleLevel(x_20, x_10, (coords123.xy / coords123.z), f1))"},
 
         // OpImageSampleProjExplicitLod 2D Lod with ConstOffset
@@ -2308,9 +2304,9 @@
             "%float 2D 0 0 0 1 Unknown",
             "%result = OpImageSampleProjExplicitLod "
             "%v4float %sampled_image %coords123 Lod|ConstOffset %f1 %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
             R"(textureSampleLevel(x_20, x_10, (coords123.xy / coords123.z), f1, vec2<i32>(3, 4)))"}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -2322,9 +2318,9 @@
             "%float 2D 0 0 0 1 Unknown",
             "%result = OpImageSampleProjExplicitLod "
             "%v4float %sampled_image %coords123 Grad %vf12 %vf21",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
             R"(textureSampleGrad(x_20, x_10, (coords123.xy / coords123.z), vf12, vf21))"},
 
         // OpImageSampleProjExplicitLod 2D Lod Grad ConstOffset
@@ -2333,9 +2329,9 @@
             "%result = OpImageSampleProjExplicitLod "
             "%v4float %sampled_image %coords123 Grad|ConstOffset "
             "%vf12 %vf21 %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
             R"(textureSampleGrad(x_20, x_10, (coords123.xy / coords123.z), vf12, vf21, vec2<i32>(3, 4)))"}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -2348,9 +2344,9 @@
             "%float 2D 1 0 0 1 Unknown",
             "%result = OpImageSampleProjImplicitLod "
             "%v4float %sampled_image %coords123",
-            R"([[group(0), binding(0)]] var x_10 : sampler;
+            R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d;
+@group(2) @binding(1) var x_20 : texture_depth_2d;
 )",
             // Sampling the depth texture yields an f32, but the
             // SPIR-V operation yiedls vec4<f32>, so fill out the
@@ -2367,9 +2363,9 @@
             "%float 2D 1 0 0 1 Unknown",
             "%result = OpImageSampleProjDrefImplicitLod "
             "%float %sampled_image %coords123 %f1",
-            R"([[group(0), binding(0)]] var x_10 : sampler_comparison;
+            R"(@group(0) @binding(0) var x_10 : sampler_comparison;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d;
+@group(2) @binding(1) var x_20 : texture_depth_2d;
 )",
             R"(textureSampleCompare(x_20, x_10, (coords123.xy / coords123.z), f1))"},
 
@@ -2378,9 +2374,9 @@
             "%float 2D 1 0 0 1 Unknown",
             "%result = OpImageSampleProjDrefImplicitLod "
             "%float %sampled_image %coords123 %f1 ConstOffset %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler_comparison;
+            R"(@group(0) @binding(0) var x_10 : sampler_comparison;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d;
+@group(2) @binding(1) var x_20 : texture_depth_2d;
 )",
             R"(textureSampleCompare(x_20, x_10, (coords123.xy / coords123.z), f1, vec2<i32>(3, 4)))"}));
 
@@ -2397,9 +2393,9 @@
             "%float 2D 1 0 0 1 Unknown",
             "%result = OpImageSampleProjDrefExplicitLod "
             "%float %sampled_image %coords123 %depth Lod %float_0",
-            R"([[group(0), binding(0)]] var x_10 : sampler_comparison;
+            R"(@group(0) @binding(0) var x_10 : sampler_comparison;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d;
+@group(2) @binding(1) var x_20 : texture_depth_2d;
 )",
             R"(textureSampleCompare(x_20, x_10, (coords123.xy / coords123.z), 0.200000003, 0.0))"},
 
@@ -2409,9 +2405,9 @@
             "%result = OpImageSampleProjDrefExplicitLod "
             "%float %sampled_image %coords123 %depth "
             "Lod|ConstOffset %float_0 %offsets2d",
-            R"([[group(0), binding(0)]] var x_10 : sampler_comparison;
+            R"(@group(0) @binding(0) var x_10 : sampler_comparison;
 
-[[group(2), binding(1)]] var x_20 : texture_depth_2d;
+@group(2) @binding(1) var x_20 : texture_depth_2d;
 )",
             R"(textureSampleCompareLevel(x_20, x_10, (coords123.xy / coords123.z), 0.200000003, 0.0, vec2<i32>(3, 4)))"}));
 
@@ -2492,7 +2488,7 @@
                              // OpImageWrite with no extra params
                              {"%float 2D 0 0 0 2 Rgba32f",
                               "OpImageWrite %im %vi12 %vf1234",
-                              "[[group(2), binding(1)]] var x_20 : "
+                              "@group(2) @binding(1) var x_20 : "
                               "texture_storage_2d<rgba32float, write>;",
                               "textureStore(x_20, vi12, vf1234);"}}));
 
@@ -2507,36 +2503,36 @@
     ::testing::ValuesIn(std::vector<ImageAccessCase>{
         // Source 1 component
         {"%float 2D 0 0 0 2 R32f", "OpImageWrite %im %vi12 %f1",
-         R"([[group(2), binding(1)]] var x_20 : texture_storage_2d<r32float, write>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_storage_2d<r32float, write>;)",
          "textureStore(x_20, vi12, vec4<f32>(f1, 0.0, 0.0, 0.0));"},
         // Source 2 component, dest 1 component
         {"%float 2D 0 0 0 2 R32f", "OpImageWrite %im %vi12 %vf12",
-         R"([[group(2), binding(1)]] var x_20 : texture_storage_2d<r32float, write>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_storage_2d<r32float, write>;)",
          "textureStore(x_20, vi12, vec4<f32>(vf12, 0.0, 0.0));"},
         // Source 3 component, dest 1 component
         {"%float 2D 0 0 0 2 R32f", "OpImageWrite %im %vi12 %vf123",
-         R"([[group(2), binding(1)]] var x_20 : texture_storage_2d<r32float, write>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_storage_2d<r32float, write>;)",
          "textureStore(x_20, vi12, vec4<f32>(vf123, 0.0));"},
         // Source 4 component, dest 1 component
         {"%float 2D 0 0 0 2 R32f", "OpImageWrite %im %vi12 %vf1234",
-         R"([[group(2), binding(1)]] var x_20 : texture_storage_2d<r32float, write>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_storage_2d<r32float, write>;)",
          "textureStore(x_20, vi12, vf1234);"},
         // Source 2 component, dest 2 component
         {"%float 2D 0 0 0 2 Rg32f", "OpImageWrite %im %vi12 %vf12",
-         R"([[group(2), binding(1)]] var x_20 : texture_storage_2d<rg32float, write>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_storage_2d<rg32float, write>;)",
          "textureStore(x_20, vi12, vec4<f32>(vf12, 0.0, 0.0));"},
         // Source 3 component, dest 2 component
         {"%float 2D 0 0 0 2 Rg32f", "OpImageWrite %im %vi12 %vf123",
-         R"([[group(2), binding(1)]] var x_20 : texture_storage_2d<rg32float, write>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_storage_2d<rg32float, write>;)",
          "textureStore(x_20, vi12, vec4<f32>(vf123, 0.0));"},
         // Source 4 component, dest 2 component
         {"%float 2D 0 0 0 2 Rg32f", "OpImageWrite %im %vi12 %vf1234",
-         R"([[group(2), binding(1)]] var x_20 : texture_storage_2d<rg32float, write>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_storage_2d<rg32float, write>;)",
          "textureStore(x_20, vi12, vf1234);"},
         // WGSL does not support 3-component storage textures.
         // Source 4 component, dest 4 component
         {"%float 2D 0 0 0 2 Rgba32f", "OpImageWrite %im %vi12 %vf1234",
-         "[[group(2), binding(1)]] var x_20 : "
+         "@group(2) @binding(1) var x_20 : "
          "texture_storage_2d<rgba32float, write>;",
          "textureStore(x_20, vi12, vf1234);"}}));
 
@@ -2617,11 +2613,11 @@
     ::testing::ValuesIn(std::vector<ImageAccessCase>{
         // Sampled type is unsigned int, texel is unsigned int
         {"%uint 2D 0 0 0 2 Rgba32ui", "OpImageWrite %im %vi12 %vu1234",
-         R"([[group(2), binding(1)]] var x_20 : texture_storage_2d<rgba32uint, write>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_storage_2d<rgba32uint, write>;)",
          R"(textureStore(x_20, vi12, vu1234))"},
         // Sampled type is signed int, texel is signed int
         {"%int 2D 0 0 0 2 Rgba32i", "OpImageWrite %im %vi12 %vi1234",
-         R"([[group(2), binding(1)]] var x_20 : texture_storage_2d<rgba32sint, write>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_storage_2d<rgba32sint, write>;)",
          R"(textureStore(x_20, vi12, vi1234))"}}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -2635,25 +2631,25 @@
          "invalid texel type for storage texture write: component must be "
          "float, signed integer, or unsigned integer to match the texture "
          "channel type: OpImageWrite",
-         R"([[group(2), binding(1)]] var x_20 : texture_storage_2d<rgba32float, write>;)"},
+         R"(@group(2) @binding(1) var x_20 : texture_storage_2d<rgba32float, write>;)"},
         // Sampled type is float, texel is unsigned int
         {"%int 2D 0 0 0 2 Rgba32f", "OpImageWrite %im %vi12 %vu1234",
          "invalid texel type for storage texture write: component must be "
          "float, signed integer, or unsigned integer to match the texture "
          "channel type: OpImageWrite",
-         R"([[group(2), binding(1)]] var x_20 : texture_storage_2d<rgba32float, write>;)"},
+         R"(@group(2) @binding(1) var x_20 : texture_storage_2d<rgba32float, write>;)"},
         // Sampled type is unsigned int, texel is float
         {"%uint 2D 0 0 0 2 Rgba32ui", "OpImageWrite %im %vi12 %vf1234",
          "invalid texel type for storage texture write: component must be "
          "float, signed integer, or unsigned integer to match the texture "
          "channel type: OpImageWrite",
-         R"([[group(2), binding(1)]] var x_20 : texture_storage_2d<rgba32uint, write>;)"},
+         R"(@group(2) @binding(1) var x_20 : texture_storage_2d<rgba32uint, write>;)"},
         // Sampled type is signed int, texel is float
         {"%int 2D 0 0 0 2 Rgba32i", "OpImageWrite %im %vi12 %vf1234",
          "invalid texel type for storage texture write: component must be "
          "float, signed integer, or unsigned integer to match the texture "
          "channel type: OpImageWrite",
-         R"([[group(2), binding(1)]] var x_20 : texture_storage_2d<rgba32sint, write>;
+         R"(@group(2) @binding(1) var x_20 : texture_storage_2d<rgba32sint, write>;
   })"}}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -2667,13 +2663,13 @@
          "invalid texel type for storage texture write: component must be "
          "float, signed integer, or unsigned integer to match the texture "
          "channel type: OpImageWrite",
-         R"([[group(2), binding(1)]] var x_20 : texture_storage_2d<rgba32uint, write>;)"},
+         R"(@group(2) @binding(1) var x_20 : texture_storage_2d<rgba32uint, write>;)"},
         // Sampled type is signed int, texel is unsigned int
         {"%int 2D 0 0 0 2 Rgba32i", "OpImageWrite %im %vi12 %vu1234",
          "invalid texel type for storage texture write: component must be "
          "float, signed integer, or unsigned integer to match the texture "
          "channel type: OpImageWrite",
-         R"([[group(2), binding(1)]] var x_20 : texture_storage_2d<rgba32sint, write>;
+         R"(@group(2) @binding(1) var x_20 : texture_storage_2d<rgba32sint, write>;
   })"}}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -2684,11 +2680,11 @@
     ::testing::ValuesIn(std::vector<ImageAccessCase>{
         // Source unsigned, dest unsigned
         {"%uint 2D 0 0 0 2 R32ui", "OpImageWrite %im %vi12 %vu12",
-         R"([[group(2), binding(1)]] var x_20 : texture_storage_2d<r32uint, write>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_storage_2d<r32uint, write>;)",
          R"(textureStore(x_20, vi12, vec4<u32>(vu12, 0u, 0u)))"},
         // Source signed, dest signed
         {"%int 2D 0 0 0 2 R32i", "OpImageWrite %im %vi12 %vi12",
-         R"([[group(2), binding(1)]] var x_20 : texture_storage_2d<r32sint, write>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_storage_2d<r32sint, write>;)",
          R"(textureStore(x_20, vi12, vec4<i32>(vi12, 0, 0)))"}}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -2698,22 +2694,22 @@
         // OpImageFetch with no extra params, on sampled texture
         // Level of detail is injected for sampled texture
         {"%float 2D 0 0 0 1 Unknown", "%99 = OpImageFetch %v4float %im %vi12",
-         R"([[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
          R"(let x_99 : vec4<f32> = textureLoad(x_20, vi12, 0);)"},
         // OpImageFetch with explicit level, on sampled texture
         {"%float 2D 0 0 0 1 Unknown",
          "%99 = OpImageFetch %v4float %im %vi12 Lod %int_3",
-         R"([[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
          R"(let x_99 : vec4<f32> = textureLoad(x_20, vi12, 3);)"},
         // OpImageFetch with no extra params, on depth texture
         // Level of detail is injected for depth texture
         {"%float 2D 1 0 0 1 Unknown", "%99 = OpImageFetch %v4float %im %vi12",
-         R"([[group(2), binding(1)]] var x_20 : texture_depth_2d;)",
+         R"(@group(2) @binding(1) var x_20 : texture_depth_2d;)",
          R"(let x_99 : vec4<f32> = vec4<f32>(textureLoad(x_20, vi12, 0), 0.0, 0.0, 0.0);)"},
         // OpImageFetch with extra params, on depth texture
         {"%float 2D 1 0 0 1 Unknown",
          "%99 = OpImageFetch %v4float %im %vi12 Lod %int_3",
-         R"([[group(2), binding(1)]] var x_20 : texture_depth_2d;)",
+         R"(@group(2) @binding(1) var x_20 : texture_depth_2d;)",
          R"(let x_99 : vec4<f32> = vec4<f32>(textureLoad(x_20, vi12, 3), 0.0, 0.0, 0.0);)"}}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -2726,7 +2722,7 @@
     ::testing::ValuesIn(std::vector<ImageAccessCase>{
         // ImageFetch on depth image.
         {"%float 2D 1 0 0 1 Unknown", "%99 = OpImageFetch %v4float %im %vi12 ",
-         R"([[group(2), binding(1)]] var x_20 : texture_depth_2d;)",
+         R"(@group(2) @binding(1) var x_20 : texture_depth_2d;)",
          R"(let x_99 : vec4<f32> = vec4<f32>(textureLoad(x_20, vi12, 0), 0.0, 0.0, 0.0);)"}}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -2740,7 +2736,7 @@
         // ImageFetch on multisampled depth image.
         {"%float 2D 1 0 1 1 Unknown",
          "%99 = OpImageFetch %v4float %im %vi12 Sample %i1",
-         R"([[group(2), binding(1)]] var x_20 : texture_depth_multisampled_2d;)",
+         R"(@group(2) @binding(1) var x_20 : texture_depth_multisampled_2d;)",
          R"(let x_99 : vec4<f32> = vec4<f32>(textureLoad(x_20, vi12, i1), 0.0, 0.0, 0.0);)"}}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -2756,7 +2752,7 @@
         // ImageFetch non-arrayed
         {"%float 2D 0 0 1 1 Unknown",
          "%99 = OpImageFetch %v4float %im %vi12 Sample %i1",
-         R"([[group(2), binding(1)]] var x_20 : texture_multisampled_2d<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_multisampled_2d<f32>;)",
          R"(let x_99 : vec4<f32> = textureLoad(x_20, vi12, i1);)"}}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -2765,7 +2761,7 @@
     ::testing::ValuesIn(std::vector<ImageAccessCase>{
         {"%float 2D 0 0 1 1 Unknown",
          "%99 = OpImageFetch %v4float %im %vi12 Sample %u1",
-         R"([[group(2), binding(1)]] var x_20 : texture_multisampled_2d<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_multisampled_2d<f32>;)",
          R"(let x_99 : vec4<f32> = textureLoad(x_20, vi12, i32(u1));)"}}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -2788,11 +2784,11 @@
 
         // OpImageFetch requires no conversion, float -> v4float
         {"%float 2D 0 0 0 1 Unknown", "%99 = OpImageFetch %v4float %im %vi12",
-         R"([[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
          R"(let x_99 : vec4<f32> = textureLoad(x_20, vi12, 0);)"},
         // OpImageFetch requires no conversion, uint -> v4uint
         {"%uint 2D 0 0 0 1 Unknown", "%99 = OpImageFetch %v4uint %im %vi12",
-         R"([[group(2), binding(1)]] var x_20 : texture_2d<u32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_2d<u32>;)",
          R"(let x_99 : vec4<u32> = textureLoad(x_20, vi12, 0);)"},
         // OpImageFetch requires conversion, uint -> v4int
         // is invalid SPIR-V:
@@ -2801,7 +2797,7 @@
 
         // OpImageFetch requires no conversion, int -> v4int
         {"%int 2D 0 0 0 1 Unknown", "%99 = OpImageFetch %v4int %im %vi12",
-         R"([[group(2), binding(1)]] var x_20 : texture_2d<i32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_2d<i32>;)",
          R"(let x_99 : vec4<i32> = textureLoad(x_20, vi12, 0);)"},
         // OpImageFetch requires conversion, int -> v4uint
         // is invalid SPIR-V:
@@ -2814,11 +2810,11 @@
 
         // OpImageRead requires no conversion, float -> v4float
         {"%float 2D 0 0 0 2 Rgba32f", "%99 = OpImageRead %v4float %im %vi12",
-         R"([[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
          R"(let x_99 : vec4<f32> = textureLoad(x_20, vi12, 0);)"},
         // OpImageRead requires no conversion, uint -> v4uint
         {"%uint 2D 0 0 0 2 Rgba32ui", "%99 = OpImageRead %v4uint %im %vi12",
-         R"([[group(2), binding(1)]] var x_20 : texture_2d<u32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_2d<u32>;)",
          R"(let x_99 : vec4<u32> = textureLoad(x_20, vi12, 0);)"},
 
         // OpImageRead requires conversion, uint -> v4int
@@ -2828,7 +2824,7 @@
 
         // OpImageRead requires no conversion, int -> v4int
         {"%int 2D 0 0 0 2 Rgba32i", "%99 = OpImageRead %v4int %im %vi12",
-         R"([[group(2), binding(1)]] var x_20 : texture_2d<i32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_2d<i32>;)",
          R"(let x_99 : vec4<i32> = textureLoad(x_20, vi12, 0);)"},
 
         // OpImageRead requires conversion, int -> v4uint
@@ -2845,9 +2841,9 @@
         // OpImageSampleImplicitLod requires no conversion, float -> v4float
         {"%float 2D 0 0 0 1 Unknown",
          "%99 = OpImageSampleImplicitLod %v4float %sampled_image %vf12",
-         R"([[group(0), binding(0)]] var x_10 : sampler;
+         R"(@group(0) @binding(0) var x_10 : sampler;
 
-[[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
          R"(let x_99 : vec4<f32> = textureSample(x_20, x_10, vf12);)"}}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -2862,26 +2858,26 @@
          "%99 = OpImageQuerySize %int %im \n"
          "%98 = OpImageRead %v4float %im %i1\n",  // Implicitly mark as
                                                   // NonWritable
-         R"([[group(2), binding(1)]] var x_20 : texture_1d<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_1d<f32>;)",
          R"(let x_99 : i32 = i32(textureDimensions(x_20));)"},
         // 2D storage image
         {"%float 2D 0 0 0 2 Rgba32f",
          "%99 = OpImageQuerySize %v2int %im \n"
          "%98 = OpImageRead %v4float %im %vi12\n",  // Implicitly mark as
                                                     // NonWritable
-         R"([[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
          R"(let x_99 : vec2<i32> = vec2<i32>(textureDimensions(x_20))"},
         // 3D storage image
         {"%float 3D 0 0 0 2 Rgba32f",
          "%99 = OpImageQuerySize %v3int %im \n"
          "%98 = OpImageRead %v4float %im %vi123\n",  // Implicitly mark as
                                                      // NonWritable
-         R"([[group(2), binding(1)]] var x_20 : texture_3d<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_3d<f32>;)",
          R"(let x_99 : vec3<i32> = vec3<i32>(textureDimensions(x_20));)"},
 
         // Multisampled
         {"%float 2D 0 0 1 1 Unknown", "%99 = OpImageQuerySize %v2int %im \n",
-         R"([[group(2), binding(1)]] var x_20 : texture_multisampled_2d<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_multisampled_2d<f32>;)",
          R"(let x_99 : vec2<i32> = vec2<i32>(textureDimensions(x_20));)"}}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -2897,7 +2893,7 @@
         {"%float 2D 0 1 0 2 Rgba32f",
          "%99 = OpImageQuerySize %v3int %im \n"
          "%98 = OpImageRead %v4float %im %vi123\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_2d_array<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_2d_array<f32>;)",
          R"(let x_99 : vec3<i32> = vec3<i32>(textureDimensions(x_20), textureNumLayers(x_20));)"}
         // 3D array storage image doesn't exist.
 
@@ -2914,37 +2910,37 @@
         // 1D
         {"%float 1D 0 0 0 1 Unknown",
          "%99 = OpImageQuerySizeLod %int %im %i1\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_1d<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_1d<f32>;)",
          R"(let x_99 : i32 = i32(textureDimensions(x_20, i1)))"},
 
         // 2D
         {"%float 2D 0 0 0 1 Unknown",
          "%99 = OpImageQuerySizeLod %v2int %im %i1\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
          R"(let x_99 : vec2<i32> = vec2<i32>(textureDimensions(x_20, i1));)"},
 
         // 3D
         {"%float 3D 0 0 0 1 Unknown",
          "%99 = OpImageQuerySizeLod %v3int %im %i1\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_3d<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_3d<f32>;)",
          R"(let x_99 : vec3<i32> = vec3<i32>(textureDimensions(x_20, i1));)"},
 
         // Cube
         {"%float Cube 0 0 0 1 Unknown",
          "%99 = OpImageQuerySizeLod %v2int %im %i1\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_cube<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_cube<f32>;)",
          R"(let x_99 : vec2<i32> = vec2<i32>(textureDimensions(x_20, i1).xy);)"},
 
         // Depth 2D
         {"%float 2D 1 0 0 1 Unknown",
          "%99 = OpImageQuerySizeLod %v2int %im %i1\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_depth_2d;)",
+         R"(@group(2) @binding(1) var x_20 : texture_depth_2d;)",
          R"(let x_99 : vec2<i32> = vec2<i32>(textureDimensions(x_20, i1));)"},
 
         // Depth Cube
         {"%float Cube 1 0 0 1 Unknown",
          "%99 = OpImageQuerySizeLod %v2int %im %i1\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_depth_cube;)",
+         R"(@group(2) @binding(1) var x_20 : texture_depth_cube;)",
          R"(let x_99 : vec2<i32> = vec2<i32>(textureDimensions(x_20, i1).xy);)"}}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -2960,7 +2956,7 @@
         // 2D array
         {"%float 2D 0 1 0 1 Unknown",
          "%99 = OpImageQuerySizeLod %v3int %im %i1\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_2d_array<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_2d_array<f32>;)",
          R"(let x_99 : vec3<i32> = vec3<i32>(textureDimensions(x_20, i1), textureNumLayers(x_20));)"},
 
         // There is no 3D array
@@ -2972,13 +2968,13 @@
         // https://github.com/gpuweb/gpuweb/issues/1345
         {"%float Cube 0 1 0 1 Unknown",
          "%99 = OpImageQuerySizeLod %v3int %im %i1\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_cube_array<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_cube_array<f32>;)",
          R"(let x_99 : vec3<i32> = vec3<i32>(textureDimensions(x_20, i1).xy, textureNumLayers(x_20));)"},
 
         // Depth 2D array
         {"%float 2D 1 1 0 1 Unknown",
          "%99 = OpImageQuerySizeLod %v3int %im %i1\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_depth_2d_array;)",
+         R"(@group(2) @binding(1) var x_20 : texture_depth_2d_array;)",
          R"(let x_99 : vec3<i32> = vec3<i32>(textureDimensions(x_20, i1), textureNumLayers(x_20));)"},
 
         // Depth Cube Array
@@ -2988,7 +2984,7 @@
         // https://github.com/gpuweb/gpuweb/issues/1345
         {"%float Cube 1 1 0 1 Unknown",
          "%99 = OpImageQuerySizeLod %v3int %im %i1\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_depth_cube_array;)",
+         R"(@group(2) @binding(1) var x_20 : texture_depth_cube_array;)",
          R"(let x_99 : vec3<i32> = vec3<i32>(textureDimensions(x_20, i1).xy, textureNumLayers(x_20));)"}}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -3001,7 +2997,7 @@
 
         {"%float 1D 0 0 0 1 Unknown",
          "%99 = OpImageQuerySizeLod %int %im %u1\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_1d<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_1d<f32>;)",
          R"(let x_99 : i32 = i32(textureDimensions(x_20, i32(u1)));)"}}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -3015,7 +3011,7 @@
 
         {"%float 1D 0 0 0 1 Unknown",
          "%99 = OpImageQuerySizeLod %uint %im %i1\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_1d<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_1d<f32>;)",
          R"(let x_99 : u32 = u32(textureDimensions(x_20, i1));)"}}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -3029,47 +3025,47 @@
 
         // 2D
         {"%float 2D 0 0 0 1 Unknown", "%99 = OpImageQueryLevels %int %im\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
          R"(let x_99 : i32 = textureNumLevels(x_20);)"},
 
         // 2D array
         {"%float 2D 0 1 0 1 Unknown", "%99 = OpImageQueryLevels %int %im\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_2d_array<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_2d_array<f32>;)",
          R"(let x_99 : i32 = textureNumLevels(x_20);)"},
 
         // 3D
         {"%float 3D 0 0 0 1 Unknown", "%99 = OpImageQueryLevels %int %im\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_3d<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_3d<f32>;)",
          R"(let x_99 : i32 = textureNumLevels(x_20);)"},
 
         // Cube
         {"%float Cube 0 0 0 1 Unknown", "%99 = OpImageQueryLevels %int %im\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_cube<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_cube<f32>;)",
          R"(let x_99 : i32 = textureNumLevels(x_20);)"},
 
         // Cube array
         {"%float Cube 0 1 0 1 Unknown", "%99 = OpImageQueryLevels %int %im\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_cube_array<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_cube_array<f32>;)",
          R"(let x_99 : i32 = textureNumLevels(x_20);)"},
 
         // depth 2d
         {"%float 2D 1 0 0 1 Unknown", "%99 = OpImageQueryLevels %int %im\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_depth_2d;)",
+         R"(@group(2) @binding(1) var x_20 : texture_depth_2d;)",
          R"(let x_99 : i32 = textureNumLevels(x_20);)"},
 
         // depth 2d array
         {"%float 2D 1 1 0 1 Unknown", "%99 = OpImageQueryLevels %int %im\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_depth_2d_array;)",
+         R"(@group(2) @binding(1) var x_20 : texture_depth_2d_array;)",
          R"(let x_99 : i32 = textureNumLevels(x_20);)"},
 
         // depth cube
         {"%float Cube 1 0 0 1 Unknown", "%99 = OpImageQueryLevels %int %im\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_depth_cube;)",
+         R"(@group(2) @binding(1) var x_20 : texture_depth_cube;)",
          R"(let x_99 : i32 = textureNumLevels(x_20);)"},
 
         // depth cube array
         {"%float Cube 1 1 0 1 Unknown", "%99 = OpImageQueryLevels %int %im\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_depth_cube_array;)",
+         R"(@group(2) @binding(1) var x_20 : texture_depth_cube_array;)",
          R"(let x_99 : i32 = textureNumLevels(x_20);)"}}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -3079,7 +3075,7 @@
     SpvParserHandleTest_SampledImageAccessTest,
     ::testing::ValuesIn(std::vector<ImageAccessCase>{
         {"%float 2D 0 0 0 1 Unknown", "%99 = OpImageQueryLevels %uint %im\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_2d<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_2d<f32>;)",
          R"(let x_99 : u32 = u32(textureNumLevels(x_20));)"}}));
 
 INSTANTIATE_TEST_SUITE_P(
@@ -3088,7 +3084,7 @@
     ::testing::ValuesIn(std::vector<ImageAccessCase>{
         // Multsample 2D
         {"%float 2D 0 0 1 1 Unknown", "%99 = OpImageQuerySamples %int %im\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_multisampled_2d<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_multisampled_2d<f32>;)",
          R"(let x_99 : i32 = textureNumSamples(x_20);)"}  // namespace
 
         // Multisample 2D array
@@ -3102,7 +3098,7 @@
     ::testing::ValuesIn(std::vector<ImageAccessCase>{
         // Multsample 2D
         {"%float 2D 0 0 1 1 Unknown", "%99 = OpImageQuerySamples %uint %im\n",
-         R"([[group(2), binding(1)]] var x_20 : texture_multisampled_2d<f32>;)",
+         R"(@group(2) @binding(1) var x_20 : texture_multisampled_2d<f32>;)",
          R"(let x_99 : u32 = u32(textureNumSamples(x_20));)"}
 
         // Multisample 2D array
diff --git a/src/reader/spirv/parser_impl_module_var_test.cc b/src/reader/spirv/parser_impl_module_var_test.cc
index 4c7ab3a..31007f3 100644
--- a/src/reader/spirv/parser_impl_module_var_test.cc
+++ b/src/reader/spirv/parser_impl_module_var_test.cc
@@ -471,11 +471,11 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main() -> main_out {
   main_1();
   return main_out(gl_Position);
@@ -531,11 +531,11 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main() -> main_out {
   main_1();
   return main_out(gl_Position);
@@ -590,11 +590,11 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main() -> main_out {
   main_1();
   return main_out(gl_Position);
@@ -649,11 +649,11 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   x_2_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main() -> main_out {
   main_1();
   return main_out(x_2);
@@ -707,11 +707,11 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   x_2_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main() -> main_out {
   main_1();
   return main_out(x_2);
@@ -765,11 +765,11 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   x_2_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main() -> main_out {
   main_1();
   return main_out(x_2);
@@ -801,11 +801,11 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   x_2_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main() -> main_out {
   main_1();
   return main_out(x_2);
@@ -1298,7 +1298,7 @@
   const auto module_str = test::ToString(p->program());
   EXPECT_THAT(
       module_str,
-      HasSubstr("[[group(3), binding(9)]] var<storage, read_write> x_1 : S;"))
+      HasSubstr("@group(3) @binding(9) var<storage, read_write> x_1 : S;"))
       << module_str;
 }
 
@@ -1349,7 +1349,7 @@
   const auto module_str = test::ToString(p->program());
   EXPECT_THAT(
       module_str,
-      HasSubstr("[[group(0), binding(3)]] var<storage, read_write> x_1 : S;"))
+      HasSubstr("@group(0) @binding(3) var<storage, read_write> x_1 : S;"))
       << module_str;
 }
 
@@ -1399,7 +1399,7 @@
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
   EXPECT_TRUE(p->error().empty());
   const auto module_str = test::ToString(p->program());
-  EXPECT_THAT(module_str, HasSubstr(R"(type Arr = [[stride(4)]] array<u32, 2u>;
+  EXPECT_THAT(module_str, HasSubstr(R"(type Arr = @stride(4) array<u32, 2u>;
 
 struct S {
   field0 : u32;
@@ -1407,7 +1407,7 @@
   field2 : Arr;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> x_1 : S;
+@group(0) @binding(0) var<storage, read_write> x_1 : S;
 )")) << module_str;
 }
 
@@ -1437,7 +1437,7 @@
   field0 : mat3x2<f32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> myvar : S;
+@group(0) @binding(0) var<storage, read_write> myvar : S;
 )")) << module_str;
 }
 
@@ -1466,7 +1466,7 @@
   field0 : mat3x2<f32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> myvar : S;
+@group(0) @binding(0) var<storage, read_write> myvar : S;
 )")) << module_str;
 }
 
@@ -1492,11 +1492,11 @@
   EXPECT_TRUE(p->error().empty());
   const auto module_str = test::ToString(p->program());
   EXPECT_THAT(module_str, HasSubstr(R"(struct S {
-  [[stride(64), internal(disable_validation__ignore_stride)]]
+  @stride(64) @internal(disable_validation__ignore_stride)
   field0 : mat3x2<f32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> myvar : S;
+@group(0) @binding(0) var<storage, read_write> myvar : S;
 )")) << module_str;
 }
 
@@ -1549,7 +1549,7 @@
   field1 : f32;
 }
 
-[[group(0), binding(0)]] var<storage, read> x_1 : S;
+@group(0) @binding(0) var<storage, read> x_1 : S;
 )")) << module_str;
 }
 
@@ -1578,7 +1578,7 @@
   field1 : f32;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> x_1 : S;
+@group(0) @binding(0) var<storage, read_write> x_1 : S;
 )")) << module_str;
 }
 
@@ -1610,7 +1610,7 @@
   field1 : f32;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> x_1 : S;
+@group(0) @binding(0) var<storage, read_write> x_1 : S;
 )")) << module_str;
 }
 
@@ -1655,8 +1655,7 @@
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
   EXPECT_TRUE(p->error().empty());
   const auto module_str = test::ToString(p->program());
-  EXPECT_THAT(module_str,
-              HasSubstr("[[override(12)]] let myconst : bool = true;"))
+  EXPECT_THAT(module_str, HasSubstr("@override(12) let myconst : bool = true;"))
       << module_str;
 }
 
@@ -1673,7 +1672,7 @@
   EXPECT_TRUE(p->error().empty());
   const auto module_str = test::ToString(p->program());
   EXPECT_THAT(module_str,
-              HasSubstr("[[override(12)]] let myconst : bool = false;"))
+              HasSubstr("@override(12) let myconst : bool = false;"))
       << module_str;
 }
 
@@ -1689,8 +1688,7 @@
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
   EXPECT_TRUE(p->error().empty());
   const auto module_str = test::ToString(p->program());
-  EXPECT_THAT(module_str,
-              HasSubstr("[[override(12)]] let myconst : u32 = 42u;"))
+  EXPECT_THAT(module_str, HasSubstr("@override(12) let myconst : u32 = 42u;"))
       << module_str;
 }
 
@@ -1706,7 +1704,7 @@
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
   EXPECT_TRUE(p->error().empty());
   const auto module_str = test::ToString(p->program());
-  EXPECT_THAT(module_str, HasSubstr("[[override(12)]] let myconst : i32 = 42;"))
+  EXPECT_THAT(module_str, HasSubstr("@override(12) let myconst : i32 = 42;"))
       << module_str;
 }
 
@@ -1722,8 +1720,7 @@
   ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
   EXPECT_TRUE(p->error().empty());
   const auto module_str = test::ToString(p->program());
-  EXPECT_THAT(module_str,
-              HasSubstr("[[override(12)]] let myconst : f32 = 2.5;"))
+  EXPECT_THAT(module_str, HasSubstr("@override(12) let myconst : f32 = 2.5;"))
       << module_str;
 }
 
@@ -1810,8 +1807,8 @@
   return;
 }
 
-[[stage(fragment)]]
-fn main([[builtin(sample_index)]] x_1_param : u32) {
+@stage(fragment)
+fn main(@builtin(sample_index) x_1_param : u32) {
   x_1 = bitcast<i32>(x_1_param);
   main_1();
 }
@@ -1923,8 +1920,8 @@
   return;
 }
 
-[[stage(fragment)]]
-fn main([[builtin(sample_index)]] x_1_param : u32) {
+@stage(fragment)
+fn main(@builtin(sample_index) x_1_param : u32) {
   x_1 = bitcast<i32>(x_1_param);
   main_1();
 }
@@ -1977,8 +1974,8 @@
   return;
 }
 
-[[stage(fragment)]]
-fn main([[builtin(sample_index)]] x_1_param : u32) {
+@stage(fragment)
+fn main(@builtin(sample_index) x_1_param : u32) {
   x_1 = x_1_param;
   main_1();
 }
@@ -2007,8 +2004,8 @@
   return;
 }
 
-[[stage(fragment)]]
-fn main([[builtin(sample_index)]] x_1_param : u32) {
+@stage(fragment)
+fn main(@builtin(sample_index) x_1_param : u32) {
   x_1 = x_1_param;
   main_1();
 }
@@ -2036,8 +2033,8 @@
   return;
 }
 
-[[stage(fragment)]]
-fn main([[builtin(sample_index)]] x_1_param : u32) {
+@stage(fragment)
+fn main(@builtin(sample_index) x_1_param : u32) {
   x_1 = x_1_param;
   main_1();
 }
@@ -2152,8 +2149,8 @@
   return;
 }
 
-[[stage(fragment)]]
-fn main([[builtin(sample_mask)]] x_1_param : u32) {
+@stage(fragment)
+fn main(@builtin(sample_mask) x_1_param : u32) {
   x_1[0] = x_1_param;
   main_1();
 }
@@ -2184,8 +2181,8 @@
   return;
 }
 
-[[stage(fragment)]]
-fn main([[builtin(sample_mask)]] x_1_param : u32) {
+@stage(fragment)
+fn main(@builtin(sample_mask) x_1_param : u32) {
   x_1[0] = x_1_param;
   main_1();
 }
@@ -2216,8 +2213,8 @@
   return;
 }
 
-[[stage(fragment)]]
-fn main([[builtin(sample_mask)]] x_1_param : u32) {
+@stage(fragment)
+fn main(@builtin(sample_mask) x_1_param : u32) {
   x_1[0] = x_1_param;
   main_1();
 }
@@ -2247,8 +2244,8 @@
   return;
 }
 
-[[stage(fragment)]]
-fn main([[builtin(sample_mask)]] x_1_param : u32) {
+@stage(fragment)
+fn main(@builtin(sample_mask) x_1_param : u32) {
   x_1[0] = bitcast<i32>(x_1_param);
   main_1();
 }
@@ -2279,8 +2276,8 @@
   return;
 }
 
-[[stage(fragment)]]
-fn main([[builtin(sample_mask)]] x_1_param : u32) {
+@stage(fragment)
+fn main(@builtin(sample_mask) x_1_param : u32) {
   x_1[0] = bitcast<i32>(x_1_param);
   main_1();
 }
@@ -2311,8 +2308,8 @@
   return;
 }
 
-[[stage(fragment)]]
-fn main([[builtin(sample_mask)]] x_1_param : u32) {
+@stage(fragment)
+fn main(@builtin(sample_mask) x_1_param : u32) {
   x_1[0] = bitcast<i32>(x_1_param);
   main_1();
 }
@@ -2362,11 +2359,11 @@
 }
 
 struct main_out {
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   x_1_1 : u32;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_1[0]);
@@ -2399,11 +2396,11 @@
 }
 
 struct main_out {
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   x_1_1 : u32;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_1[0]);
@@ -2436,11 +2433,11 @@
 }
 
 struct main_out {
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   x_1_1 : u32;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_1[0]);
@@ -2472,11 +2469,11 @@
 }
 
 struct main_out {
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   x_1_1 : u32;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(bitcast<u32>(x_1[0]));
@@ -2509,11 +2506,11 @@
 }
 
 struct main_out {
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   x_1_1 : u32;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(bitcast<u32>(x_1[0]));
@@ -2546,11 +2543,11 @@
 }
 
 struct main_out {
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   x_1_1 : u32;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(bitcast<u32>(x_1[0]));
@@ -2574,13 +2571,13 @@
   ASSERT_TRUE(p->BuildAndParseInternalModule()) << p->error() << assembly;
   EXPECT_TRUE(p->error().empty());
   const auto module_str = test::ToString(p->program());
-  const std::string expected = R"(type Arr = [[stride(4)]] array<u32, 1u>;
+  const std::string expected = R"(type Arr = @stride(4) array<u32, 1u>;
 
-type Arr_1 = [[stride(4)]] array<u32, 2u>;
+type Arr_1 = @stride(4) array<u32, 2u>;
 
-type Arr_2 = [[stride(4)]] array<i32, 1u>;
+type Arr_2 = @stride(4) array<i32, 1u>;
 
-type Arr_3 = [[stride(4)]] array<i32, 2u>;
+type Arr_3 = @stride(4) array<i32, 2u>;
 
 var<private> x_1 : Arr;
 
@@ -2589,8 +2586,8 @@
   return;
 }
 
-[[stage(fragment)]]
-fn main([[builtin(sample_mask)]] x_1_param : u32) {
+@stage(fragment)
+fn main(@builtin(sample_mask) x_1_param : u32) {
   x_1[0] = x_1_param;
   main_1();
 }
@@ -2613,13 +2610,13 @@
   ASSERT_TRUE(p->BuildAndParseInternalModule()) << p->error() << assembly;
   EXPECT_TRUE(p->error().empty());
   const auto module_str = test::ToString(p->program());
-  const std::string expected = R"(type Arr = [[stride(4)]] array<u32, 1u>;
+  const std::string expected = R"(type Arr = @stride(4) array<u32, 1u>;
 
-type Arr_1 = [[stride(4)]] array<u32, 2u>;
+type Arr_1 = @stride(4) array<u32, 2u>;
 
-type Arr_2 = [[stride(4)]] array<i32, 1u>;
+type Arr_2 = @stride(4) array<i32, 1u>;
 
-type Arr_3 = [[stride(4)]] array<i32, 2u>;
+type Arr_3 = @stride(4) array<i32, 2u>;
 
 var<private> x_1 : Arr;
 
@@ -2629,11 +2626,11 @@
 }
 
 struct main_out {
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   x_1_1 : u32;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_1[0]);
@@ -2687,12 +2684,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   x_4_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main([[builtin(vertex_index)]] x_1_param : u32) -> main_out {
+@stage(vertex)
+fn main(@builtin(vertex_index) x_1_param : u32) -> main_out {
   x_1 = bitcast<i32>(x_1_param);
   main_1();
   return main_out(x_4);
@@ -2725,12 +2722,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   x_4_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main([[builtin(vertex_index)]] x_1_param : u32) -> main_out {
+@stage(vertex)
+fn main(@builtin(vertex_index) x_1_param : u32) -> main_out {
   x_1 = bitcast<i32>(x_1_param);
   main_1();
   return main_out(x_4);
@@ -2762,12 +2759,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   x_4_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main([[builtin(vertex_index)]] x_1_param : u32) -> main_out {
+@stage(vertex)
+fn main(@builtin(vertex_index) x_1_param : u32) -> main_out {
   x_1 = bitcast<i32>(x_1_param);
   main_1();
   return main_out(x_4);
@@ -2798,12 +2795,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   x_4_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main([[builtin(vertex_index)]] x_1_param : u32) -> main_out {
+@stage(vertex)
+fn main(@builtin(vertex_index) x_1_param : u32) -> main_out {
   x_1 = x_1_param;
   main_1();
   return main_out(x_4);
@@ -2836,12 +2833,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   x_4_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main([[builtin(vertex_index)]] x_1_param : u32) -> main_out {
+@stage(vertex)
+fn main(@builtin(vertex_index) x_1_param : u32) -> main_out {
   x_1 = x_1_param;
   main_1();
   return main_out(x_4);
@@ -2873,12 +2870,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   x_4_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main([[builtin(vertex_index)]] x_1_param : u32) -> main_out {
+@stage(vertex)
+fn main(@builtin(vertex_index) x_1_param : u32) -> main_out {
   x_1 = x_1_param;
   main_1();
   return main_out(x_4);
@@ -2958,12 +2955,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   position_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main([[builtin(instance_index)]] x_1_param : u32) -> main_out {
+@stage(vertex)
+fn main(@builtin(instance_index) x_1_param : u32) -> main_out {
   x_1 = bitcast<i32>(x_1_param);
   main_1();
   return main_out(position);
@@ -2996,12 +2993,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   position_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main([[builtin(instance_index)]] x_1_param : u32) -> main_out {
+@stage(vertex)
+fn main(@builtin(instance_index) x_1_param : u32) -> main_out {
   x_1 = bitcast<i32>(x_1_param);
   main_1();
   return main_out(position);
@@ -3033,12 +3030,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   position_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main([[builtin(instance_index)]] x_1_param : u32) -> main_out {
+@stage(vertex)
+fn main(@builtin(instance_index) x_1_param : u32) -> main_out {
   x_1 = bitcast<i32>(x_1_param);
   main_1();
   return main_out(position);
@@ -3093,12 +3090,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   position_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main([[builtin(instance_index)]] x_1_param : u32) -> main_out {
+@stage(vertex)
+fn main(@builtin(instance_index) x_1_param : u32) -> main_out {
   x_1 = x_1_param;
   main_1();
   return main_out(position);
@@ -3131,12 +3128,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   position_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main([[builtin(instance_index)]] x_1_param : u32) -> main_out {
+@stage(vertex)
+fn main(@builtin(instance_index) x_1_param : u32) -> main_out {
   x_1 = x_1_param;
   main_1();
   return main_out(position);
@@ -3168,12 +3165,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   position_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main([[builtin(instance_index)]] x_1_param : u32) -> main_out {
+@stage(vertex)
+fn main(@builtin(instance_index) x_1_param : u32) -> main_out {
   x_1 = x_1_param;
   main_1();
   return main_out(position);
@@ -3318,8 +3315,8 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
-fn main([[builtin(${wgsl_builtin})]] x_1_param : ${unsigned_wgsl_type}) {
+@stage(compute) @workgroup_size(1, 1, 1)
+fn main(@builtin(${wgsl_builtin}) x_1_param : ${unsigned_wgsl_type}) {
   x_1 = ${assignment_value};
   main_1();
 }
@@ -3367,8 +3364,8 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
-fn main([[builtin(${wgsl_builtin})]] x_1_param : ${unsigned_wgsl_type}) {
+@stage(compute) @workgroup_size(1, 1, 1)
+fn main(@builtin(${wgsl_builtin}) x_1_param : ${unsigned_wgsl_type}) {
   x_1 = ${assignment_value};
   main_1();
 }
@@ -3415,8 +3412,8 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
-fn main([[builtin(${wgsl_builtin})]] x_1_param : ${unsigned_wgsl_type}) {
+@stage(compute) @workgroup_size(1, 1, 1)
+fn main(@builtin(${wgsl_builtin}) x_1_param : ${unsigned_wgsl_type}) {
   x_1 = ${assignment_value};
   main_1();
 }
@@ -3730,14 +3727,14 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_2_1 : u32;
-  [[location(6)]]
+  @location(6)
   x_4_1 : u32;
 }
 
-[[stage(fragment)]]
-fn main([[location(0)]] x_1_param : u32, [[location(30)]] x_3_param : u32) -> main_out {
+@stage(fragment)
+fn main(@location(0) x_1_param : u32, @location(30) x_3_param : u32) -> main_out {
   x_1 = x_1_param;
   x_3 = x_3_param;
   main_1();
@@ -3784,12 +3781,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   x_4_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main([[builtin(instance_index)]] x_1_param : u32) -> main_out {
+@stage(vertex)
+fn main(@builtin(instance_index) x_1_param : u32) -> main_out {
   x_1 = x_1_param;
   main_1();
   return main_out(x_4);
@@ -3834,12 +3831,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   x_4_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main([[builtin(instance_index)]] x_1_param : u32) -> main_out {
+@stage(vertex)
+fn main(@builtin(instance_index) x_1_param : u32) -> main_out {
   x_1 = bitcast<i32>(x_1_param);
   main_1();
   return main_out(x_4);
@@ -3879,8 +3876,8 @@
   return;
 }
 
-[[stage(fragment)]]
-fn main([[builtin(sample_mask)]] x_1_param : u32) {
+@stage(fragment)
+fn main(@builtin(sample_mask) x_1_param : u32) {
   x_1[0] = x_1_param;
   main_1();
 }
@@ -3918,8 +3915,8 @@
   return;
 }
 
-[[stage(fragment)]]
-fn main([[builtin(sample_mask)]] x_1_param : u32) {
+@stage(fragment)
+fn main(@builtin(sample_mask) x_1_param : u32) {
   x_1[0] = bitcast<i32>(x_1_param);
   main_1();
 }
@@ -3960,11 +3957,11 @@
 }
 
 struct main_out {
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   x_1_1 : u32;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_1[0]);
@@ -4006,11 +4003,11 @@
 }
 
 struct main_out {
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   x_1_1 : u32;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(bitcast<u32>(x_1[0]));
@@ -4050,11 +4047,11 @@
 }
 
 struct main_out {
-  [[builtin(frag_depth)]]
+  @builtin(frag_depth)
   x_1_1 : f32;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_1);
@@ -4084,11 +4081,11 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main() -> main_out {
   main_1();
   return main_out(gl_Position);
@@ -4154,11 +4151,11 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main() -> main_out {
   main_1();
   return main_out(gl_Position);
@@ -4211,12 +4208,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   x_2_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main([[location(4)]] x_1_param : f32, [[location(5)]] x_1_param_1 : f32, [[location(6)]] x_1_param_2 : f32) -> main_out {
+@stage(vertex)
+fn main(@location(4) x_1_param : f32, @location(5) x_1_param_1 : f32, @location(6) x_1_param_2 : f32) -> main_out {
   x_1[0] = x_1_param;
   x_1[1] = x_1_param_1;
   x_1[2] = x_1_param_2;
@@ -4269,12 +4266,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   x_2_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main([[location(9)]] x_1_param : vec4<f32>, [[location(10)]] x_1_param_1 : vec4<f32>) -> main_out {
+@stage(vertex)
+fn main(@location(9) x_1_param : vec4<f32>, @location(10) x_1_param_1 : vec4<f32>) -> main_out {
   x_1[0] = x_1_param;
   x_1[1] = x_1_param_1;
   main_1();
@@ -4336,12 +4333,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   x_2_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main([[location(9)]] x_1_param : f32, [[location(10)]] x_1_param_1 : vec4<f32>) -> main_out {
+@stage(vertex)
+fn main(@location(9) x_1_param : f32, @location(10) x_1_param_1 : vec4<f32>) -> main_out {
   x_1.alice = x_1_param;
   x_1.bob = x_1_param_1;
   main_1();
@@ -4395,12 +4392,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   x_2_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main([[location(7)]] x_1_param : vec4<f32>, [[location(8)]] x_1_param_1 : vec4<f32>, [[location(9)]] x_1_param_2 : vec4<f32>, [[location(10)]] x_1_param_3 : vec4<f32>) -> main_out {
+@stage(vertex)
+fn main(@location(7) x_1_param : vec4<f32>, @location(8) x_1_param_1 : vec4<f32>, @location(9) x_1_param_2 : vec4<f32>, @location(10) x_1_param_3 : vec4<f32>) -> main_out {
   x_1[0][0] = x_1_param;
   x_1[0][1] = x_1_param_1;
   x_1[1][0] = x_1_param_2;
@@ -4456,17 +4453,17 @@
 }
 
 struct main_out {
-  [[location(4)]]
+  @location(4)
   x_1_1 : f32;
-  [[location(5)]]
+  @location(5)
   x_1_2 : f32;
-  [[location(6)]]
+  @location(6)
   x_1_3 : f32;
-  [[builtin(position)]]
+  @builtin(position)
   x_2_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main() -> main_out {
   main_1();
   return main_out(x_1[0], x_1[1], x_1[2], x_2);
@@ -4517,15 +4514,15 @@
 }
 
 struct main_out {
-  [[location(9)]]
+  @location(9)
   x_1_1 : vec4<f32>;
-  [[location(10)]]
+  @location(10)
   x_1_2 : vec4<f32>;
-  [[builtin(position)]]
+  @builtin(position)
   x_2_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main() -> main_out {
   main_1();
   return main_out(x_1[0], x_1[1], x_2);
@@ -4586,15 +4583,15 @@
 }
 
 struct main_out {
-  [[location(9)]]
+  @location(9)
   x_1_1 : f32;
-  [[location(10)]]
+  @location(10)
   x_1_2 : vec4<f32>;
-  [[builtin(position)]]
+  @builtin(position)
   x_2_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main() -> main_out {
   main_1();
   return main_out(x_1.alice, x_1.bob, x_2);
@@ -4661,16 +4658,16 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   x_2_1 : vec4<f32>;
-  [[location(9)]]
+  @location(9)
   x_3_1 : f32;
-  [[location(11)]]
+  @location(11)
   x_3_2 : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main([[location(9)]] x_1_param : f32, [[location(11)]] x_1_param_1 : vec4<f32>) -> main_out {
+@stage(vertex)
+fn main(@location(9) x_1_param : f32, @location(11) x_1_param_1 : vec4<f32>) -> main_out {
   x_1.alice = x_1_param;
   x_1.bob = x_1_param_1;
   main_1();
@@ -4746,12 +4743,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   x_10_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main([[location(1), interpolate(flat)]] x_1_param : u32, [[location(2), interpolate(flat)]] x_2_param : vec2<u32>, [[location(3), interpolate(flat)]] x_3_param : i32, [[location(4), interpolate(flat)]] x_4_param : vec2<i32>, [[location(5), interpolate(flat)]] x_5_param : f32, [[location(6), interpolate(flat)]] x_6_param : vec2<f32>) -> main_out {
+@stage(vertex)
+fn main(@location(1) @interpolate(flat) x_1_param : u32, @location(2) @interpolate(flat) x_2_param : vec2<u32>, @location(3) @interpolate(flat) x_3_param : i32, @location(4) @interpolate(flat) x_4_param : vec2<i32>, @location(5) @interpolate(flat) x_5_param : f32, @location(6) @interpolate(flat) x_6_param : vec2<f32>) -> main_out {
   x_1 = x_1_param;
   x_2 = x_2_param;
   x_3 = x_3_param;
@@ -4831,23 +4828,23 @@
 }
 
 struct main_out {
-  [[location(1), interpolate(flat)]]
+  @location(1) @interpolate(flat)
   x_1_1 : u32;
-  [[location(2), interpolate(flat)]]
+  @location(2) @interpolate(flat)
   x_2_1 : vec2<u32>;
-  [[location(3), interpolate(flat)]]
+  @location(3) @interpolate(flat)
   x_3_1 : i32;
-  [[location(4), interpolate(flat)]]
+  @location(4) @interpolate(flat)
   x_4_1 : vec2<i32>;
-  [[location(5), interpolate(flat)]]
+  @location(5) @interpolate(flat)
   x_5_1 : f32;
-  [[location(6), interpolate(flat)]]
+  @location(6) @interpolate(flat)
   x_6_1 : vec2<f32>;
-  [[builtin(position)]]
+  @builtin(position)
   x_10_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main() -> main_out {
   main_1();
   return main_out(x_1, x_2, x_3, x_4, x_5, x_6, x_10);
@@ -4899,8 +4896,8 @@
   return;
 }
 
-[[stage(fragment)]]
-fn main([[location(1), interpolate(flat)]] x_1_param : f32, [[location(2), interpolate(flat)]] x_1_param_1 : f32, [[location(5), interpolate(flat)]] x_2_param : f32, [[location(6), interpolate(flat)]] x_2_param_1 : f32) {
+@stage(fragment)
+fn main(@location(1) @interpolate(flat) x_1_param : f32, @location(2) @interpolate(flat) x_1_param_1 : f32, @location(5) @interpolate(flat) x_2_param : f32, @location(6) @interpolate(flat) x_2_param_1 : f32) {
   x_1[0] = x_1_param;
   x_1[1] = x_1_param_1;
   x_2.field0 = x_2_param;
@@ -4975,8 +4972,8 @@
   return;
 }
 
-[[stage(fragment)]]
-fn main([[location(1)]] x_1_param : f32, [[location(2), interpolate(perspective, centroid)]] x_2_param : f32, [[location(3), interpolate(perspective, sample)]] x_3_param : f32, [[location(4), interpolate(linear)]] x_4_param : f32, [[location(5), interpolate(linear, centroid)]] x_5_param : f32, [[location(6), interpolate(linear, sample)]] x_6_param : f32) {
+@stage(fragment)
+fn main(@location(1) x_1_param : f32, @location(2) @interpolate(perspective, centroid) x_2_param : f32, @location(3) @interpolate(perspective, sample) x_3_param : f32, @location(4) @interpolate(linear) x_4_param : f32, @location(5) @interpolate(linear, centroid) x_5_param : f32, @location(6) @interpolate(linear, sample) x_6_param : f32) {
   x_1 = x_1_param;
   x_2 = x_2_param;
   x_3 = x_3_param;
@@ -5043,8 +5040,8 @@
   return;
 }
 
-[[stage(fragment)]]
-fn main([[location(1)]] x_1_param : f32, [[location(2), interpolate(perspective, centroid)]] x_1_param_1 : f32, [[location(3), interpolate(perspective, sample)]] x_1_param_2 : f32, [[location(4), interpolate(linear)]] x_1_param_3 : f32, [[location(5), interpolate(linear, centroid)]] x_1_param_4 : f32, [[location(6), interpolate(linear, sample)]] x_1_param_5 : f32) {
+@stage(fragment)
+fn main(@location(1) x_1_param : f32, @location(2) @interpolate(perspective, centroid) x_1_param_1 : f32, @location(3) @interpolate(perspective, sample) x_1_param_2 : f32, @location(4) @interpolate(linear) x_1_param_3 : f32, @location(5) @interpolate(linear, centroid) x_1_param_4 : f32, @location(6) @interpolate(linear, sample) x_1_param_5 : f32) {
   x_1.field0 = x_1_param;
   x_1.field1 = x_1_param_1;
   x_1.field2 = x_1_param_2;
@@ -5122,21 +5119,21 @@
 }
 
 struct main_out {
-  [[location(1)]]
+  @location(1)
   x_1_1 : f32;
-  [[location(2), interpolate(perspective, centroid)]]
+  @location(2) @interpolate(perspective, centroid)
   x_2_1 : f32;
-  [[location(3), interpolate(perspective, sample)]]
+  @location(3) @interpolate(perspective, sample)
   x_3_1 : f32;
-  [[location(4), interpolate(linear)]]
+  @location(4) @interpolate(linear)
   x_4_1 : f32;
-  [[location(5), interpolate(linear, centroid)]]
+  @location(5) @interpolate(linear, centroid)
   x_5_1 : f32;
-  [[location(6), interpolate(linear, sample)]]
+  @location(6) @interpolate(linear, sample)
   x_6_1 : f32;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_1, x_2, x_3, x_4, x_5, x_6);
@@ -5201,21 +5198,21 @@
 }
 
 struct main_out {
-  [[location(1)]]
+  @location(1)
   x_1_1 : f32;
-  [[location(2), interpolate(perspective, centroid)]]
+  @location(2) @interpolate(perspective, centroid)
   x_1_2 : f32;
-  [[location(3), interpolate(perspective, sample)]]
+  @location(3) @interpolate(perspective, sample)
   x_1_3 : f32;
-  [[location(4), interpolate(linear)]]
+  @location(4) @interpolate(linear)
   x_1_4 : f32;
-  [[location(5), interpolate(linear, centroid)]]
+  @location(5) @interpolate(linear, centroid)
   x_1_5 : f32;
-  [[location(6), interpolate(linear, sample)]]
+  @location(6) @interpolate(linear, sample)
   x_1_6 : f32;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_1.field0, x_1.field1, x_1.field2, x_1.field3, x_1.field4, x_1.field5);
diff --git a/src/reader/spirv/parser_impl_named_types_test.cc b/src/reader/spirv/parser_impl_named_types_test.cc
index f593222..8da9c73 100644
--- a/src/reader/spirv/parser_impl_named_types_test.cc
+++ b/src/reader/spirv/parser_impl_named_types_test.cc
@@ -78,7 +78,7 @@
   )"));
   EXPECT_TRUE(p->BuildAndParseInternalModule());
   EXPECT_THAT(test::ToString(p->program()),
-              HasSubstr("RTArr = [[stride(8)]] array<u32>;\n"));
+              HasSubstr("RTArr = @stride(8) array<u32>;\n"));
 
   p->DeliberatelyInvalidSpirv();
 }
@@ -93,9 +93,9 @@
   )"));
   EXPECT_TRUE(p->BuildAndParseInternalModule());
   EXPECT_THAT(test::ToString(p->program()),
-              HasSubstr(R"(type RTArr = [[stride(8)]] array<u32>;
+              HasSubstr(R"(type RTArr = @stride(8) array<u32>;
 
-type RTArr_1 = [[stride(8)]] array<u32>;
+type RTArr_1 = @stride(8) array<u32>;
 )"));
 
   p->DeliberatelyInvalidSpirv();
@@ -110,7 +110,7 @@
   )"));
   EXPECT_TRUE(p->BuildAndParseInternalModule());
   EXPECT_THAT(test::ToString(p->program()),
-              HasSubstr("myrtarr = [[stride(8)]] array<u32>;\n"));
+              HasSubstr("myrtarr = @stride(8) array<u32>;\n"));
 
   p->DeliberatelyInvalidSpirv();
 }
@@ -126,7 +126,7 @@
   )"));
   EXPECT_TRUE(p->BuildAndParseInternalModule());
   EXPECT_THAT(test::ToString(p->program()),
-              HasSubstr("myarr = [[stride(8)]] array<u32, 5u>;"));
+              HasSubstr("myarr = @stride(8) array<u32, 5u>;"));
 
   p->DeliberatelyInvalidSpirv();
 }
@@ -142,9 +142,9 @@
   )"));
   EXPECT_TRUE(p->BuildAndParseInternalModule());
   EXPECT_THAT(test::ToString(p->program()),
-              HasSubstr(R"(type Arr = [[stride(8)]] array<u32, 5u>;
+              HasSubstr(R"(type Arr = @stride(8) array<u32, 5u>;
 
-type Arr_1 = [[stride(8)]] array<u32, 5u>;
+type Arr_1 = @stride(8) array<u32, 5u>;
 )"));
 
   p->DeliberatelyInvalidSpirv();
diff --git a/src/reader/wgsl/lexer.cc b/src/reader/wgsl/lexer.cc
index f8c8bfa..31d2546 100644
--- a/src/reader/wgsl/lexer.cc
+++ b/src/reader/wgsl/lexer.cc
@@ -777,7 +777,11 @@
   auto source = begin_source();
   auto type = Token::Type::kUninitialized;
 
-  if (matches(pos_, "[[")) {
+  if (matches(pos_, "@")) {
+    type = Token::Type::kAttr;
+    pos_ += 1;
+    location_.column += 1;
+  } else if (matches(pos_, "[[")) {
     type = Token::Type::kAttrLeft;
     pos_ += 2;
     location_.column += 2;
diff --git a/src/reader/wgsl/lexer_test.cc b/src/reader/wgsl/lexer_test.cc
index 20b3f18..0ea9b9a 100644
--- a/src/reader/wgsl/lexer_test.cc
+++ b/src/reader/wgsl/lexer_test.cc
@@ -662,6 +662,7 @@
     testing::Values(TokenData{"&", Token::Type::kAnd},
                     TokenData{"&&", Token::Type::kAndAnd},
                     TokenData{"->", Token::Type::kArrow},
+                    TokenData{"@", Token::Type::kAttr},
                     TokenData{"[[", Token::Type::kAttrLeft},
                     TokenData{"]]", Token::Type::kAttrRight},
                     TokenData{"/", Token::Type::kForwardSlash},
diff --git a/src/reader/wgsl/parser_impl.cc b/src/reader/wgsl/parser_impl.cc
index cdc9b87..9f54309 100644
--- a/src/reader/wgsl/parser_impl.cc
+++ b/src/reader/wgsl/parser_impl.cc
@@ -161,9 +161,9 @@
   /// @return the current enter-exit depth for the given block token type. If
   /// `t` is not a block token type, then 0 is always returned.
   int consume(const Token& t) {
-    if (t.Is(Token::Type::kAttrLeft))
+    if (t.Is(Token::Type::kAttrLeft))  // [DEPRECATED]
       return attrs++;
-    if (t.Is(Token::Type::kAttrRight))
+    if (t.Is(Token::Type::kAttrRight))  // [DEPRECATED]
       return attrs--;
     if (t.Is(Token::Type::kBraceLeft))
       return brace++;
@@ -1383,7 +1383,8 @@
   while (continue_parsing()) {
     // Check for the end of the list.
     auto t = peek();
-    if (!t.IsIdentifier() && !t.Is(Token::Type::kAttrLeft)) {
+    if (!t.IsIdentifier() && !t.Is(Token::Type::kAttr) &&
+        !t.Is(Token::Type::kAttrLeft)) {
       break;
     }
 
@@ -2834,11 +2835,21 @@
   ast::DecorationList decos;
 
   while (continue_parsing()) {
-    auto list = decoration_bracketed_list(decos);
-    if (list.errored)
-      errored = true;
-    if (!list.matched)
-      break;
+    if (match(Token::Type::kAttr)) {
+      if (auto deco = expect_decoration(); deco.errored) {
+        errored = true;
+      } else {
+        decos.emplace_back(deco.value);
+      }
+    } else {  // [DEPRECATED] - old [[decoration]] style
+      auto list = decoration_bracketed_list(decos);
+      if (list.errored) {
+        errored = true;
+      }
+      if (!list.matched) {
+        break;
+      }
+    }
 
     matched = true;
   }
@@ -2855,11 +2866,15 @@
 Maybe<bool> ParserImpl::decoration_bracketed_list(ast::DecorationList& decos) {
   const char* use = "decoration list";
 
-  if (!match(Token::Type::kAttrLeft)) {
+  Source source;
+  if (!match(Token::Type::kAttrLeft, &source)) {
     return Failure::kNoMatch;
   }
 
-  Source source;
+  deprecated(source,
+             "[[decoration]] style decorations have been replaced with "
+             "@decoration style");
+
   if (match(Token::Type::kAttrRight, &source))
     return add_error(source, "empty decoration list");
 
@@ -2879,7 +2894,7 @@
 
       if (is_decoration(peek())) {
         // We have two decorations in a bracket without a separating comma.
-        // e.g. [[location(1) group(2)]]
+        // e.g. @location(1) group(2)
         //                    ^^^ expected comma
         expect(use, Token::Type::kComma);
         return Failure::kErrored;
@@ -3092,7 +3107,7 @@
     const char* use = "override decoration";
 
     if (peek_is(Token::Type::kParenLeft)) {
-      // [[override(x)]]
+      // @override(x)
       return expect_paren_block(use, [&]() -> Result {
         auto val = expect_positive_sint(use);
         if (val.errored)
diff --git a/src/reader/wgsl/parser_impl.h b/src/reader/wgsl/parser_impl.h
index 77c97e2..6c202a7 100644
--- a/src/reader/wgsl/parser_impl.h
+++ b/src/reader/wgsl/parser_impl.h
@@ -669,7 +669,7 @@
   /// Parses a `assignment_stmt` grammar element
   /// @returns the parsed assignment or nullptr
   Maybe<const ast::AssignmentStatement*> assignment_stmt();
-  /// Parses one or more bracketed decoration lists.
+  /// Parses one or more decoration lists.
   /// @return the parsed decoration list, or an empty list on error.
   Maybe<ast::DecorationList> decoration_list();
   /// Parses a list of decorations between `ATTR_LEFT` and `ATTR_RIGHT`
diff --git a/src/reader/wgsl/parser_impl_error_msg_test.cc b/src/reader/wgsl/parser_impl_error_msg_test.cc
index 29f5a7e..417c1eb 100644
--- a/src/reader/wgsl/parser_impl_error_msg_test.cc
+++ b/src/reader/wgsl/parser_impl_error_msg_test.cc
@@ -39,387 +39,491 @@
 
 TEST_F(ParserImplErrorTest, AdditiveInvalidExpr) {
   EXPECT("fn f() { return 1.0 + <; }",
-         "test.wgsl:1:23 error: unable to parse right side of + expression\n"
-         "fn f() { return 1.0 + <; }\n"
-         "                      ^\n");
+         R"(test.wgsl:1:23 error: unable to parse right side of + expression
+fn f() { return 1.0 + <; }
+                      ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, AndInvalidExpr) {
   EXPECT("fn f() { return 1 & >; }",
-         "test.wgsl:1:21 error: unable to parse right side of & expression\n"
-         "fn f() { return 1 & >; }\n"
-         "                    ^\n");
+         R"(test.wgsl:1:21 error: unable to parse right side of & expression
+fn f() { return 1 & >; }
+                    ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, AliasDeclInvalidDeco) {
-  EXPECT("[[override]]type e=u32;",
-         "test.wgsl:1:3 error: unexpected decorations\n"
-         "[[override]]type e=u32;\n"
-         "  ^^^^^^^^\n");
+  EXPECT(
+      "@override type e=u32;",
+      R"(test.wgsl:1:2 error: unexpected decorations
+@override type e=u32;
+ ^^^^^^^^
+)");
+}
+
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest, DEPRECATED_AliasDeclInvalidDeco) {
+  EXPECT(
+      "[[override]]type e=u32;",
+      R"(test.wgsl:1:1 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+[[override]]type e=u32;
+^^
+
+test.wgsl:1:3 error: unexpected decorations
+[[override]]type e=u32;
+  ^^^^^^^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, IndexExprInvalidExpr) {
   EXPECT("fn f() { x = y[^]; }",
-         "test.wgsl:1:16 error: unable to parse expression inside []\n"
-         "fn f() { x = y[^]; }\n"
-         "               ^\n");
+         R"(test.wgsl:1:16 error: unable to parse expression inside []
+fn f() { x = y[^]; }
+               ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, IndexExprMissingRBracket) {
   EXPECT("fn f() { x = y[1; }",
-         "test.wgsl:1:17 error: expected ']' for index accessor\n"
-         "fn f() { x = y[1; }\n"
-         "                ^\n");
+         R"(test.wgsl:1:17 error: expected ']' for index accessor
+fn f() { x = y[1; }
+                ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, AssignmentStmtMissingAssignment) {
-  EXPECT("fn f() { a; }",
-         "test.wgsl:1:11 error: expected '=' for assignment\n"
-         "fn f() { a; }\n"
-         "          ^\n");
+  EXPECT("fn f() { a; }", R"(test.wgsl:1:11 error: expected '=' for assignment
+fn f() { a; }
+          ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, AssignmentStmtMissingAssignment2) {
   EXPECT("fn f() { a : i32; }",
-         "test.wgsl:1:10 error: expected 'var' for variable declaration\n"
-         "fn f() { a : i32; }\n"
-         "         ^\n");
+         R"(test.wgsl:1:10 error: expected 'var' for variable declaration
+fn f() { a : i32; }
+         ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, AssignmentStmtMissingSemicolon) {
   EXPECT("fn f() { a = 1 }",
-         "test.wgsl:1:16 error: expected ';' for assignment statement\n"
-         "fn f() { a = 1 }\n"
-         "               ^\n");
+         R"(test.wgsl:1:16 error: expected ';' for assignment statement
+fn f() { a = 1 }
+               ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, AssignmentStmtInvalidLHS_IntrinsicFunctionName) {
   EXPECT("normalize = 5;",
-         "test.wgsl:1:1 error: statement found outside of function body\n"
-         "normalize = 5;\n"
-         "^^^^^^^^^\n");
+         R"(test.wgsl:1:1 error: statement found outside of function body
+normalize = 5;
+^^^^^^^^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, AssignmentStmtInvalidRHS) {
   EXPECT("fn f() { a = >; }",
-         "test.wgsl:1:14 error: unable to parse right side of assignment\n"
-         "fn f() { a = >; }\n"
-         "             ^\n");
+         R"(test.wgsl:1:14 error: unable to parse right side of assignment
+fn f() { a = >; }
+             ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, BitcastExprMissingLessThan) {
   EXPECT("fn f() { x = bitcast(y); }",
-         "test.wgsl:1:21 error: expected '<' for bitcast expression\n"
-         "fn f() { x = bitcast(y); }\n"
-         "                    ^\n");
+         R"(test.wgsl:1:21 error: expected '<' for bitcast expression
+fn f() { x = bitcast(y); }
+                    ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, BitcastExprMissingGreaterThan) {
   EXPECT("fn f() { x = bitcast<u32(y); }",
-         "test.wgsl:1:25 error: expected '>' for bitcast expression\n"
-         "fn f() { x = bitcast<u32(y); }\n"
-         "                        ^\n");
+         R"(test.wgsl:1:25 error: expected '>' for bitcast expression
+fn f() { x = bitcast<u32(y); }
+                        ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, BitcastExprMissingType) {
   EXPECT("fn f() { x = bitcast<>(y); }",
-         "test.wgsl:1:22 error: invalid type for bitcast expression\n"
-         "fn f() { x = bitcast<>(y); }\n"
-         "                     ^\n");
+         R"(test.wgsl:1:22 error: invalid type for bitcast expression
+fn f() { x = bitcast<>(y); }
+                     ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, BreakStmtMissingSemicolon) {
   EXPECT("fn f() { loop { break } }",
-         "test.wgsl:1:23 error: expected ';' for break statement\n"
-         "fn f() { loop { break } }\n"
-         "                      ^\n");
+         R"(test.wgsl:1:23 error: expected ';' for break statement
+fn f() { loop { break } }
+                      ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, CallExprMissingRParen) {
   EXPECT("fn f() { x = f(1.; }",
-         "test.wgsl:1:18 error: expected ')' for function call\n"
-         "fn f() { x = f(1.; }\n"
-         "                 ^\n");
+         R"(test.wgsl:1:18 error: expected ')' for function call
+fn f() { x = f(1.; }
+                 ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, CallStmtMissingRParen) {
   EXPECT("fn f() { f(1.; }",
-         "test.wgsl:1:14 error: expected ')' for function call\n"
-         "fn f() { f(1.; }\n"
-         "             ^\n");
+         R"(test.wgsl:1:14 error: expected ')' for function call
+fn f() { f(1.; }
+             ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, CallStmtInvalidArgument0) {
   EXPECT("fn f() { f(<); }",
-         "test.wgsl:1:12 error: expected ')' for function call\n"
-         "fn f() { f(<); }\n"
-         "           ^\n");
+         R"(test.wgsl:1:12 error: expected ')' for function call
+fn f() { f(<); }
+           ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, CallStmtInvalidArgument1) {
   EXPECT("fn f() { f(1.0, <); }",
-         "test.wgsl:1:17 error: expected ')' for function call\n"
-         "fn f() { f(1.0, <); }\n"
-         "                ^\n");
+         R"(test.wgsl:1:17 error: expected ')' for function call
+fn f() { f(1.0, <); }
+                ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, CallStmtMissingSemicolon) {
   EXPECT("fn f() { f() }",
-         "test.wgsl:1:14 error: expected ';' for function call\n"
-         "fn f() { f() }\n"
-         "             ^\n");
+         R"(test.wgsl:1:14 error: expected ';' for function call
+fn f() { f() }
+             ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, ConstructorExprMissingLParen) {
   EXPECT("fn f() { x = vec2<u32>1,2); }",
-         "test.wgsl:1:23 error: expected '(' for type constructor\n"
-         "fn f() { x = vec2<u32>1,2); }\n"
-         "                      ^\n");
+         R"(test.wgsl:1:23 error: expected '(' for type constructor
+fn f() { x = vec2<u32>1,2); }
+                      ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, ConstructorExprMissingRParen) {
   EXPECT("fn f() { x = vec2<u32>(1,2; }",
-         "test.wgsl:1:27 error: expected ')' for type constructor\n"
-         "fn f() { x = vec2<u32>(1,2; }\n"
-         "                          ^\n");
+         R"(test.wgsl:1:27 error: expected ')' for type constructor
+fn f() { x = vec2<u32>(1,2; }
+                          ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, ConstVarStmtInvalid) {
   EXPECT("fn f() { let >; }",
-         "test.wgsl:1:14 error: expected identifier for let declaration\n"
-         "fn f() { let >; }\n"
-         "             ^\n");
+         R"(test.wgsl:1:14 error: expected identifier for let declaration
+fn f() { let >; }
+             ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, ConstVarStmtMissingAssignment) {
   EXPECT("fn f() { let a : i32; }",
-         "test.wgsl:1:21 error: expected '=' for let declaration\n"
-         "fn f() { let a : i32; }\n"
-         "                    ^\n");
+         R"(test.wgsl:1:21 error: expected '=' for let declaration
+fn f() { let a : i32; }
+                    ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, ConstVarStmtMissingConstructor) {
   EXPECT("fn f() { let a : i32 = >; }",
-         "test.wgsl:1:24 error: missing constructor for let declaration\n"
-         "fn f() { let a : i32 = >; }\n"
-         "                       ^\n");
+         R"(test.wgsl:1:24 error: missing constructor for let declaration
+fn f() { let a : i32 = >; }
+                       ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, ContinueStmtMissingSemicolon) {
   EXPECT("fn f() { loop { continue } }",
-         "test.wgsl:1:26 error: expected ';' for continue statement\n"
-         "fn f() { loop { continue } }\n"
-         "                         ^\n");
+         R"(test.wgsl:1:26 error: expected ';' for continue statement
+fn f() { loop { continue } }
+                         ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, DiscardStmtMissingSemicolon) {
   EXPECT("fn f() { discard }",
-         "test.wgsl:1:18 error: expected ';' for discard statement\n"
-         "fn f() { discard }\n"
-         "                 ^\n");
+         R"(test.wgsl:1:18 error: expected ';' for discard statement
+fn f() { discard }
+                 ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, EqualityInvalidExpr) {
   EXPECT("fn f() { return 1 == >; }",
-         "test.wgsl:1:22 error: unable to parse right side of == expression\n"
-         "fn f() { return 1 == >; }\n"
-         "                     ^\n");
+         R"(test.wgsl:1:22 error: unable to parse right side of == expression
+fn f() { return 1 == >; }
+                     ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, ForLoopInitializerMissingSemicolon) {
   EXPECT("fn f() { for (var i : i32 = 0 i < 8; i=i+1) {} }",
-         "test.wgsl:1:31 error: expected ';' for initializer in for loop\n"
-         "fn f() { for (var i : i32 = 0 i < 8; i=i+1) {} }\n"
-         "                              ^\n");
+         R"(test.wgsl:1:31 error: expected ';' for initializer in for loop
+fn f() { for (var i : i32 = 0 i < 8; i=i+1) {} }
+                              ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, ForLoopInitializerMissingVar) {
   EXPECT("fn f() { for (i : i32 = 0; i < 8; i=i+1) {} }",
-         "test.wgsl:1:15 error: expected 'var' for variable declaration\n"
-         "fn f() { for (i : i32 = 0; i < 8; i=i+1) {} }\n"
-         "              ^\n");
+         R"(test.wgsl:1:15 error: expected 'var' for variable declaration
+fn f() { for (i : i32 = 0; i < 8; i=i+1) {} }
+              ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, ForLoopConditionMissingSemicolon) {
   EXPECT("fn f() { for (var i : i32 = 0; i < 8 i=i+1) {} }",
-         "test.wgsl:1:38 error: expected ';' for condition in for loop\n"
-         "fn f() { for (var i : i32 = 0; i < 8 i=i+1) {} }\n"
-         "                                     ^\n");
+         R"(test.wgsl:1:38 error: expected ';' for condition in for loop
+fn f() { for (var i : i32 = 0; i < 8 i=i+1) {} }
+                                     ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, ForLoopMissingLParen) {
   EXPECT("fn f() { for var i : i32 = 0; i < 8; i=i+1) {} }",
-         "test.wgsl:1:14 error: expected '(' for for loop\n"
-         "fn f() { for var i : i32 = 0; i < 8; i=i+1) {} }\n"
-         "             ^^^\n");
+         R"(test.wgsl:1:14 error: expected '(' for for loop
+fn f() { for var i : i32 = 0; i < 8; i=i+1) {} }
+             ^^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, ForLoopMissingRParen) {
   EXPECT("fn f() { for (var i : i32 = 0; i < 8; i=i+1 {} }",
-         "test.wgsl:1:45 error: expected ')' for for loop\n"
-         "fn f() { for (var i : i32 = 0; i < 8; i=i+1 {} }\n"
-         "                                            ^\n");
+         R"(test.wgsl:1:45 error: expected ')' for for loop
+fn f() { for (var i : i32 = 0; i < 8; i=i+1 {} }
+                                            ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, ForLoopMissingLBrace) {
   EXPECT("fn f() { for (var i : i32 = 0; i < 8; i=i+1) }",
-         "test.wgsl:1:46 error: expected '{' for for loop\n"
-         "fn f() { for (var i : i32 = 0; i < 8; i=i+1) }\n"
-         "                                             ^\n");
+         R"(test.wgsl:1:46 error: expected '{' for for loop
+fn f() { for (var i : i32 = 0; i < 8; i=i+1) }
+                                             ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, ForLoopMissingRBrace) {
   EXPECT("fn f() { for (var i : i32 = 0; i < 8; i=i+1) {",
-         "test.wgsl:1:47 error: expected '}' for for loop\n"
-         "fn f() { for (var i : i32 = 0; i < 8; i=i+1) {\n"
-         "                                              ^\n");
-}
-
-TEST_F(ParserImplErrorTest, FunctionDeclDecoMissingEnd) {
-  EXPECT("[[stage(vertex) fn f() {}",
-         "test.wgsl:1:17 error: expected ']]' for decoration list\n"
-         "[[stage(vertex) fn f() {}\n"
-         "                ^^\n");
+         R"(test.wgsl:1:47 error: expected '}' for for loop
+fn f() { for (var i : i32 = 0; i < 8; i=i+1) {
+                                              ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, FunctionDeclDecoStageMissingLParen) {
-  EXPECT("[[stage vertex]] fn f() {}",
-         "test.wgsl:1:9 error: expected '(' for stage decoration\n"
-         "[[stage vertex]] fn f() {}\n"
-         "        ^^^^^^\n");
+  EXPECT(
+      "@stage vertex) fn f() {}",
+      R"(test.wgsl:1:8 error: expected '(' for stage decoration
+@stage vertex) fn f() {}
+       ^^^^^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, FunctionDeclDecoStageMissingRParen) {
-  EXPECT("[[stage(vertex]] fn f() {}",
-         "test.wgsl:1:15 error: expected ')' for stage decoration\n"
-         "[[stage(vertex]] fn f() {}\n"
-         "              ^^\n");
+  EXPECT(
+      "@stage(vertex fn f() {}",
+      R"(test.wgsl:1:15 error: expected ')' for stage decoration
+@stage(vertex fn f() {}
+              ^^
+)");
+}
+
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest, DEPRECATED_FunctionDeclDecoStageMissingLParen) {
+  EXPECT(
+      "[[stage vertex]] fn f() {}",
+      R"(test.wgsl:1:1 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+[[stage vertex]] fn f() {}
+^^
+
+test.wgsl:1:9 error: expected '(' for stage decoration
+[[stage vertex]] fn f() {}
+        ^^^^^^
+)");
+}
+
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest, DEPRECATED_FunctionDeclDecoStageMissingRParen) {
+  EXPECT(
+      "[[stage(vertex]] fn f() {}",
+      R"(test.wgsl:1:1 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+[[stage(vertex]] fn f() {}
+^^
+
+test.wgsl:1:15 error: expected ')' for stage decoration
+[[stage(vertex]] fn f() {}
+              ^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, FunctionDeclDecoStageInvalid) {
-  EXPECT("[[stage(x)]] fn f() {}",
-         "test.wgsl:1:9 error: invalid value for stage decoration\n"
-         "[[stage(x)]] fn f() {}\n"
-         "        ^\n");
+  EXPECT("@stage(x) fn f() {}",
+         R"(test.wgsl:1:8 error: invalid value for stage decoration
+@stage(x) fn f() {}
+       ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, FunctionDeclDecoStageTypeInvalid) {
-  EXPECT("[[shader(vertex)]] fn main() {}",
-         "test.wgsl:1:3 error: expected decoration\n"
-         "[[shader(vertex)]] fn main() {}\n"
-         "  ^^^^^^\n");
+  EXPECT("@shader(vertex) fn main() {}",
+         R"(test.wgsl:1:2 error: expected decoration
+@shader(vertex) fn main() {}
+ ^^^^^^
+
+test.wgsl:1:8 error: unexpected token
+@shader(vertex) fn main() {}
+       ^
+)");
 }
 
-TEST_F(ParserImplErrorTest, FunctionDeclDecoWorkgroupSizeMissingLParen) {
-  EXPECT("[[workgroup_size 1]] fn f() {}",
-         "test.wgsl:1:18 error: expected '(' for workgroup_size decoration\n"
-         "[[workgroup_size 1]] fn f() {}\n"
-         "                 ^\n");
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest,
+       DEPRECATED_FunctionDeclDecoWorkgroupSizeMissingLParen) {
+  EXPECT(
+      "[[workgroup_size 1]] fn f() {}",
+      R"(test.wgsl:1:1 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+[[workgroup_size 1]] fn f() {}
+^^
+
+test.wgsl:1:18 error: expected '(' for workgroup_size decoration
+[[workgroup_size 1]] fn f() {}
+                 ^
+)");
 }
 
-TEST_F(ParserImplErrorTest, FunctionDeclDecoWorkgroupSizeMissingRParen) {
-  EXPECT("[[workgroup_size(1]] fn f() {}",
-         "test.wgsl:1:19 error: expected ')' for workgroup_size decoration\n"
-         "[[workgroup_size(1]] fn f() {}\n"
-         "                  ^^\n");
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest,
+       DEPRECATED_FunctionDeclDecoWorkgroupSizeMissingRParen) {
+  EXPECT(
+      "[[workgroup_size(1]] fn f() {}",
+      R"(test.wgsl:1:1 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+[[workgroup_size(1]] fn f() {}
+^^
+
+test.wgsl:1:19 error: expected ')' for workgroup_size decoration
+[[workgroup_size(1]] fn f() {}
+                  ^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, FunctionDeclDecoWorkgroupSizeXInvalid) {
-  EXPECT("[[workgroup_size()]] fn f() {}",
-         "test.wgsl:1:18 error: expected workgroup_size x parameter\n"
-         "[[workgroup_size()]] fn f() {}\n"
-         "                 ^\n");
+  EXPECT("@workgroup_size() fn f() {}",
+         R"(test.wgsl:1:17 error: expected workgroup_size x parameter
+@workgroup_size() fn f() {}
+                ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, FunctionDeclDecoWorkgroupSizeYInvalid) {
-  EXPECT("[[workgroup_size(1, )]] fn f() {}",
-         "test.wgsl:1:21 error: expected workgroup_size y parameter\n"
-         "[[workgroup_size(1, )]] fn f() {}\n"
-         "                    ^\n");
+  EXPECT("@workgroup_size(1, ) fn f() {}",
+         R"(test.wgsl:1:20 error: expected workgroup_size y parameter
+@workgroup_size(1, ) fn f() {}
+                   ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, FunctionDeclDecoWorkgroupSizeZInvalid) {
-  EXPECT("[[workgroup_size(1, 2, )]] fn f() {}",
-         "test.wgsl:1:24 error: expected workgroup_size z parameter\n"
-         "[[workgroup_size(1, 2, )]] fn f() {}\n"
-         "                       ^\n");
+  EXPECT("@workgroup_size(1, 2, ) fn f() {}",
+         R"(test.wgsl:1:23 error: expected workgroup_size z parameter
+@workgroup_size(1, 2, ) fn f() {}
+                      ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, FunctionDeclMissingIdentifier) {
   EXPECT("fn () {}",
-         "test.wgsl:1:4 error: expected identifier for function declaration\n"
-         "fn () {}\n"
-         "   ^\n");
+         R"(test.wgsl:1:4 error: expected identifier for function declaration
+fn () {}
+   ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, FunctionDeclMissingLParen) {
   EXPECT("fn f) {}",
-         "test.wgsl:1:5 error: expected '(' for function declaration\n"
-         "fn f) {}\n"
-         "    ^\n");
+         R"(test.wgsl:1:5 error: expected '(' for function declaration
+fn f) {}
+    ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, FunctionDeclMissingRParen) {
   EXPECT("fn f( {}",
-         "test.wgsl:1:7 error: expected ')' for function declaration\n"
-         "fn f( {}\n"
-         "      ^\n");
+         R"(test.wgsl:1:7 error: expected ')' for function declaration
+fn f( {}
+      ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, FunctionDeclMissingArrow) {
-  EXPECT("fn f() f32 {}",
-         "test.wgsl:1:8 error: expected '{'\n"
-         "fn f() f32 {}\n"
-         "       ^^^\n");
+  EXPECT("fn f() f32 {}", R"(test.wgsl:1:8 error: expected '{'
+fn f() f32 {}
+       ^^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, FunctionDeclInvalidReturnType) {
   EXPECT("fn f() -> 1 {}",
-         "test.wgsl:1:11 error: unable to determine function return type\n"
-         "fn f() -> 1 {}\n"
-         "          ^\n");
+         R"(test.wgsl:1:11 error: unable to determine function return type
+fn f() -> 1 {}
+          ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, FunctionDeclParamMissingColon) {
-  EXPECT("fn f(x) {}",
-         "test.wgsl:1:7 error: expected ':' for parameter\n"
-         "fn f(x) {}\n"
-         "      ^\n");
+  EXPECT("fn f(x) {}", R"(test.wgsl:1:7 error: expected ':' for parameter
+fn f(x) {}
+      ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, FunctionDeclParamInvalidType) {
-  EXPECT("fn f(x : 1) {}",
-         "test.wgsl:1:10 error: invalid type for parameter\n"
-         "fn f(x : 1) {}\n"
-         "         ^\n");
+  EXPECT("fn f(x : 1) {}", R"(test.wgsl:1:10 error: invalid type for parameter
+fn f(x : 1) {}
+         ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, FunctionDeclParamMissing) {
   EXPECT("fn f(x : i32, ,) {}",
-         "test.wgsl:1:15 error: expected ')' for function declaration\n"
-         "fn f(x : i32, ,) {}\n"
-         "              ^\n");
+         R"(test.wgsl:1:15 error: expected ')' for function declaration
+fn f(x : i32, ,) {}
+              ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, FunctionDeclMissingLBrace) {
-  EXPECT("fn f() }",
-         "test.wgsl:1:8 error: expected '{'\n"
-         "fn f() }\n"
-         "       ^\n");
+  EXPECT("fn f() }", R"(test.wgsl:1:8 error: expected '{'
+fn f() }
+       ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, FunctionDeclMissingRBrace) {
-  EXPECT("fn f() {",
-         "test.wgsl:1:9 error: expected '}'\n"
-         "fn f() {\n"
-         "        ^\n");
+  EXPECT("fn f() {", R"(test.wgsl:1:9 error: expected '}'
+fn f() {
+        ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, FunctionScopeUnusedDecl) {
-  EXPECT("fn f(a:i32)->i32{return a;[[size(1)]]}",
-         "test.wgsl:1:29 error: unexpected decorations\n"
-         "fn f(a:i32)->i32{return a;[[size(1)]]}\n"
-         "                            ^^^^\n");
+  EXPECT("fn f(a:i32)->i32{return a;@size(1)}",
+         R"(test.wgsl:1:28 error: unexpected decorations
+fn f(a:i32)->i32{return a;@size(1)}
+                           ^^^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, FunctionMissingOpenLine) {
@@ -427,64 +531,72 @@
   var a : f32 = bar[0];
   return;
 })",
-         "test.wgsl:2:17 error: unable to parse const_expr\n"
-         "  var a : f32 = bar[0];\n"
-         "                ^^^\n"
-         "\n"
-         "test.wgsl:3:3 error: statement found outside of function body\n"
-         "  return;\n"
-         "  ^^^^^^\n");
+         R"(test.wgsl:2:17 error: unable to parse const_expr
+  var a : f32 = bar[0];
+                ^^^
+
+test.wgsl:3:3 error: statement found outside of function body
+  return;
+  ^^^^^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclConstInvalidIdentifier) {
   EXPECT("let ^ : i32 = 1;",
-         "test.wgsl:1:5 error: expected identifier for let declaration\n"
-         "let ^ : i32 = 1;\n"
-         "    ^\n");
+         R"(test.wgsl:1:5 error: expected identifier for let declaration
+let ^ : i32 = 1;
+    ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclConstMissingSemicolon) {
   EXPECT("let i : i32 = 1",
-         "test.wgsl:1:16 error: expected ';' for let declaration\n"
-         "let i : i32 = 1\n"
-         "               ^\n");
+         R"(test.wgsl:1:16 error: expected ';' for let declaration
+let i : i32 = 1
+               ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclConstMissingLParen) {
   EXPECT("let i : vec2<i32> = vec2<i32>;",
-         "test.wgsl:1:30 error: expected '(' for type constructor\n"
-         "let i : vec2<i32> = vec2<i32>;\n"
-         "                             ^\n");
+         R"(test.wgsl:1:30 error: expected '(' for type constructor
+let i : vec2<i32> = vec2<i32>;
+                             ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclConstMissingRParen) {
   EXPECT("let i : vec2<i32> = vec2<i32>(1., 2.;",
-         "test.wgsl:1:37 error: expected ')' for type constructor\n"
-         "let i : vec2<i32> = vec2<i32>(1., 2.;\n"
-         "                                    ^\n");
+         R"(test.wgsl:1:37 error: expected ')' for type constructor
+let i : vec2<i32> = vec2<i32>(1., 2.;
+                                    ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclConstBadConstLiteral) {
   EXPECT("let i : vec2<i32> = vec2<i32>(!);",
-         "test.wgsl:1:31 error: unable to parse const_expr\n"
-         "let i : vec2<i32> = vec2<i32>(!);\n"
-         "                              ^\n");
+         R"(test.wgsl:1:31 error: unable to parse const_expr
+let i : vec2<i32> = vec2<i32>(!);
+                              ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclConstBadConstLiteralSpaceLessThan) {
   EXPECT("let i = 1 < 2;",
-         "test.wgsl:1:11 error: expected \';\' for let declaration\n"
-         "let i = 1 < 2;\n"
-         "          ^\n");
+         R"(test.wgsl:1:11 error: expected ';' for let declaration
+let i = 1 < 2;
+          ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclConstNotConstExpr) {
   EXPECT(
       "let a = 1;\n"
       "let b = a;",
-      "test.wgsl:2:9 error: unable to parse const_expr\n"
-      "let b = a;\n"
-      "        ^\n");
+      R"(test.wgsl:2:9 error: unable to parse const_expr
+let b = a;
+        ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclConstExprMaxDepth) {
@@ -516,767 +628,1080 @@
 
 TEST_F(ParserImplErrorTest, GlobalDeclConstExprMissingLParen) {
   EXPECT("let i : vec2<i32> = vec2<i32> 1, 2);",
-         "test.wgsl:1:31 error: expected '(' for type constructor\n"
-         "let i : vec2<i32> = vec2<i32> 1, 2);\n"
-         "                              ^\n");
+         R"(test.wgsl:1:31 error: expected '(' for type constructor
+let i : vec2<i32> = vec2<i32> 1, 2);
+                              ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclConstExprMissingRParen) {
   EXPECT("let i : vec2<i32> = vec2<i32>(1, 2;",
-         "test.wgsl:1:35 error: expected ')' for type constructor\n"
-         "let i : vec2<i32> = vec2<i32>(1, 2;\n"
-         "                                  ^\n");
+         R"(test.wgsl:1:35 error: expected ')' for type constructor
+let i : vec2<i32> = vec2<i32>(1, 2;
+                                  ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclInvalidDeco) {
-  EXPECT("[[stage(vertex)]] x;",
-         "test.wgsl:1:19 error: expected declaration after decorations\n"
-         "[[stage(vertex)]] x;\n"
-         "                  ^\n");
+  EXPECT("@stage(vertex) x;",
+         R"(test.wgsl:1:16 error: expected declaration after decorations
+@stage(vertex) x;
+               ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclSampledTextureMissingLessThan) {
   EXPECT("var x : texture_1d;",
-         "test.wgsl:1:19 error: expected '<' for sampled texture type\n"
-         "var x : texture_1d;\n"
-         "                  ^\n");
+         R"(test.wgsl:1:19 error: expected '<' for sampled texture type
+var x : texture_1d;
+                  ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclSampledTextureMissingGreaterThan) {
   EXPECT("var x : texture_1d<f32;",
-         "test.wgsl:1:23 error: expected '>' for sampled texture type\n"
-         "var x : texture_1d<f32;\n"
-         "                      ^\n");
+         R"(test.wgsl:1:23 error: expected '>' for sampled texture type
+var x : texture_1d<f32;
+                      ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclSampledTextureInvalidSubtype) {
   EXPECT("var x : texture_1d<1>;",
-         "test.wgsl:1:20 error: invalid type for sampled texture type\n"
-         "var x : texture_1d<1>;\n"
-         "                   ^\n");
+         R"(test.wgsl:1:20 error: invalid type for sampled texture type
+var x : texture_1d<1>;
+                   ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclMultisampledTextureMissingLessThan) {
   EXPECT("var x : texture_multisampled_2d;",
-         "test.wgsl:1:32 error: expected '<' for multisampled texture type\n"
-         "var x : texture_multisampled_2d;\n"
-         "                               ^\n");
+         R"(test.wgsl:1:32 error: expected '<' for multisampled texture type
+var x : texture_multisampled_2d;
+                               ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclMultisampledTextureMissingGreaterThan) {
   EXPECT("var x : texture_multisampled_2d<f32;",
-         "test.wgsl:1:36 error: expected '>' for multisampled texture type\n"
-         "var x : texture_multisampled_2d<f32;\n"
-         "                                   ^\n");
+         R"(test.wgsl:1:36 error: expected '>' for multisampled texture type
+var x : texture_multisampled_2d<f32;
+                                   ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclMultisampledTextureInvalidSubtype) {
   EXPECT("var x : texture_multisampled_2d<1>;",
-         "test.wgsl:1:33 error: invalid type for multisampled texture type\n"
-         "var x : texture_multisampled_2d<1>;\n"
-         "                                ^\n");
+         R"(test.wgsl:1:33 error: invalid type for multisampled texture type
+var x : texture_multisampled_2d<1>;
+                                ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclStorageTextureMissingLessThan) {
   EXPECT("var x : texture_storage_2d;",
-         "test.wgsl:1:27 error: expected '<' for storage texture type\n"
-         "var x : texture_storage_2d;\n"
-         "                          ^\n");
+         R"(test.wgsl:1:27 error: expected '<' for storage texture type
+var x : texture_storage_2d;
+                          ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclStorageTextureMissingGreaterThan) {
   EXPECT("var x : texture_storage_2d<r32uint, read;",
-         "test.wgsl:1:41 error: expected '>' for storage texture type\n"
-         "var x : texture_storage_2d<r32uint, read;\n"
-         "                                        ^\n");
+         R"(test.wgsl:1:41 error: expected '>' for storage texture type
+var x : texture_storage_2d<r32uint, read;
+                                        ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclStorageTextureMissingSubtype) {
   EXPECT("var x : texture_storage_2d<>;",
-         "test.wgsl:1:28 error: invalid format for storage texture type\n"
-         "var x : texture_storage_2d<>;\n"
-         "                           ^\n");
+         R"(test.wgsl:1:28 error: invalid format for storage texture type
+var x : texture_storage_2d<>;
+                           ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclStorageTextureMissingInvalidSubtype) {
   EXPECT("var x : texture_storage_2d<1>;",
-         "test.wgsl:1:28 error: invalid format for storage texture type\n"
-         "var x : texture_storage_2d<1>;\n"
-         "                           ^\n");
+         R"(test.wgsl:1:28 error: invalid format for storage texture type
+var x : texture_storage_2d<1>;
+                           ^
+)");
 }
 
 // TODO(crbug.com/tint/1324): DEPRECATED: Remove when [[block]] is removed.
-TEST_F(ParserImplErrorTest, GlobalDeclStructDecoMissingStruct) {
-  EXPECT("[[block]];",
-         "test.wgsl:1:3 warning: use of deprecated language feature: [[block]] "
-         "attributes have been removed from WGSL\n"
-         "[[block]];\n"
-         "  ^^^^^\n\n"
-         "test.wgsl:1:10 error: expected declaration after decorations\n"
-         "[[block]];\n"
-         "         ^\n");
+TEST_F(ParserImplErrorTest, DEPRECATED_GlobalDeclStructDecoMissingStruct) {
+  EXPECT(
+      "[[block]];",
+      R"(test.wgsl:1:1 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+[[block]];
+^^
+
+test.wgsl:1:3 warning: use of deprecated language feature: [[block]] attributes have been removed from WGSL
+[[block]];
+  ^^^^^
+
+test.wgsl:1:10 error: expected declaration after decorations
+[[block]];
+         ^
+)");
 }
 
 // TODO(crbug.com/tint/1324): DEPRECATED: Remove when [[block]] is removed.
-TEST_F(ParserImplErrorTest, GlobalDeclStructDecoMissingEnd) {
-  EXPECT("[[block struct {};",
-         "test.wgsl:1:3 warning: use of deprecated language feature: [[block]] "
-         "attributes have been removed from WGSL\n"
-         "[[block struct {};\n"
-         "  ^^^^^\n\n"
-         "test.wgsl:1:9 error: expected ']]' for decoration list\n"
-         "[[block struct {};\n"
-         "        ^^^^^^\n");
+TEST_F(ParserImplErrorTest, DEPRECATED_GlobalDeclStructDecoMissingEnd) {
+  EXPECT(
+      "[[block struct {};",
+      R"(test.wgsl:1:1 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+[[block struct {};
+^^
+
+test.wgsl:1:3 warning: use of deprecated language feature: [[block]] attributes have been removed from WGSL
+[[block struct {};
+  ^^^^^
+
+test.wgsl:1:9 error: expected ']]' for decoration list
+[[block struct {};
+        ^^^^^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclStructDeclMissingIdentifier) {
   EXPECT("struct {};",
-         "test.wgsl:1:8 error: expected identifier for struct declaration\n"
-         "struct {};\n"
-         "       ^\n");
+         R"(test.wgsl:1:8 error: expected identifier for struct declaration
+struct {};
+       ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclStructDeclMissingLBrace) {
   EXPECT("struct S };",
-         "test.wgsl:1:10 error: expected '{' for struct declaration\n"
-         "struct S };\n"
-         "         ^\n");
+         R"(test.wgsl:1:10 error: expected '{' for struct declaration
+struct S };
+         ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclStructDeclMissingRBrace) {
   EXPECT("struct S { i : i32;",
-         "test.wgsl:1:20 error: expected '}' for struct declaration\n"
-         "struct S { i : i32;\n"
-         "                   ^\n");
+         R"(test.wgsl:1:20 error: expected '}' for struct declaration
+struct S { i : i32;
+                   ^
+)");
 }
 
-TEST_F(ParserImplErrorTest, GlobalDeclStructMemberDecoEmpty) {
-  EXPECT("struct S { [[]] i : i32; };",
-         "test.wgsl:1:14 error: empty decoration list\n"
-         "struct S { [[]] i : i32; };\n"
-         "             ^^\n");
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest, DEPRECATED_GlobalDeclStructMemberDecoEmpty) {
+  EXPECT(
+      "struct S { [[]] i : i32; };",
+      R"(test.wgsl:1:12 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+struct S { [[]] i : i32; };
+           ^^
+
+test.wgsl:1:14 error: empty decoration list
+struct S { [[]] i : i32; };
+             ^^
+)");
 }
 
-TEST_F(ParserImplErrorTest, GlobalDeclStructMemberDecoMissingEnd) {
-  EXPECT("struct S { [[ i : i32; };",
-         "test.wgsl:1:15 error: expected decoration\n"
-         "struct S { [[ i : i32; };\n"
-         "              ^\n");
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest, DEPRECATED_GlobalDeclStructMemberDecoMissingEnd) {
+  EXPECT(
+      "struct S { [[ i : i32; };",
+      R"(test.wgsl:1:12 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+struct S { [[ i : i32; };
+           ^^
+
+test.wgsl:1:15 error: expected decoration
+struct S { [[ i : i32; };
+              ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclStructMemberInvalidIdentifier) {
   EXPECT("struct S { 1 : i32; };",
-         "test.wgsl:1:12 error: expected identifier for struct member\n"
-         "struct S { 1 : i32; };\n"
-         "           ^\n");
+         R"(test.wgsl:1:12 error: expected identifier for struct member
+struct S { 1 : i32; };
+           ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclStructMemberMissingSemicolon) {
   EXPECT("struct S { i : i32 };",
-         "test.wgsl:1:20 error: expected ';' for struct member\n"
-         "struct S { i : i32 };\n"
-         "                   ^\n");
+         R"(test.wgsl:1:20 error: expected ';' for struct member
+struct S { i : i32 };
+                   ^
+)");
 }
 
-TEST_F(ParserImplErrorTest, GlobalDeclStructMemberAlignMissingLParen) {
-  EXPECT("struct S { [[align 1)]] i : i32; };",
-         "test.wgsl:1:20 error: expected '(' for align decoration\n"
-         "struct S { [[align 1)]] i : i32; };\n"
-         "                   ^\n");
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest,
+       DEPRECATED_GlobalDeclStructMemberAlignMissingLParen) {
+  EXPECT(
+      "struct S { [[align 1)]] i : i32; };",
+      R"(test.wgsl:1:12 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+struct S { [[align 1)]] i : i32; };
+           ^^
+
+test.wgsl:1:20 error: expected '(' for align decoration
+struct S { [[align 1)]] i : i32; };
+                   ^
+)");
 }
 
-TEST_F(ParserImplErrorTest, GlobalDeclStructMemberAlignMissingRParen) {
-  EXPECT("struct S { [[align(1]] i : i32; };",
-         "test.wgsl:1:21 error: expected ')' for align decoration\n"
-         "struct S { [[align(1]] i : i32; };\n"
-         "                    ^^\n");
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest,
+       DEPRECATED_GlobalDeclStructMemberAlignMissingRParen) {
+  EXPECT(
+      "struct S { [[align(1]] i : i32; };",
+      R"(test.wgsl:1:12 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+struct S { [[align(1]] i : i32; };
+           ^^
+
+test.wgsl:1:21 error: expected ')' for align decoration
+struct S { [[align(1]] i : i32; };
+                    ^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclStructMemberAlignInvaldValue) {
-  EXPECT("struct S { [[align(x)]] i : i32; };",
-         "test.wgsl:1:20 error: expected signed integer literal for align "
-         "decoration\n"
-         "struct S { [[align(x)]] i : i32; };\n"
-         "                   ^\n");
+  EXPECT(
+      "struct S { @align(x) i : i32; };",
+      R"(test.wgsl:1:19 error: expected signed integer literal for align decoration
+struct S { @align(x) i : i32; };
+                  ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclStructMemberAlignNegativeValue) {
-  EXPECT("struct S { [[align(-2)]] i : i32; };",
-         "test.wgsl:1:20 error: align decoration must be positive\n"
-         "struct S { [[align(-2)]] i : i32; };\n"
-         "                   ^^\n");
+  EXPECT("struct S { @align(-2) i : i32; };",
+         R"(test.wgsl:1:19 error: align decoration must be positive
+struct S { @align(-2) i : i32; };
+                  ^^
+)");
 }
 
-TEST_F(ParserImplErrorTest, GlobalDeclStructMemberSizeMissingLParen) {
-  EXPECT("struct S { [[size 1)]] i : i32; };",
-         "test.wgsl:1:19 error: expected '(' for size decoration\n"
-         "struct S { [[size 1)]] i : i32; };\n"
-         "                  ^\n");
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest,
+       DEPRECATED_GlobalDeclStructMemberSizeMissingLParen) {
+  EXPECT(
+      "struct S { [[size 1)]] i : i32; };",
+      R"(test.wgsl:1:12 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+struct S { [[size 1)]] i : i32; };
+           ^^
+
+test.wgsl:1:19 error: expected '(' for size decoration
+struct S { [[size 1)]] i : i32; };
+                  ^
+)");
 }
 
-TEST_F(ParserImplErrorTest, GlobalDeclStructMemberSizeMissingRParen) {
-  EXPECT("struct S { [[size(1]] i : i32; };",
-         "test.wgsl:1:20 error: expected ')' for size decoration\n"
-         "struct S { [[size(1]] i : i32; };\n"
-         "                   ^^\n");
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest,
+       DEPRECATED_GlobalDeclStructMemberSizeMissingRParen) {
+  EXPECT(
+      "struct S { [[size(1]] i : i32; };",
+      R"(test.wgsl:1:12 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+struct S { [[size(1]] i : i32; };
+           ^^
+
+test.wgsl:1:20 error: expected ')' for size decoration
+struct S { [[size(1]] i : i32; };
+                   ^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclStructMemberSizeInvaldValue) {
-  EXPECT("struct S { [[size(x)]] i : i32; };",
-         "test.wgsl:1:19 error: expected signed integer literal for size "
-         "decoration\n"
-         "struct S { [[size(x)]] i : i32; };\n"
-         "                  ^\n");
+  EXPECT(
+      "struct S { @size(x) i : i32; };",
+      R"(test.wgsl:1:18 error: expected signed integer literal for size decoration
+struct S { @size(x) i : i32; };
+                 ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclStructMemberSizeNegativeValue) {
-  EXPECT("struct S { [[size(-2)]] i : i32; };",
-         "test.wgsl:1:19 error: size decoration must be positive\n"
-         "struct S { [[size(-2)]] i : i32; };\n"
-         "                  ^^\n");
+  EXPECT("struct S { @size(-2) i : i32; };",
+         R"(test.wgsl:1:18 error: size decoration must be positive
+struct S { @size(-2) i : i32; };
+                 ^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclTypeAliasMissingIdentifier) {
   EXPECT("type 1 = f32;",
-         "test.wgsl:1:6 error: expected identifier for type alias\n"
-         "type 1 = f32;\n"
-         "     ^\n");
+         R"(test.wgsl:1:6 error: expected identifier for type alias
+type 1 = f32;
+     ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclTypeAliasInvalidType) {
-  EXPECT("type meow = 1;",
-         "test.wgsl:1:13 error: invalid type alias\n"
-         "type meow = 1;\n"
-         "            ^\n");
+  EXPECT("type meow = 1;", R"(test.wgsl:1:13 error: invalid type alias
+type meow = 1;
+            ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclTypeAliasMissingAssignment) {
-  EXPECT("type meow f32",
-         "test.wgsl:1:11 error: expected '=' for type alias\n"
-         "type meow f32\n"
-         "          ^^^\n");
+  EXPECT("type meow f32", R"(test.wgsl:1:11 error: expected '=' for type alias
+type meow f32
+          ^^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclTypeAliasMissingSemicolon) {
-  EXPECT("type meow = f32",
-         "test.wgsl:1:16 error: expected ';' for type alias\n"
-         "type meow = f32\n"
-         "               ^\n");
+  EXPECT("type meow = f32", R"(test.wgsl:1:16 error: expected ';' for type alias
+type meow = f32
+               ^
+)");
 }
 
-TEST_F(ParserImplErrorTest, GlobalDeclTypeDecoInvalid) {
-  EXPECT("var x : [[]] i32;",
-         "test.wgsl:1:11 error: empty decoration list\n"
-         "var x : [[]] i32;\n"
-         "          ^^\n");
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest, DEPRECATED_GlobalDeclTypeDecoInvalid) {
+  EXPECT(
+      "var x : [[]] i32;",
+      R"(test.wgsl:1:9 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+var x : [[]] i32;
+        ^^
+
+test.wgsl:1:11 error: empty decoration list
+var x : [[]] i32;
+          ^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarArrayMissingLessThan) {
   EXPECT("var i : array;",
-         "test.wgsl:1:14 error: expected '<' for array declaration\n"
-         "var i : array;\n"
-         "             ^\n");
+         R"(test.wgsl:1:14 error: expected '<' for array declaration
+var i : array;
+             ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarArrayMissingGreaterThan) {
   EXPECT("var i : array<u32, 3;",
-         "test.wgsl:1:21 error: expected '>' for array declaration\n"
-         "var i : array<u32, 3;\n"
-         "                    ^\n");
+         R"(test.wgsl:1:21 error: expected '>' for array declaration
+var i : array<u32, 3;
+                    ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarArrayDecoNotArray) {
-  EXPECT("var i : [[stride(1)]] i32;",
-         "test.wgsl:1:11 error: unexpected decorations\n"
-         "var i : [[stride(1)]] i32;\n"
-         "          ^^^^^^\n");
+  EXPECT("var i : @stride(1) i32;",
+         R"(test.wgsl:1:10 error: unexpected decorations
+var i : @stride(1) i32;
+         ^^^^^^
+)");
 }
 
-TEST_F(ParserImplErrorTest, GlobalDeclVarArrayDecoMissingEnd) {
-  EXPECT("var i : [[stride(1) array<i32>;",
-         "test.wgsl:1:21 error: expected ']]' for decoration list\n"
-         "var i : [[stride(1) array<i32>;\n"
-         "                    ^^^^^\n");
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest, DEPRECATED_GlobalDeclVarArrayDecoMissingEnd) {
+  EXPECT(
+      "var i : [[stride(1) array<i32>;",
+      R"(test.wgsl:1:9 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+var i : [[stride(1) array<i32>;
+        ^^
+
+test.wgsl:1:21 error: expected ']]' for decoration list
+var i : [[stride(1) array<i32>;
+                    ^^^^^
+)");
 }
 
-TEST_F(ParserImplErrorTest, GlobalDeclVarArrayDecoStrideMissingLParen) {
-  EXPECT("var i : [[stride 1)]] array<i32>;",
-         "test.wgsl:1:18 error: expected '(' for stride decoration\n"
-         "var i : [[stride 1)]] array<i32>;\n"
-         "                 ^\n");
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest,
+       DEPRECATED_GlobalDeclVarArrayDecoStrideMissingLParen) {
+  EXPECT(
+      "var i : [[stride 1)]] array<i32>;",
+      R"(test.wgsl:1:9 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+var i : [[stride 1)]] array<i32>;
+        ^^
+
+test.wgsl:1:18 error: expected '(' for stride decoration
+var i : [[stride 1)]] array<i32>;
+                 ^
+)");
 }
 
-TEST_F(ParserImplErrorTest, GlobalDeclVarArrayDecoStrideMissingRParen) {
-  EXPECT("var i : [[stride(1]] array<i32>;",
-         "test.wgsl:1:19 error: expected ')' for stride decoration\n"
-         "var i : [[stride(1]] array<i32>;\n"
-         "                  ^^\n");
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest,
+       DEPRECATED_GlobalDeclVarArrayDecoStrideMissingRParen) {
+  EXPECT(
+      "var i : [[stride(1]] array<i32>;",
+      R"(test.wgsl:1:9 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+var i : [[stride(1]] array<i32>;
+        ^^
+
+test.wgsl:1:19 error: expected ')' for stride decoration
+var i : [[stride(1]] array<i32>;
+                  ^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarArrayDecoStrideInvalid) {
-  EXPECT("var i : [[stride(x)]] array<i32>;",
-         "test.wgsl:1:18 error: expected signed integer literal for stride "
-         "decoration\n"
-         "var i : [[stride(x)]] array<i32>;\n"
-         "                 ^\n");
+  EXPECT(
+      "var i : @stride(x) array<i32>;",
+      R"(test.wgsl:1:17 error: expected signed integer literal for stride decoration
+var i : @stride(x) array<i32>;
+                ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarArrayDecoStrideNegative) {
-  EXPECT("var i : [[stride(-1)]] array<i32>;",
-         "test.wgsl:1:18 error: stride decoration must be greater than 0\n"
-         "var i : [[stride(-1)]] array<i32>;\n"
-         "                 ^^\n");
+  EXPECT("var i : @stride(-1) array<i32>;",
+         R"(test.wgsl:1:17 error: stride decoration must be greater than 0
+var i : @stride(-1) array<i32>;
+                ^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarArrayMissingType) {
   EXPECT("var i : array<1, 3>;",
-         "test.wgsl:1:15 error: invalid type for array declaration\n"
-         "var i : array<1, 3>;\n"
-         "              ^\n");
+         R"(test.wgsl:1:15 error: invalid type for array declaration
+var i : array<1, 3>;
+              ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarArrayMissingSize) {
   EXPECT("var i : array<u32, >;",
-         "test.wgsl:1:20 error: expected array size expression\n"
-         "var i : array<u32, >;\n"
-         "                   ^\n");
+         R"(test.wgsl:1:20 error: expected array size expression
+var i : array<u32, >;
+                   ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarArrayInvalidSize) {
   EXPECT("var i : array<u32, !>;",
-         "test.wgsl:1:20 error: expected array size expression\n"
-         "var i : array<u32, !>;\n"
-         "                   ^\n");
+         R"(test.wgsl:1:20 error: expected array size expression
+var i : array<u32, !>;
+                   ^
+)");
 }
 
-TEST_F(ParserImplErrorTest, GlobalDeclVarDecoListEmpty) {
-  EXPECT("[[]] var i : i32;",
-         "test.wgsl:1:3 error: empty decoration list\n"
-         "[[]] var i : i32;\n"
-         "  ^^\n");
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest, DEPRECATED_GlobalDeclVarDecoListEmpty) {
+  EXPECT(
+      "[[]] var i : i32;",
+      R"(test.wgsl:1:1 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+[[]] var i : i32;
+^^
+
+test.wgsl:1:3 error: empty decoration list
+[[]] var i : i32;
+  ^^
+)");
 }
 
-TEST_F(ParserImplErrorTest, GlobalDeclVarDecoListInvalid) {
-  EXPECT("[[location(1), meow]] var i : i32;",
-         "test.wgsl:1:16 error: expected decoration\n"
-         "[[location(1), meow]] var i : i32;\n"
-         "               ^^^^\n");
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest, DEPRECATED_GlobalDeclVarDecoListInvalid) {
+  EXPECT(
+      "[[location(1), meow]] var i : i32;",
+      R"(test.wgsl:1:1 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+[[location(1), meow]] var i : i32;
+^^
+
+test.wgsl:1:16 error: expected decoration
+[[location(1), meow]] var i : i32;
+               ^^^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoListMissingComma) {
-  EXPECT("[[location(1) group(2)]] var i : i32;",
-         "test.wgsl:1:15 error: expected ',' for decoration list\n"
-         "[[location(1) group(2)]] var i : i32;\n"
-         "              ^^^^^\n");
+  EXPECT("@location(1) group(2) var i : i32;",
+         R"(test.wgsl:1:14 error: expected declaration after decorations
+@location(1) group(2) var i : i32;
+             ^^^^^
+
+test.wgsl:1:19 error: unexpected token
+@location(1) group(2) var i : i32;
+                  ^
+)");
 }
 
-TEST_F(ParserImplErrorTest, GlobalDeclVarDecoListMissingEnd) {
-  EXPECT("[[location(1) meow]] var i : i32;",
-         "test.wgsl:1:15 error: expected ']]' for decoration list\n"
-         "[[location(1) meow]] var i : i32;\n"
-         "              ^^^^\n");
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest, DEPRECATED_GlobalDeclVarDecoListMissingEnd) {
+  EXPECT(
+      "[[location(1) meow]] var i : i32;",
+      R"(test.wgsl:1:1 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+[[location(1) meow]] var i : i32;
+^^
+
+test.wgsl:1:15 error: expected ']]' for decoration list
+[[location(1) meow]] var i : i32;
+              ^^^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoLocationMissingLParen) {
-  EXPECT("[[location 1]] var i : i32;",
-         "test.wgsl:1:12 error: expected '(' for location decoration\n"
-         "[[location 1]] var i : i32;\n"
-         "           ^\n");
+  EXPECT(
+      "@location 1) var i : i32;",
+      R"(test.wgsl:1:11 error: expected '(' for location decoration
+@location 1) var i : i32;
+          ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoLocationMissingRParen) {
-  EXPECT("[[location (1]] var i : i32;",
-         "test.wgsl:1:14 error: expected ')' for location decoration\n"
-         "[[location (1]] var i : i32;\n"
-         "             ^^\n");
+  EXPECT(
+      "@location (1 var i : i32;",
+      R"(test.wgsl:1:14 error: expected ')' for location decoration
+@location (1 var i : i32;
+             ^^^
+)");
+}
+
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest, DEPRECATED_GlobalDeclVarDecoLocationMissingLParen) {
+  EXPECT(
+      "[[location 1]] var i : i32;",
+      R"(test.wgsl:1:1 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+[[location 1]] var i : i32;
+^^
+
+test.wgsl:1:12 error: expected '(' for location decoration
+[[location 1]] var i : i32;
+           ^
+)");
+}
+
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest, DEPRECATED_GlobalDeclVarDecoLocationMissingRParen) {
+  EXPECT(
+      "[[location (1]] var i : i32;",
+      R"(test.wgsl:1:1 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+[[location (1]] var i : i32;
+^^
+
+test.wgsl:1:14 error: expected ')' for location decoration
+[[location (1]] var i : i32;
+             ^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoLocationInvalidValue) {
-  EXPECT("[[location(x)]] var i : i32;",
-         "test.wgsl:1:12 error: expected signed integer literal for location "
-         "decoration\n"
-         "[[location(x)]] var i : i32;\n"
-         "           ^\n");
+  EXPECT(
+      "@location(x) var i : i32;",
+      R"(test.wgsl:1:11 error: expected signed integer literal for location decoration
+@location(x) var i : i32;
+          ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoBuiltinMissingLParen) {
-  EXPECT("[[builtin position]] var i : i32;",
-         "test.wgsl:1:11 error: expected '(' for builtin decoration\n"
-         "[[builtin position]] var i : i32;\n"
-         "          ^^^^^^^^\n");
+  EXPECT(
+      "@builtin position) var i : i32;",
+      R"(test.wgsl:1:10 error: expected '(' for builtin decoration
+@builtin position) var i : i32;
+         ^^^^^^^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoBuiltinMissingRParen) {
-  EXPECT("[[builtin(position]] var i : i32;",
-         "test.wgsl:1:19 error: expected ')' for builtin decoration\n"
-         "[[builtin(position]] var i : i32;\n"
-         "                  ^^\n");
+  EXPECT(
+      "@builtin(position var i : i32;",
+      R"(test.wgsl:1:19 error: expected ')' for builtin decoration
+@builtin(position var i : i32;
+                  ^^^
+)");
+}
+
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest, DEPRECATED_GlobalDeclVarDecoBuiltinMissingLParen) {
+  EXPECT(
+      "[[builtin position]] var i : i32;",
+      R"(test.wgsl:1:1 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+[[builtin position]] var i : i32;
+^^
+
+test.wgsl:1:11 error: expected '(' for builtin decoration
+[[builtin position]] var i : i32;
+          ^^^^^^^^
+)");
+}
+
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest, DEPRECATED_GlobalDeclVarDecoBuiltinMissingRParen) {
+  EXPECT(
+      "[[builtin(position]] var i : i32;",
+      R"(test.wgsl:1:1 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+[[builtin(position]] var i : i32;
+^^
+
+test.wgsl:1:19 error: expected ')' for builtin decoration
+[[builtin(position]] var i : i32;
+                  ^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoBuiltinInvalidIdentifer) {
-  EXPECT("[[builtin(1)]] var i : i32;",
-         "test.wgsl:1:11 error: expected identifier for builtin\n"
-         "[[builtin(1)]] var i : i32;\n"
-         "          ^\n");
+  EXPECT("@builtin(1) var i : i32;",
+         R"(test.wgsl:1:10 error: expected identifier for builtin
+@builtin(1) var i : i32;
+         ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoBuiltinInvalidValue) {
-  EXPECT("[[builtin(x)]] var i : i32;",
-         "test.wgsl:1:11 error: invalid value for builtin decoration\n"
-         "[[builtin(x)]] var i : i32;\n"
-         "          ^\n");
+  EXPECT("@builtin(x) var i : i32;",
+         R"(test.wgsl:1:10 error: invalid value for builtin decoration
+@builtin(x) var i : i32;
+         ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoBindingMissingLParen) {
-  EXPECT("[[binding 1]] var i : i32;",
-         "test.wgsl:1:11 error: expected '(' for binding decoration\n"
-         "[[binding 1]] var i : i32;\n"
-         "          ^\n");
+  EXPECT(
+      "@binding 1) var i : i32;",
+      R"(test.wgsl:1:10 error: expected '(' for binding decoration
+@binding 1) var i : i32;
+         ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoBindingMissingRParen) {
-  EXPECT("[[binding(1]] var i : i32;",
-         "test.wgsl:1:12 error: expected ')' for binding decoration\n"
-         "[[binding(1]] var i : i32;\n"
-         "           ^^\n");
+  EXPECT(
+      "@binding(1 var i : i32;",
+      R"(test.wgsl:1:12 error: expected ')' for binding decoration
+@binding(1 var i : i32;
+           ^^^
+)");
+}
+
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest, DEPRECATED_GlobalDeclVarDecoBindingMissingLParen) {
+  EXPECT(
+      "[[binding 1]] var i : i32;",
+      R"(test.wgsl:1:1 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+[[binding 1]] var i : i32;
+^^
+
+test.wgsl:1:11 error: expected '(' for binding decoration
+[[binding 1]] var i : i32;
+          ^
+)");
+}
+
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest, DEPRECATED_GlobalDeclVarDecoBindingMissingRParen) {
+  EXPECT(
+      "[[binding(1]] var i : i32;",
+      R"(test.wgsl:1:1 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+[[binding(1]] var i : i32;
+^^
+
+test.wgsl:1:12 error: expected ')' for binding decoration
+[[binding(1]] var i : i32;
+           ^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoBindingInvalidValue) {
-  EXPECT("[[binding(x)]] var i : i32;",
-         "test.wgsl:1:11 error: expected signed integer literal for binding "
-         "decoration\n"
-         "[[binding(x)]] var i : i32;\n"
-         "          ^\n");
+  EXPECT(
+      "@binding(x) var i : i32;",
+      R"(test.wgsl:1:10 error: expected signed integer literal for binding decoration
+@binding(x) var i : i32;
+         ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoGroupMissingLParen) {
-  EXPECT("[[group 1]] var i : i32;",
-         "test.wgsl:1:9 error: expected '(' for group decoration\n"
-         "[[group 1]] var i : i32;\n"
-         "        ^\n");
+  EXPECT(
+      "@group 1) var i : i32;",
+      R"(test.wgsl:1:8 error: expected '(' for group decoration
+@group 1) var i : i32;
+       ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoGroupMissingRParen) {
-  EXPECT("[[group(1]] var i : i32;",
-         "test.wgsl:1:10 error: expected ')' for group decoration\n"
-         "[[group(1]] var i : i32;\n"
-         "         ^^\n");
+  EXPECT(
+      "@group(1 var i : i32;",
+      R"(test.wgsl:1:10 error: expected ')' for group decoration
+@group(1 var i : i32;
+         ^^^
+)");
+}
+
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest, DEPRECATED_GlobalDeclVarDecoGroupMissingLParen) {
+  EXPECT(
+      "[[group 1]] var i : i32;",
+      R"(test.wgsl:1:1 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+[[group 1]] var i : i32;
+^^
+
+test.wgsl:1:9 error: expected '(' for group decoration
+[[group 1]] var i : i32;
+        ^
+)");
+}
+
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplErrorTest, DEPRECATED_GlobalDeclVarDecoGroupMissingRParen) {
+  EXPECT(
+      "[[group(1]] var i : i32;",
+      R"(test.wgsl:1:1 warning: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+[[group(1]] var i : i32;
+^^
+
+test.wgsl:1:10 error: expected ')' for group decoration
+[[group(1]] var i : i32;
+         ^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarDecoBindingGroupValue) {
-  EXPECT("[[group(x)]] var i : i32;",
-         "test.wgsl:1:9 error: expected signed integer literal for group "
-         "decoration\n"
-         "[[group(x)]] var i : i32;\n"
-         "        ^\n");
+  EXPECT(
+      "@group(x) var i : i32;",
+      R"(test.wgsl:1:8 error: expected signed integer literal for group decoration
+@group(x) var i : i32;
+       ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarInvalidIdentifier) {
   EXPECT("var ^ : mat4x4;",
-         "test.wgsl:1:5 error: expected identifier for variable declaration\n"
-         "var ^ : mat4x4;\n"
-         "    ^\n");
+         R"(test.wgsl:1:5 error: expected identifier for variable declaration
+var ^ : mat4x4;
+    ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarMatrixMissingGreaterThan) {
-  EXPECT("var i : mat4x4<u32;",
-         "test.wgsl:1:19 error: expected '>' for matrix\n"
-         "var i : mat4x4<u32;\n"
-         "                  ^\n");
+  EXPECT("var i : mat4x4<u32;", R"(test.wgsl:1:19 error: expected '>' for matrix
+var i : mat4x4<u32;
+                  ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarMatrixMissingType) {
-  EXPECT("var i : mat4x4<1>;",
-         "test.wgsl:1:16 error: invalid type for matrix\n"
-         "var i : mat4x4<1>;\n"
-         "               ^\n");
+  EXPECT("var i : mat4x4<1>;", R"(test.wgsl:1:16 error: invalid type for matrix
+var i : mat4x4<1>;
+               ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarMissingSemicolon) {
   EXPECT("var i : i32",
-         "test.wgsl:1:12 error: expected ';' for variable declaration\n"
-         "var i : i32\n"
-         "           ^\n");
+         R"(test.wgsl:1:12 error: expected ';' for variable declaration
+var i : i32
+           ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarPtrMissingLessThan) {
   EXPECT("var i : ptr;",
-         "test.wgsl:1:12 error: expected '<' for ptr declaration\n"
-         "var i : ptr;\n"
-         "           ^\n");
+         R"(test.wgsl:1:12 error: expected '<' for ptr declaration
+var i : ptr;
+           ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarPtrMissingGreaterThan) {
   EXPECT("var i : ptr<private, u32;",
-         "test.wgsl:1:25 error: expected '>' for ptr declaration\n"
-         "var i : ptr<private, u32;\n"
-         "                        ^\n");
+         R"(test.wgsl:1:25 error: expected '>' for ptr declaration
+var i : ptr<private, u32;
+                        ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarPtrMissingComma) {
   EXPECT("var i : ptr<private u32>;",
-         "test.wgsl:1:21 error: expected ',' for ptr declaration\n"
-         "var i : ptr<private u32>;\n"
-         "                    ^^^\n");
+         R"(test.wgsl:1:21 error: expected ',' for ptr declaration
+var i : ptr<private u32>;
+                    ^^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarPtrMissingStorageClass) {
   EXPECT("var i : ptr<meow, u32>;",
-         "test.wgsl:1:13 error: invalid storage class for ptr declaration\n"
-         "var i : ptr<meow, u32>;\n"
-         "            ^^^^\n");
+         R"(test.wgsl:1:13 error: invalid storage class for ptr declaration
+var i : ptr<meow, u32>;
+            ^^^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarPtrMissingType) {
   EXPECT("var i : ptr<private, 1>;",
-         "test.wgsl:1:22 error: invalid type for ptr declaration\n"
-         "var i : ptr<private, 1>;\n"
-         "                     ^\n");
+         R"(test.wgsl:1:22 error: invalid type for ptr declaration
+var i : ptr<private, 1>;
+                     ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarAtomicMissingLessThan) {
   EXPECT("var i : atomic;",
-         "test.wgsl:1:15 error: expected '<' for atomic declaration\n"
-         "var i : atomic;\n"
-         "              ^\n");
+         R"(test.wgsl:1:15 error: expected '<' for atomic declaration
+var i : atomic;
+              ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarAtomicMissingGreaterThan) {
   EXPECT("var i : atomic<u32 x;",
-         "test.wgsl:1:20 error: expected '>' for atomic declaration\n"
-         "var i : atomic<u32 x;\n"
-         "                   ^\n");
+         R"(test.wgsl:1:20 error: expected '>' for atomic declaration
+var i : atomic<u32 x;
+                   ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarStorageDeclInvalidClass) {
   EXPECT("var<fish> i : i32",
-         "test.wgsl:1:5 error: invalid storage class for variable declaration\n"
-         "var<fish> i : i32\n"
-         "    ^^^^\n");
+         R"(test.wgsl:1:5 error: invalid storage class for variable declaration
+var<fish> i : i32
+    ^^^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarStorageDeclMissingGThan) {
   EXPECT("var<private i : i32",
-         "test.wgsl:1:13 error: expected '>' for variable declaration\n"
-         "var<private i : i32\n"
-         "            ^\n");
+         R"(test.wgsl:1:13 error: expected '>' for variable declaration
+var<private i : i32
+            ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarVectorMissingGreaterThan) {
-  EXPECT("var i : vec3<u32;",
-         "test.wgsl:1:17 error: expected '>' for vector\n"
-         "var i : vec3<u32;\n"
-         "                ^\n");
+  EXPECT("var i : vec3<u32;", R"(test.wgsl:1:17 error: expected '>' for vector
+var i : vec3<u32;
+                ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, GlobalDeclVarVectorMissingType) {
-  EXPECT("var i : vec3<1>;",
-         "test.wgsl:1:14 error: invalid type for vector\n"
-         "var i : vec3<1>;\n"
-         "             ^\n");
+  EXPECT("var i : vec3<1>;", R"(test.wgsl:1:14 error: invalid type for vector
+var i : vec3<1>;
+             ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, IfStmtMissingLParen) {
-  EXPECT("fn f() { if true) {} }",
-         "test.wgsl:1:13 error: expected '('\n"
-         "fn f() { if true) {} }\n"
-         "            ^^^^\n");
+  EXPECT("fn f() { if true) {} }", R"(test.wgsl:1:13 error: expected '('
+fn f() { if true) {} }
+            ^^^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, IfStmtMissingRParen) {
-  EXPECT("fn f() { if (true {} }",
-         "test.wgsl:1:19 error: expected ')'\n"
-         "fn f() { if (true {} }\n"
-         "                  ^\n");
+  EXPECT("fn f() { if (true {} }", R"(test.wgsl:1:19 error: expected ')'
+fn f() { if (true {} }
+                  ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, IfStmtInvalidCond) {
   EXPECT("fn f() { if (>) {} }",
-         "test.wgsl:1:14 error: unable to parse expression\n"
-         "fn f() { if (>) {} }\n"
-         "             ^\n");
+         R"(test.wgsl:1:14 error: unable to parse expression
+fn f() { if (>) {} }
+             ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, LogicalAndInvalidExpr) {
   EXPECT("fn f() { return 1 && >; }",
-         "test.wgsl:1:22 error: unable to parse right side of && expression\n"
-         "fn f() { return 1 && >; }\n"
-         "                     ^\n");
+         R"(test.wgsl:1:22 error: unable to parse right side of && expression
+fn f() { return 1 && >; }
+                     ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, LogicalOrInvalidExpr) {
   EXPECT("fn f() { return 1 || >; }",
-         "test.wgsl:1:22 error: unable to parse right side of || expression\n"
-         "fn f() { return 1 || >; }\n"
-         "                     ^\n");
+         R"(test.wgsl:1:22 error: unable to parse right side of || expression
+fn f() { return 1 || >; }
+                     ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, LoopMissingLBrace) {
-  EXPECT("fn f() { loop }",
-         "test.wgsl:1:15 error: expected '{' for loop\n"
-         "fn f() { loop }\n"
-         "              ^\n");
+  EXPECT("fn f() { loop }", R"(test.wgsl:1:15 error: expected '{' for loop
+fn f() { loop }
+              ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, LoopMissingRBrace) {
-  EXPECT("fn f() { loop {",
-         "test.wgsl:1:16 error: expected '}' for loop\n"
-         "fn f() { loop {\n"
-         "               ^\n");
+  EXPECT("fn f() { loop {", R"(test.wgsl:1:16 error: expected '}' for loop
+fn f() { loop {
+               ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, MaxErrorsReached) {
-  EXPECT("x; x; x; x; x; x; x; x;",
-         "test.wgsl:1:1 error: unexpected token\n"
-         "x; x; x; x; x; x; x; x;\n"
-         "^\n\n"
-         "test.wgsl:1:4 error: unexpected token\n"
-         "x; x; x; x; x; x; x; x;\n"
-         "   ^\n\n"
-         "test.wgsl:1:7 error: unexpected token\n"
-         "x; x; x; x; x; x; x; x;\n"
-         "      ^\n\n"
-         "test.wgsl:1:10 error: unexpected token\n"
-         "x; x; x; x; x; x; x; x;\n"
-         "         ^\n\n"
-         "test.wgsl:1:13 error: unexpected token\n"
-         "x; x; x; x; x; x; x; x;\n"
-         "            ^\n\n"
-         "test.wgsl error: stopping after 5 errors");
+  EXPECT("x; x; x; x; x; x; x; x;", R"(test.wgsl:1:1 error: unexpected token
+x; x; x; x; x; x; x; x;
+^
+
+test.wgsl:1:4 error: unexpected token
+x; x; x; x; x; x; x; x;
+   ^
+
+test.wgsl:1:7 error: unexpected token
+x; x; x; x; x; x; x; x;
+      ^
+
+test.wgsl:1:10 error: unexpected token
+x; x; x; x; x; x; x; x;
+         ^
+
+test.wgsl:1:13 error: unexpected token
+x; x; x; x; x; x; x; x;
+            ^
+
+test.wgsl error: stopping after 5 errors)");
 }
 
 TEST_F(ParserImplErrorTest, MemberExprMissingIdentifier) {
   EXPECT("fn f() { x = a.; }",
-         "test.wgsl:1:16 error: expected identifier for member accessor\n"
-         "fn f() { x = a.; }\n"
-         "               ^\n");
+         R"(test.wgsl:1:16 error: expected identifier for member accessor
+fn f() { x = a.; }
+               ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, MultiplicativeInvalidExpr) {
   EXPECT("fn f() { return 1.0 * <; }",
-         "test.wgsl:1:23 error: unable to parse right side of * expression\n"
-         "fn f() { return 1.0 * <; }\n"
-         "                      ^\n");
+         R"(test.wgsl:1:23 error: unable to parse right side of * expression
+fn f() { return 1.0 * <; }
+                      ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, OrInvalidExpr) {
   EXPECT("fn f() { return 1 | >; }",
-         "test.wgsl:1:21 error: unable to parse right side of | expression\n"
-         "fn f() { return 1 | >; }\n"
-         "                    ^\n");
+         R"(test.wgsl:1:21 error: unable to parse right side of | expression
+fn f() { return 1 | >; }
+                    ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, RelationalInvalidExpr) {
   EXPECT("fn f() { return 1 < >; }",
-         "test.wgsl:1:21 error: unable to parse right side of < expression\n"
-         "fn f() { return 1 < >; }\n"
-         "                    ^\n");
+         R"(test.wgsl:1:21 error: unable to parse right side of < expression
+fn f() { return 1 < >; }
+                    ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, ReturnStmtMissingSemicolon) {
   EXPECT("fn f() { return }",
-         "test.wgsl:1:17 error: expected ';' for return statement\n"
-         "fn f() { return }\n"
-         "                ^\n");
+         R"(test.wgsl:1:17 error: expected ';' for return statement
+fn f() { return }
+                ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, ShiftInvalidExpr) {
   EXPECT("fn f() { return 1 << >; }",
-         "test.wgsl:1:22 error: unable to parse right side of << expression\n"
-         "fn f() { return 1 << >; }\n"
-         "                     ^\n");
+         R"(test.wgsl:1:22 error: unable to parse right side of << expression
+fn f() { return 1 << >; }
+                     ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, SwitchStmtMissingLBrace) {
   EXPECT("fn f() { switch(1) }",
-         "test.wgsl:1:20 error: expected '{' for switch statement\n"
-         "fn f() { switch(1) }\n"
-         "                   ^\n");
+         R"(test.wgsl:1:20 error: expected '{' for switch statement
+fn f() { switch(1) }
+                   ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, SwitchStmtMissingRBrace) {
   EXPECT("fn f() { switch(1) {",
-         "test.wgsl:1:21 error: expected '}' for switch statement\n"
-         "fn f() { switch(1) {\n"
-         "                    ^\n");
+         R"(test.wgsl:1:21 error: expected '}' for switch statement
+fn f() { switch(1) {
+                    ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, SwitchStmtInvalidCase) {
   EXPECT("fn f() { switch(1) { case ^: } }",
-         "test.wgsl:1:27 error: unable to parse case selectors\n"
-         "fn f() { switch(1) { case ^: } }\n"
-         "                          ^\n");
+         R"(test.wgsl:1:27 error: unable to parse case selectors
+fn f() { switch(1) { case ^: } }
+                          ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, SwitchStmtInvalidCase2) {
-  EXPECT(
-      "fn f() { switch(1) { case false: } }",
-      "test.wgsl:1:27 error: invalid case selector must be an integer value\n"
-      "fn f() { switch(1) { case false: } }\n"
-      "                          ^^^^^\n");
+  EXPECT("fn f() { switch(1) { case false: } }",
+         R"(test.wgsl:1:27 error: invalid case selector must be an integer value
+fn f() { switch(1) { case false: } }
+                          ^^^^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, SwitchStmtCaseMissingColon) {
   EXPECT("fn f() { switch(1) { case 1 {} } }",
-         "test.wgsl:1:29 error: expected ':' for case statement\n"
-         "fn f() { switch(1) { case 1 {} } }\n"
-         "                            ^\n");
+         R"(test.wgsl:1:29 error: expected ':' for case statement
+fn f() { switch(1) { case 1 {} } }
+                            ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, SwitchStmtCaseMissingLBrace) {
   EXPECT("fn f() { switch(1) { case 1: } }",
-         "test.wgsl:1:30 error: expected '{' for case statement\n"
-         "fn f() { switch(1) { case 1: } }\n"
-         "                             ^\n");
+         R"(test.wgsl:1:30 error: expected '{' for case statement
+fn f() { switch(1) { case 1: } }
+                             ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, SwitchStmtCaseMissingRBrace) {
   EXPECT("fn f() { switch(1) { case 1: {",
-         "test.wgsl:1:31 error: expected '}' for case statement\n"
-         "fn f() { switch(1) { case 1: {\n"
-         "                              ^\n");
+         R"(test.wgsl:1:31 error: expected '}' for case statement
+fn f() { switch(1) { case 1: {
+                              ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, SwitchStmtCaseFallthroughMissingSemicolon) {
   EXPECT("fn f() { switch(1) { case 1: { fallthrough } case 2: {} } }",
-         "test.wgsl:1:44 error: expected ';' for fallthrough statement\n"
-         "fn f() { switch(1) { case 1: { fallthrough } case 2: {} } }\n"
-         "                                           ^\n");
+         R"(test.wgsl:1:44 error: expected ';' for fallthrough statement
+fn f() { switch(1) { case 1: { fallthrough } case 2: {} } }
+                                           ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, VarStmtMissingSemicolon) {
   EXPECT("fn f() { var a : u32 }",
-         "test.wgsl:1:22 error: expected ';' for variable declaration\n"
-         "fn f() { var a : u32 }\n"
-         "                     ^\n");
+         R"(test.wgsl:1:22 error: expected ';' for variable declaration
+fn f() { var a : u32 }
+                     ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, VarStmtInvalidAssignment) {
   EXPECT("fn f() { var a : u32 = >; }",
-         "test.wgsl:1:24 error: missing constructor for variable declaration\n"
-         "fn f() { var a : u32 = >; }\n"
-         "                       ^\n");
+         R"(test.wgsl:1:24 error: missing constructor for variable declaration
+fn f() { var a : u32 = >; }
+                       ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, UnaryInvalidExpr) {
   EXPECT("fn f() { return !<; }",
-         "test.wgsl:1:18 error: unable to parse right side of ! expression\n"
-         "fn f() { return !<; }\n"
-         "                 ^\n");
+         R"(test.wgsl:1:18 error: unable to parse right side of ! expression
+fn f() { return !<; }
+                 ^
+)");
 }
 
 TEST_F(ParserImplErrorTest, UnexpectedToken) {
-  EXPECT("unexpected",
-         "test.wgsl:1:1 error: unexpected token\n"
-         "unexpected\n"
-         "^^^^^^^^^^\n");
+  EXPECT("unexpected", R"(test.wgsl:1:1 error: unexpected token
+unexpected
+^^^^^^^^^^
+)");
 }
 
 TEST_F(ParserImplErrorTest, XorInvalidExpr) {
   EXPECT("fn f() { return 1 ^ >; }",
-         "test.wgsl:1:21 error: unable to parse right side of ^ expression\n"
-         "fn f() { return 1 ^ >; }\n"
-         "                    ^\n");
+         R"(test.wgsl:1:21 error: unable to parse right side of ^ expression
+fn f() { return 1 ^ >; }
+                    ^
+)");
 }
 
 }  // namespace
diff --git a/src/reader/wgsl/parser_impl_error_resync_test.cc b/src/reader/wgsl/parser_impl_error_resync_test.cc
index db31ce3..04ae887 100644
--- a/src/reader/wgsl/parser_impl_error_resync_test.cc
+++ b/src/reader/wgsl/parser_impl_error_resync_test.cc
@@ -40,32 +40,29 @@
   EXPECT(R"(
 fn .() -> . {}
 fn x(.) {}
-[[.,.]] fn -> {}
+@_ fn -> {}
 fn good() {}
 )",
-         "test.wgsl:2:4 error: expected identifier for function declaration\n"
-         "fn .() -> . {}\n"
-         "   ^\n"
-         "\n"
-         "test.wgsl:2:11 error: unable to determine function return type\n"
-         "fn .() -> . {}\n"
-         "          ^\n"
-         "\n"
-         "test.wgsl:3:6 error: expected ')' for function declaration\n"
-         "fn x(.) {}\n"
-         "     ^\n"
-         "\n"
-         "test.wgsl:4:3 error: expected decoration\n"
-         "[[.,.]] fn -> {}\n"
-         "  ^\n"
-         "\n"
-         "test.wgsl:4:5 error: expected decoration\n"
-         "[[.,.]] fn -> {}\n"
-         "    ^\n"
-         "\n"
-         "test.wgsl:4:12 error: expected identifier for function declaration\n"
-         "[[.,.]] fn -> {}\n"
-         "           ^^\n");
+         R"(test.wgsl:2:4 error: expected identifier for function declaration
+fn .() -> . {}
+   ^
+
+test.wgsl:2:11 error: unable to determine function return type
+fn .() -> . {}
+          ^
+
+test.wgsl:3:6 error: expected ')' for function declaration
+fn x(.) {}
+     ^
+
+test.wgsl:4:2 error: expected decoration
+@_ fn -> {}
+ ^
+
+test.wgsl:4:7 error: expected identifier for function declaration
+@_ fn -> {}
+      ^^
+)");
 }
 
 TEST_F(ParserImplErrorResyncTest, AssignmentStatement) {
@@ -78,17 +75,18 @@
   good = 1;
 }
 )",
-         "test.wgsl:3:8 error: expected '=' for assignment\n"
-         "  blah blah blah blah;\n"
-         "       ^^^^\n"
-         "\n"
-         "test.wgsl:5:8 error: expected '=' for assignment\n"
-         "  blah blah blah blah;\n"
-         "       ^^^^\n"
-         "\n"
-         "test.wgsl:6:7 error: unable to parse right side of assignment\n"
-         "  x = .;\n"
-         "      ^\n");
+         R"(test.wgsl:3:8 error: expected '=' for assignment
+  blah blah blah blah;
+       ^^^^
+
+test.wgsl:5:8 error: expected '=' for assignment
+  blah blah blah blah;
+       ^^^^
+
+test.wgsl:6:7 error: unable to parse right side of assignment
+  x = .;
+      ^
+)");
 }
 
 TEST_F(ParserImplErrorResyncTest, DiscardStatement) {
@@ -99,13 +97,14 @@
   discard blah blah blah;
 }
 )",
-         "test.wgsl:3:11 error: expected ';' for discard statement\n"
-         "  discard blah blah blah;\n"
-         "          ^^^^\n"
-         "\n"
-         "test.wgsl:5:11 error: expected ';' for discard statement\n"
-         "  discard blah blah blah;\n"
-         "          ^^^^\n");
+         R"(test.wgsl:3:11 error: expected ';' for discard statement
+  discard blah blah blah;
+          ^^^^
+
+test.wgsl:5:11 error: expected ';' for discard statement
+  discard blah blah blah;
+          ^^^^
+)");
 }
 
 TEST_F(ParserImplErrorResyncTest, StructMembers) {
@@ -115,21 +114,22 @@
     a : i32;
     blah blah blah;
     b : i32;
-    [[]] x : i32;
+    @- x : i32;
     c : i32;
 }
 )",
-         "test.wgsl:3:10 error: expected ':' for struct member\n"
-         "    blah blah blah;\n"
-         "         ^^^^\n"
-         "\n"
-         "test.wgsl:5:10 error: expected ':' for struct member\n"
-         "    blah blah blah;\n"
-         "         ^^^^\n"
-         "\n"
-         "test.wgsl:7:7 error: empty decoration list\n"
-         "    [[]] x : i32;\n"
-         "      ^^\n");
+         R"(test.wgsl:3:10 error: expected ':' for struct member
+    blah blah blah;
+         ^^^^
+
+test.wgsl:5:10 error: expected ':' for struct member
+    blah blah blah;
+         ^^^^
+
+test.wgsl:7:6 error: expected decoration
+    @- x : i32;
+     ^
+)");
 }
 
 // Check that the forward scan in resynchronize() stop at nested sync points.
@@ -144,38 +144,36 @@
 }
 struct S { blah };
 )",
-         "test.wgsl:5:1 error: expected ';' for discard statement\n"
-         "}\n"
-         "^\n"
-         "\n"
-         "test.wgsl:6:17 error: expected ':' for struct member\n"
-         "struct S { blah };\n"
-         "                ^\n");
+         R"(test.wgsl:5:1 error: expected ';' for discard statement
+}
+^
+
+test.wgsl:6:17 error: expected ':' for struct member
+struct S { blah };
+                ^
+)");
 }
 
 TEST_F(ParserImplErrorResyncTest, BracketCounting) {
-  EXPECT(R"(
-[[woof[[[[]]]]]]
+  EXPECT(
+      R"(
 fn f(x(((())))) {
   meow = {{{}}}
 }
 struct S { blah };
 )",
-         "test.wgsl:2:3 error: expected decoration\n"
-         "[[woof[[[[]]]]]]\n"
-         "  ^^^^\n"
-         "\n"
-         "test.wgsl:3:7 error: expected ':' for parameter\n"
-         "fn f(x(((())))) {\n"
-         "      ^\n"
-         "\n"
-         "test.wgsl:4:10 error: unable to parse right side of assignment\n"
-         "  meow = {{{}}}\n"
-         "         ^\n"
-         "\n"
-         "test.wgsl:6:17 error: expected ':' for struct member\n"
-         "struct S { blah };\n"
-         "                ^\n");
+      R"(test.wgsl:2:7 error: expected ':' for parameter
+fn f(x(((())))) {
+      ^
+
+test.wgsl:3:10 error: unable to parse right side of assignment
+  meow = {{{}}}
+         ^
+
+test.wgsl:5:17 error: expected ':' for struct member
+struct S { blah };
+                ^
+)");
 }
 
 }  // namespace
diff --git a/src/reader/wgsl/parser_impl_function_decl_test.cc b/src/reader/wgsl/parser_impl_function_decl_test.cc
index d593c22..5a59562 100644
--- a/src/reader/wgsl/parser_impl_function_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_function_decl_test.cc
@@ -49,7 +49,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecl_DecorationList) {
-  auto p = parser("[[workgroup_size(2, 3, 4)]] fn main() { return; }");
+  auto p = parser("@workgroup_size(2, 3, 4) fn main() { return; }");
   auto decos = p->decoration_list();
   EXPECT_FALSE(p->has_error()) << p->error();
   ASSERT_FALSE(decos.errored);
@@ -87,7 +87,7 @@
 
 TEST_F(ParserImplTest, FunctionDecl_DecorationList_MultipleEntries) {
   auto p = parser(R"(
-[[workgroup_size(2, 3, 4), stage(compute)]]
+@workgroup_size(2, 3, 4) @stage(compute)
 fn main() { return; })");
   auto decos = p->decoration_list();
   EXPECT_FALSE(p->has_error()) << p->error();
@@ -130,8 +130,8 @@
 
 TEST_F(ParserImplTest, FunctionDecl_DecorationList_MultipleLists) {
   auto p = parser(R"(
-[[workgroup_size(2, 3, 4)]]
-[[stage(compute)]]
+@workgroup_size(2, 3, 4)
+@stage(compute)
 fn main() { return; })");
   auto decorations = p->decoration_list();
   EXPECT_FALSE(p->has_error()) << p->error();
@@ -173,7 +173,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionDecl_ReturnTypeDecorationList) {
-  auto p = parser("fn main() -> [[location(1)]] f32 { return 1.0; }");
+  auto p = parser("fn main() -> @location(1) f32 { return 1.0; }");
   auto decos = p->decoration_list();
   EXPECT_FALSE(p->has_error()) << p->error();
   ASSERT_FALSE(decos.errored);
diff --git a/src/reader/wgsl/parser_impl_function_decoration_list_test.cc b/src/reader/wgsl/parser_impl_function_decoration_list_test.cc
index 9f5b0b6..8fd6760 100644
--- a/src/reader/wgsl/parser_impl_function_decoration_list_test.cc
+++ b/src/reader/wgsl/parser_impl_function_decoration_list_test.cc
@@ -21,7 +21,7 @@
 namespace {
 
 TEST_F(ParserImplTest, DecorationList_Parses) {
-  auto p = parser("[[workgroup_size(2), stage(compute)]]");
+  auto p = parser("@workgroup_size(2) @stage(compute)");
   auto decos = p->decoration_list();
   EXPECT_FALSE(p->has_error()) << p->error();
   EXPECT_FALSE(decos.errored);
@@ -46,23 +46,14 @@
             ast::PipelineStage::kCompute);
 }
 
-TEST_F(ParserImplTest, DecorationList_Empty) {
-  auto p = parser("[[]]");
-  auto decos = p->decoration_list();
-  EXPECT_TRUE(p->has_error());
-  EXPECT_TRUE(decos.errored);
-  EXPECT_FALSE(decos.matched);
-  EXPECT_EQ(p->error(), "1:3: empty decoration list");
-}
-
 TEST_F(ParserImplTest, DecorationList_Invalid) {
-  auto p = parser("[[invalid]]");
+  auto p = parser("@invalid");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
   EXPECT_FALSE(decos.matched);
   EXPECT_TRUE(decos.value.empty());
-  EXPECT_EQ(p->error(), "1:3: expected decoration");
+  EXPECT_EQ(p->error(), "1:2: expected decoration");
 }
 
 TEST_F(ParserImplTest, DecorationList_ExtraComma) {
@@ -71,34 +62,98 @@
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
   EXPECT_FALSE(decos.matched);
-  EXPECT_EQ(p->error(), "1:22: expected decoration");
+  EXPECT_EQ(
+      p->error(),
+      R"(1:1: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:22: expected decoration)");
 }
 
-TEST_F(ParserImplTest, DecorationList_MissingComma) {
+TEST_F(ParserImplTest, DecorationList_BadDecoration) {
+  auto p = parser("@stage()");
+  auto decos = p->decoration_list();
+  EXPECT_TRUE(p->has_error());
+  EXPECT_TRUE(decos.errored);
+  EXPECT_FALSE(decos.matched);
+  EXPECT_EQ(p->error(), "1:8: invalid value for stage decoration");
+}
+
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest, DEPRECATED_DecorationList_Empty) {
+  auto p = parser("[[]]");
+  auto decos = p->decoration_list();
+  EXPECT_TRUE(p->has_error());
+  EXPECT_TRUE(decos.errored);
+  EXPECT_FALSE(decos.matched);
+  EXPECT_EQ(
+      p->error(),
+      R"(1:1: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:3: empty decoration list)");
+}
+
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest, DEPRECATED_DecorationList_Invalid) {
+  auto p = parser("[[invalid]]");
+  auto decos = p->decoration_list();
+  EXPECT_TRUE(p->has_error());
+  EXPECT_TRUE(decos.errored);
+  EXPECT_FALSE(decos.matched);
+  EXPECT_TRUE(decos.value.empty());
+  EXPECT_EQ(
+      p->error(),
+      R"(1:1: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:3: expected decoration)");
+}
+
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest, DEPRECATED_DecorationList_ExtraComma) {
+  auto p = parser("[[workgroup_size(2), ]]");
+  auto decos = p->decoration_list();
+  EXPECT_TRUE(p->has_error());
+  EXPECT_TRUE(decos.errored);
+  EXPECT_FALSE(decos.matched);
+  EXPECT_EQ(
+      p->error(),
+      R"(1:1: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:22: expected decoration)");
+}
+
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest, DEPRECATED_DecorationList_MissingComma) {
   auto p = parser("[[workgroup_size(2) workgroup_size(2)]]");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
   EXPECT_FALSE(decos.matched);
-  EXPECT_EQ(p->error(), "1:21: expected ',' for decoration list");
+  EXPECT_EQ(
+      p->error(),
+      R"(1:1: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:21: expected ',' for decoration list)");
 }
 
-TEST_F(ParserImplTest, DecorationList_BadDecoration) {
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest, DEPRECATED_DecorationList_BadDecoration) {
   auto p = parser("[[stage()]]");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
   EXPECT_FALSE(decos.matched);
-  EXPECT_EQ(p->error(), "1:9: invalid value for stage decoration");
+  EXPECT_EQ(
+      p->error(),
+      R"(1:1: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:9: invalid value for stage decoration)");
 }
 
-TEST_F(ParserImplTest, DecorationList_MissingRightAttr) {
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest, DEPRECATED_DecorationList_MissingRightAttr) {
   auto p = parser("[[workgroup_size(2), workgroup_size(3, 4, 5)");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
   EXPECT_FALSE(decos.matched);
-  EXPECT_EQ(p->error(), "1:45: expected ']]' for decoration list");
+  EXPECT_EQ(
+      p->error(),
+      R"(1:1: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:45: expected ']]' for decoration list)");
 }
 
 }  // namespace
diff --git a/src/reader/wgsl/parser_impl_function_header_test.cc b/src/reader/wgsl/parser_impl_function_header_test.cc
index 369e8d0..00d3136 100644
--- a/src/reader/wgsl/parser_impl_function_header_test.cc
+++ b/src/reader/wgsl/parser_impl_function_header_test.cc
@@ -46,7 +46,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionHeader_DecoratedReturnType) {
-  auto p = parser("fn main() -> [[location(1)]] f32");
+  auto p = parser("fn main() -> @location(1) f32");
   auto f = p->function_header();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(f.matched);
@@ -76,7 +76,7 @@
 }
 
 TEST_F(ParserImplTest, FunctionHeader_DecoratedReturnType_WithArrayStride) {
-  auto p = parser("fn main() -> [[location(1), stride(16)]] array<f32, 4>");
+  auto p = parser("fn main() -> @location(1) @stride(16) array<f32, 4>");
   auto f = p->function_header();
   ASSERT_FALSE(p->has_error()) << p->error();
   EXPECT_TRUE(f.matched);
diff --git a/src/reader/wgsl/parser_impl_global_constant_decl_test.cc b/src/reader/wgsl/parser_impl_global_constant_decl_test.cc
index 2c4cd54..74c2557 100644
--- a/src/reader/wgsl/parser_impl_global_constant_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_global_constant_decl_test.cc
@@ -102,7 +102,7 @@
 }
 
 TEST_F(ParserImplTest, GlobalConstantDec_Override_WithId) {
-  auto p = parser("[[override(7)]] let a : f32 = 1.");
+  auto p = parser("@override(7) let a : f32 = 1.");
   auto decos = p->decoration_list();
   EXPECT_FALSE(decos.errored);
   EXPECT_TRUE(decos.matched);
@@ -119,9 +119,9 @@
   EXPECT_TRUE(e->type->Is<ast::F32>());
 
   EXPECT_EQ(e->source.range.begin.line, 1u);
-  EXPECT_EQ(e->source.range.begin.column, 21u);
+  EXPECT_EQ(e->source.range.begin.column, 18u);
   EXPECT_EQ(e->source.range.end.line, 1u);
-  EXPECT_EQ(e->source.range.end.column, 22u);
+  EXPECT_EQ(e->source.range.end.column, 19u);
 
   ASSERT_NE(e->constructor, nullptr);
   EXPECT_TRUE(e->constructor->Is<ast::LiteralExpression>());
@@ -165,7 +165,7 @@
 }
 
 TEST_F(ParserImplTest, GlobalConstantDec_Override_MissingId) {
-  auto p = parser("[[override()]] let a : f32 = 1.");
+  auto p = parser("@override() let a : f32 = 1.");
   auto decos = p->decoration_list();
   EXPECT_TRUE(decos.errored);
   EXPECT_FALSE(decos.matched);
@@ -177,11 +177,11 @@
 
   EXPECT_TRUE(p->has_error());
   EXPECT_EQ(p->error(),
-            "1:12: expected signed integer literal for override decoration");
+            "1:11: expected signed integer literal for override decoration");
 }
 
 TEST_F(ParserImplTest, GlobalConstantDec_Override_InvalidId) {
-  auto p = parser("[[override(-7)]] let a : f32 = 1.");
+  auto p = parser("@override(-7) let a : f32 = 1.");
   auto decos = p->decoration_list();
   EXPECT_TRUE(decos.errored);
   EXPECT_FALSE(decos.matched);
@@ -192,7 +192,7 @@
   ASSERT_NE(e.value, nullptr);
 
   EXPECT_TRUE(p->has_error());
-  EXPECT_EQ(p->error(), "1:12: override decoration must be positive");
+  EXPECT_EQ(p->error(), "1:11: override decoration must be positive");
 }
 
 }  // namespace
diff --git a/src/reader/wgsl/parser_impl_global_decl_test.cc b/src/reader/wgsl/parser_impl_global_decl_test.cc
index d880e4a..fe8b24d 100644
--- a/src/reader/wgsl/parser_impl_global_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_global_decl_test.cc
@@ -132,7 +132,7 @@
 }
 
 TEST_F(ParserImplTest, GlobalDecl_Function_WithDecoration) {
-  auto p = parser("[[workgroup_size(2)]] fn main() { return; }");
+  auto p = parser("@workgroup_size(2) fn main() { return; }");
   p->expect_global_decl();
   ASSERT_FALSE(p->has_error()) << p->error();
 
@@ -167,7 +167,7 @@
 }
 
 TEST_F(ParserImplTest, GlobalDecl_Struct_WithStride) {
-  auto p = parser("struct A { data: [[stride(4)]] array<f32>; }");
+  auto p = parser("struct A { data: @stride(4) array<f32>; }");
 
   p->expect_global_decl();
   ASSERT_FALSE(p->has_error()) << p->error();
diff --git a/src/reader/wgsl/parser_impl_global_variable_decl_test.cc b/src/reader/wgsl/parser_impl_global_variable_decl_test.cc
index d79a8ae..52cc75b 100644
--- a/src/reader/wgsl/parser_impl_global_variable_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_global_variable_decl_test.cc
@@ -67,7 +67,7 @@
 }
 
 TEST_F(ParserImplTest, GlobalVariableDecl_WithDecoration) {
-  auto p = parser("[[binding(2), group(1)]] var<uniform> a : f32");
+  auto p = parser("@binding(2) @group(1) var<uniform> a : f32");
   auto decos = p->decoration_list();
   EXPECT_FALSE(decos.errored);
   EXPECT_TRUE(decos.matched);
@@ -83,9 +83,9 @@
   EXPECT_EQ(e->declared_storage_class, ast::StorageClass::kUniform);
 
   EXPECT_EQ(e->source.range.begin.line, 1u);
-  EXPECT_EQ(e->source.range.begin.column, 39u);
+  EXPECT_EQ(e->source.range.begin.column, 36u);
   EXPECT_EQ(e->source.range.end.line, 1u);
-  EXPECT_EQ(e->source.range.end.column, 40u);
+  EXPECT_EQ(e->source.range.end.column, 37u);
 
   ASSERT_EQ(e->constructor, nullptr);
 
@@ -96,7 +96,7 @@
 }
 
 TEST_F(ParserImplTest, GlobalVariableDecl_WithDecoration_MulitpleGroups) {
-  auto p = parser("[[binding(2)]] [[group(1)]] var<uniform> a : f32");
+  auto p = parser("@binding(2) @group(1) var<uniform> a : f32");
   auto decos = p->decoration_list();
   EXPECT_FALSE(decos.errored);
   EXPECT_TRUE(decos.matched);
@@ -113,9 +113,9 @@
   EXPECT_EQ(e->declared_storage_class, ast::StorageClass::kUniform);
 
   EXPECT_EQ(e->source.range.begin.line, 1u);
-  EXPECT_EQ(e->source.range.begin.column, 42u);
+  EXPECT_EQ(e->source.range.begin.column, 36u);
   EXPECT_EQ(e->source.range.end.line, 1u);
-  EXPECT_EQ(e->source.range.end.column, 43u);
+  EXPECT_EQ(e->source.range.end.column, 37u);
 
   ASSERT_EQ(e->constructor, nullptr);
 
@@ -126,7 +126,7 @@
 }
 
 TEST_F(ParserImplTest, GlobalVariableDecl_InvalidDecoration) {
-  auto p = parser("[[binding()]] var<uniform> a : f32");
+  auto p = parser("@binding() var<uniform> a : f32");
   auto decos = p->decoration_list();
   EXPECT_TRUE(decos.errored);
   EXPECT_FALSE(decos.matched);
@@ -138,7 +138,7 @@
 
   EXPECT_TRUE(p->has_error());
   EXPECT_EQ(p->error(),
-            "1:11: expected signed integer literal for binding decoration");
+            "1:10: expected signed integer literal for binding decoration");
 }
 
 TEST_F(ParserImplTest, GlobalVariableDecl_InvalidConstExpr) {
diff --git a/src/reader/wgsl/parser_impl_param_list_test.cc b/src/reader/wgsl/parser_impl_param_list_test.cc
index e29725fc..d8e9b31 100644
--- a/src/reader/wgsl/parser_impl_param_list_test.cc
+++ b/src/reader/wgsl/parser_impl_param_list_test.cc
@@ -92,9 +92,8 @@
 }
 
 TEST_F(ParserImplTest, ParamList_Decorations) {
-  auto p = parser(
-      "[[builtin(position)]] coord : vec4<f32>, "
-      "[[location(1)]] loc1 : f32");
+  auto p =
+      parser("@builtin(position) coord : vec4<f32>, @location(1) loc1 : f32");
 
   auto e = p->expect_param_list();
   ASSERT_FALSE(p->has_error()) << p->error();
@@ -113,9 +112,9 @@
             ast::Builtin::kPosition);
 
   ASSERT_EQ(e.value[0]->source.range.begin.line, 1u);
-  ASSERT_EQ(e.value[0]->source.range.begin.column, 23u);
+  ASSERT_EQ(e.value[0]->source.range.begin.column, 20u);
   ASSERT_EQ(e.value[0]->source.range.end.line, 1u);
-  ASSERT_EQ(e.value[0]->source.range.end.column, 28u);
+  ASSERT_EQ(e.value[0]->source.range.end.column, 25u);
 
   EXPECT_EQ(e.value[1]->symbol, p->builder().Symbols().Get("loc1"));
   EXPECT_TRUE(e.value[1]->type->Is<ast::F32>());
@@ -125,10 +124,10 @@
   EXPECT_TRUE(decos1[0]->Is<ast::LocationDecoration>());
   EXPECT_EQ(decos1[0]->As<ast::LocationDecoration>()->value, 1u);
 
-  ASSERT_EQ(e.value[1]->source.range.begin.line, 1u);
-  ASSERT_EQ(e.value[1]->source.range.begin.column, 58u);
-  ASSERT_EQ(e.value[1]->source.range.end.line, 1u);
-  ASSERT_EQ(e.value[1]->source.range.end.column, 62u);
+  EXPECT_EQ(e.value[1]->source.range.begin.line, 1u);
+  EXPECT_EQ(e.value[1]->source.range.begin.column, 52u);
+  EXPECT_EQ(e.value[1]->source.range.end.line, 1u);
+  EXPECT_EQ(e.value[1]->source.range.end.column, 56u);
 }
 
 }  // namespace
diff --git a/src/reader/wgsl/parser_impl_struct_body_decl_test.cc b/src/reader/wgsl/parser_impl_struct_body_decl_test.cc
index 729fac4..86c2954 100644
--- a/src/reader/wgsl/parser_impl_struct_body_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_struct_body_decl_test.cc
@@ -46,25 +46,25 @@
 TEST_F(ParserImplTest, StructBodyDecl_InvalidAlign) {
   auto p = parser(R"(
 {
-  [[align(nan)]] a : i32;
+  @align(nan) a : i32;
 })");
   auto m = p->expect_struct_body_decl();
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(m.errored);
   EXPECT_EQ(p->error(),
-            "3:11: expected signed integer literal for align decoration");
+            "3:10: expected signed integer literal for align decoration");
 }
 
 TEST_F(ParserImplTest, StructBodyDecl_InvalidSize) {
   auto p = parser(R"(
 {
-  [[size(nan)]] a : i32;
+  @size(nan) a : i32;
 })");
   auto m = p->expect_struct_body_decl();
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(m.errored);
   EXPECT_EQ(p->error(),
-            "3:10: expected signed integer literal for size decoration");
+            "3:9: expected signed integer literal for size decoration");
 }
 
 TEST_F(ParserImplTest, StructBodyDecl_MissingClosingBracket) {
diff --git a/src/reader/wgsl/parser_impl_struct_decl_test.cc b/src/reader/wgsl/parser_impl_struct_decl_test.cc
index 8d411ff..aa930d3 100644
--- a/src/reader/wgsl/parser_impl_struct_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_struct_decl_test.cc
@@ -154,7 +154,8 @@
   EXPECT_TRUE(p->has_error());
   EXPECT_EQ(
       p->error(),
-      R"(1:3: use of deprecated language feature: [[block]] attributes have been removed from WGSL
+      R"(1:1: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:3: use of deprecated language feature: [[block]] attributes have been removed from WGSL
 1:9: expected ']]' for decoration list)");
 }
 
diff --git a/src/reader/wgsl/parser_impl_struct_decoration_decl_test.cc b/src/reader/wgsl/parser_impl_struct_decoration_decl_test.cc
index 655bb19..b4acaed 100644
--- a/src/reader/wgsl/parser_impl_struct_decoration_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_struct_decoration_decl_test.cc
@@ -21,6 +21,60 @@
 namespace {
 
 TEST_F(ParserImplTest, DecorationDecl_Parses) {
+  auto p = parser("@override");
+  auto decos = p->decoration_list();
+  EXPECT_FALSE(p->has_error());
+  EXPECT_FALSE(decos.errored);
+  EXPECT_TRUE(decos.matched);
+  ASSERT_EQ(decos.value.size(), 1u);
+  auto* override_deco = decos.value[0]->As<ast::Decoration>();
+  EXPECT_TRUE(override_deco->Is<ast::OverrideDecoration>());
+}
+
+TEST_F(ParserImplTest, DecorationDecl_MissingParenLeft) {
+  auto p = parser("@location 1)");
+  auto decos = p->decoration_list();
+  EXPECT_TRUE(p->has_error());
+  EXPECT_TRUE(decos.errored);
+  EXPECT_FALSE(decos.matched);
+  EXPECT_TRUE(decos.value.empty());
+  EXPECT_EQ(p->error(),
+            "1:11: expected '(' for location decoration");
+}
+
+TEST_F(ParserImplTest, DecorationDecl_MissingValue) {
+  auto p = parser("@location()");
+  auto decos = p->decoration_list();
+  EXPECT_TRUE(p->has_error());
+  EXPECT_TRUE(decos.errored);
+  EXPECT_FALSE(decos.matched);
+  EXPECT_TRUE(decos.value.empty());
+  EXPECT_EQ(p->error(),
+            "1:11: expected signed integer literal for location decoration");
+}
+
+TEST_F(ParserImplTest, DecorationDecl_MissingParenRight) {
+  auto p = parser("@location(1");
+  auto decos = p->decoration_list();
+  EXPECT_TRUE(p->has_error());
+  EXPECT_TRUE(decos.errored);
+  EXPECT_FALSE(decos.matched);
+  EXPECT_TRUE(decos.value.empty());
+  EXPECT_EQ(p->error(),
+            "1:12: expected ')' for location decoration");
+}
+
+TEST_F(ParserImplTest, DecorationDecl_InvalidDecoration) {
+  auto p = parser("@invalid");
+  auto decos = p->decoration_list();
+  EXPECT_TRUE(p->has_error());
+  EXPECT_TRUE(decos.errored);
+  EXPECT_FALSE(decos.matched);
+  EXPECT_TRUE(decos.value.empty());
+}
+
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest, DEPRECATED_DecorationDecl_Parses) {
   auto p = parser("[[override]]");
   auto decos = p->decoration_list();
   EXPECT_FALSE(p->has_error());
@@ -31,17 +85,22 @@
   EXPECT_TRUE(override_deco->Is<ast::OverrideDecoration>());
 }
 
-TEST_F(ParserImplTest, DecorationDecl_MissingAttrRight) {
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest, DEPRECATED_DecorationDecl_MissingAttrRight) {
   auto p = parser("[[override");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
   EXPECT_FALSE(decos.matched);
   EXPECT_TRUE(decos.value.empty());
-  EXPECT_EQ(p->error(), "1:11: expected ']]' for decoration list");
+  EXPECT_EQ(
+      p->error(),
+      R"(1:1: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:11: expected ']]' for decoration list)");
 }
 
-TEST_F(ParserImplTest, DecorationDecl_InvalidDecoration) {
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest, DEPRECATED_DecorationDecl_InvalidDecoration) {
   auto p = parser("[[invalid]]");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
diff --git a/src/reader/wgsl/parser_impl_struct_member_decoration_decl_test.cc b/src/reader/wgsl/parser_impl_struct_member_decoration_decl_test.cc
index 107c358..a7c1383 100644
--- a/src/reader/wgsl/parser_impl_struct_member_decoration_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_struct_member_decoration_decl_test.cc
@@ -28,18 +28,20 @@
   EXPECT_EQ(decos.value.size(), 0u);
 }
 
-TEST_F(ParserImplTest, DecorationDecl_EmptyBlock) {
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest, DEPRECATED_DecorationDecl_EmptyBlock) {
   auto p = parser("[[]]");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
   EXPECT_FALSE(decos.matched);
   EXPECT_EQ(decos.value.size(), 0u);
-  EXPECT_EQ(p->error(), "1:3: empty decoration list");
+  EXPECT_EQ(p->error(), R"(1:1: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:3: empty decoration list)");
 }
 
 TEST_F(ParserImplTest, DecorationDecl_Single) {
-  auto p = parser("[[size(4)]]");
+  auto p = parser("@size(4)");
   auto decos = p->decoration_list();
   EXPECT_FALSE(p->has_error());
   EXPECT_FALSE(decos.errored);
@@ -51,13 +53,13 @@
 }
 
 TEST_F(ParserImplTest, DecorationDecl_InvalidDecoration) {
-  auto p = parser("[[size(nan)]]");
+  auto p = parser("@size(nan)");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error()) << p->error();
   EXPECT_TRUE(decos.errored);
   EXPECT_FALSE(decos.matched);
   EXPECT_EQ(p->error(),
-            "1:8: expected signed integer literal for size decoration");
+            "1:7: expected signed integer literal for size decoration");
 }
 
 TEST_F(ParserImplTest, DecorationDecl_MissingClose) {
@@ -66,7 +68,8 @@
   EXPECT_TRUE(p->has_error()) << p->error();
   EXPECT_TRUE(decos.errored);
   EXPECT_FALSE(decos.matched);
-  EXPECT_EQ(p->error(), "1:10: expected ']]' for decoration list");
+  EXPECT_EQ(p->error(), R"(1:1: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:10: expected ']]' for decoration list)");
 }
 
 TEST_F(ParserImplTest, StructMemberDecorationDecl_SizeMissingClose) {
@@ -75,7 +78,8 @@
   EXPECT_TRUE(p->has_error()) << p->error();
   EXPECT_TRUE(decos.errored);
   EXPECT_FALSE(decos.matched);
-  EXPECT_EQ(p->error(), "1:10: expected ']]' for decoration list");
+  EXPECT_EQ(p->error(), R"(1:1: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:10: expected ']]' for decoration list)");
 }
 
 }  // namespace
diff --git a/src/reader/wgsl/parser_impl_struct_member_test.cc b/src/reader/wgsl/parser_impl_struct_member_test.cc
index 0f0f980..eccf079 100644
--- a/src/reader/wgsl/parser_impl_struct_member_test.cc
+++ b/src/reader/wgsl/parser_impl_struct_member_test.cc
@@ -43,7 +43,7 @@
 }
 
 TEST_F(ParserImplTest, StructMember_ParsesWithAlignDecoration) {
-  auto p = parser("[[align(2)]] a : i32;");
+  auto p = parser("@align(2) a : i32;");
 
   auto& builder = p->builder();
 
@@ -64,12 +64,12 @@
   EXPECT_EQ(m->decorations[0]->As<ast::StructMemberAlignDecoration>()->align,
             2u);
 
-  EXPECT_EQ(m->source.range, (Source::Range{{1u, 14u}, {1u, 15u}}));
-  EXPECT_EQ(m->type->source.range, (Source::Range{{1u, 18u}, {1u, 21u}}));
+  EXPECT_EQ(m->source.range, (Source::Range{{1u, 11u}, {1u, 12u}}));
+  EXPECT_EQ(m->type->source.range, (Source::Range{{1u, 15u}, {1u, 18u}}));
 }
 
 TEST_F(ParserImplTest, StructMember_ParsesWithSizeDecoration) {
-  auto p = parser("[[size(2)]] a : i32;");
+  auto p = parser("@size(2) a : i32;");
 
   auto& builder = p->builder();
 
@@ -89,12 +89,12 @@
   EXPECT_TRUE(m->decorations[0]->Is<ast::StructMemberSizeDecoration>());
   EXPECT_EQ(m->decorations[0]->As<ast::StructMemberSizeDecoration>()->size, 2u);
 
-  EXPECT_EQ(m->source.range, (Source::Range{{1u, 13u}, {1u, 14u}}));
-  EXPECT_EQ(m->type->source.range, (Source::Range{{1u, 17u}, {1u, 20u}}));
+  EXPECT_EQ(m->source.range, (Source::Range{{1u, 10u}, {1u, 11u}}));
+  EXPECT_EQ(m->type->source.range, (Source::Range{{1u, 14u}, {1u, 17u}}));
 }
 
 TEST_F(ParserImplTest, StructMember_ParsesWithDecoration) {
-  auto p = parser("[[size(2)]] a : i32;");
+  auto p = parser("@size(2) a : i32;");
 
   auto& builder = p->builder();
 
@@ -114,13 +114,13 @@
   EXPECT_TRUE(m->decorations[0]->Is<ast::StructMemberSizeDecoration>());
   EXPECT_EQ(m->decorations[0]->As<ast::StructMemberSizeDecoration>()->size, 2u);
 
-  EXPECT_EQ(m->source.range, (Source::Range{{1u, 13u}, {1u, 14u}}));
-  EXPECT_EQ(m->type->source.range, (Source::Range{{1u, 17u}, {1u, 20u}}));
+  EXPECT_EQ(m->source.range, (Source::Range{{1u, 10u}, {1u, 11u}}));
+  EXPECT_EQ(m->type->source.range, (Source::Range{{1u, 14u}, {1u, 17u}}));
 }
 
 TEST_F(ParserImplTest, StructMember_ParsesWithMultipleDecorations) {
-  auto p = parser(R"([[size(2)]]
-[[align(4)]] a : i32;)");
+  auto p = parser(R"(@size(2)
+@align(4) a : i32;)");
 
   auto& builder = p->builder();
 
@@ -143,12 +143,12 @@
   EXPECT_EQ(m->decorations[1]->As<ast::StructMemberAlignDecoration>()->align,
             4u);
 
-  EXPECT_EQ(m->source.range, (Source::Range{{2u, 14u}, {2u, 15u}}));
-  EXPECT_EQ(m->type->source.range, (Source::Range{{2u, 18u}, {2u, 21u}}));
+  EXPECT_EQ(m->source.range, (Source::Range{{2u, 11u}, {2u, 12u}}));
+  EXPECT_EQ(m->type->source.range, (Source::Range{{2u, 15u}, {2u, 18u}}));
 }
 
 TEST_F(ParserImplTest, StructMember_InvalidDecoration) {
-  auto p = parser("[[size(nan)]] a : i32;");
+  auto p = parser("@size(nan) a : i32;");
   auto decos = p->decoration_list();
   EXPECT_TRUE(decos.errored);
   EXPECT_FALSE(decos.matched);
@@ -159,7 +159,7 @@
 
   ASSERT_TRUE(p->has_error());
   EXPECT_EQ(p->error(),
-            "1:8: expected signed integer literal for size decoration");
+            "1:7: expected signed integer literal for size decoration");
 }
 
 TEST_F(ParserImplTest, StructMember_MissingSemicolon) {
diff --git a/src/reader/wgsl/parser_impl_test.cc b/src/reader/wgsl/parser_impl_test.cc
index 269cc9b..09da3b5 100644
--- a/src/reader/wgsl/parser_impl_test.cc
+++ b/src/reader/wgsl/parser_impl_test.cc
@@ -26,8 +26,8 @@
 
 TEST_F(ParserImplTest, Parses) {
   auto p = parser(R"(
-[[stage(fragment)]]
-fn main() -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main() -> @location(0) vec4<f32> {
   return vec4<f32>(.4, .2, .3, 1);
 }
 )");
@@ -114,11 +114,11 @@
  * /* I can nest /**/ comments. */
  * // I can nest line comments too.
  **/
-[[stage(fragment)]] // This is the stage
+@stage(fragment) // This is the stage
 fn main(/*
 no
 parameters
-*/) -> [[location(0)]] vec4<f32> {
+*/) -> @location(0) vec4<f32> {
   return/*block_comments_delimit_tokens*/vec4<f32>(.4, .2, .3, 1);
 }/* block comments are OK at EOF...*/)");
 
@@ -128,8 +128,8 @@
 
 TEST_F(ParserImplTest, Comments_UnterminatedBlockComment) {
   auto p = parser(R"(
-[[stage(fragment)]]
-fn main() -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main() -> @location(0) vec4<f32> {
   return vec4<f32>(.4, .2, .3, 1);
 } /* unterminated block comments are invalid ...)");
 
diff --git a/src/reader/wgsl/parser_impl_type_decl_test.cc b/src/reader/wgsl/parser_impl_type_decl_test.cc
index f3cc52d..13e368a 100644
--- a/src/reader/wgsl/parser_impl_type_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_type_decl_test.cc
@@ -440,7 +440,7 @@
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_Stride) {
-  auto p = parser("[[stride(16)]] array<f32, 5>");
+  auto p = parser("@stride(16) array<f32, 5>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -460,11 +460,11 @@
   auto* stride = a->decorations[0];
   ASSERT_TRUE(stride->Is<ast::StrideDecoration>());
   ASSERT_EQ(stride->As<ast::StrideDecoration>()->stride, 16u);
-  EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 16u}, {1u, 29u}}));
+  EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 13u}, {1u, 26u}}));
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_Runtime_Stride) {
-  auto p = parser("[[stride(16)]] array<f32>");
+  auto p = parser("@stride(16) array<f32>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -480,11 +480,11 @@
   auto* stride = a->decorations[0];
   ASSERT_TRUE(stride->Is<ast::StrideDecoration>());
   ASSERT_EQ(stride->As<ast::StrideDecoration>()->stride, 16u);
-  EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 16u}, {1u, 26u}}));
+  EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 13u}, {1u, 23u}}));
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_MultipleDecorations_OneBlock) {
-  auto p = parser("[[stride(16), stride(32)]] array<f32>");
+  auto p = parser("@stride(16) @stride(32) array<f32>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -502,11 +502,11 @@
   EXPECT_EQ(decos[0]->As<ast::StrideDecoration>()->stride, 16u);
   EXPECT_TRUE(decos[1]->Is<ast::StrideDecoration>());
   EXPECT_EQ(decos[1]->As<ast::StrideDecoration>()->stride, 32u);
-  EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 28u}, {1u, 38u}}));
+  EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 25u}, {1u, 35u}}));
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_MultipleDecorations_MultipleBlocks) {
-  auto p = parser("[[stride(16)]] [[stride(32)]] array<f32>");
+  auto p = parser("@stride(16) @stride(32) array<f32>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
@@ -524,89 +524,163 @@
   EXPECT_EQ(decos[0]->As<ast::StrideDecoration>()->stride, 16u);
   EXPECT_TRUE(decos[1]->Is<ast::StrideDecoration>());
   EXPECT_EQ(decos[1]->As<ast::StrideDecoration>()->stride, 32u);
-  EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 31u}, {1u, 41u}}));
+  EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 25u}, {1u, 35u}}));
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_Decoration_MissingArray) {
-  auto p = parser("[[stride(16)]] f32");
+  auto p = parser("@stride(16) f32");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
   ASSERT_EQ(t.value, nullptr);
   ASSERT_TRUE(p->has_error());
-  EXPECT_EQ(p->error(), "1:3: unexpected decorations");
+  EXPECT_EQ(p->error(), "1:2: unexpected decorations");
 }
 
-TEST_F(ParserImplTest, TypeDecl_Array_Decoration_MissingClosingAttr) {
+TEST_F(ParserImplTest, TypeDecl_Array_Decoration_UnknownDecoration) {
+  auto p = parser("@unknown(16) array<f32, 5>");
+  auto t = p->type_decl();
+  EXPECT_TRUE(t.errored);
+  EXPECT_FALSE(t.matched);
+  ASSERT_EQ(t.value, nullptr);
+  ASSERT_TRUE(p->has_error());
+  EXPECT_EQ(p->error(), R"(1:2: expected decoration)");
+}
+TEST_F(ParserImplTest, TypeDecl_Array_Stride_MissingLeftParen) {
+  auto p = parser("@stride 4) array<f32, 5>");
+  auto t = p->type_decl();
+  EXPECT_TRUE(t.errored);
+  EXPECT_FALSE(t.matched);
+  ASSERT_EQ(t.value, nullptr);
+  ASSERT_TRUE(p->has_error());
+  EXPECT_EQ(p->error(), R"(1:9: expected '(' for stride decoration)");
+}
+
+TEST_F(ParserImplTest, TypeDecl_Array_Stride_MissingRightParen) {
+  auto p = parser("@stride(4 array<f32, 5>");
+  auto t = p->type_decl();
+  EXPECT_TRUE(t.errored);
+  EXPECT_FALSE(t.matched);
+  ASSERT_EQ(t.value, nullptr);
+  ASSERT_TRUE(p->has_error());
+  EXPECT_EQ(p->error(), R"(1:11: expected ')' for stride decoration)");
+}
+
+TEST_F(ParserImplTest, TypeDecl_Array_Stride_MissingValue) {
+  auto p = parser("@stride() array<f32, 5>");
+  auto t = p->type_decl();
+  EXPECT_TRUE(t.errored);
+  EXPECT_FALSE(t.matched);
+  ASSERT_EQ(t.value, nullptr);
+  ASSERT_TRUE(p->has_error());
+  EXPECT_EQ(p->error(),
+            "1:9: expected signed integer literal for stride decoration");
+}
+
+TEST_F(ParserImplTest, TypeDecl_Array_Stride_InvalidValue) {
+  auto p = parser("@stride(invalid) array<f32, 5>");
+  auto t = p->type_decl();
+  EXPECT_TRUE(t.errored);
+  EXPECT_FALSE(t.matched);
+  ASSERT_EQ(t.value, nullptr);
+  ASSERT_TRUE(p->has_error());
+  EXPECT_EQ(p->error(),
+            "1:9: expected signed integer literal for stride decoration");
+}
+
+TEST_F(ParserImplTest, TypeDecl_Array_Stride_InvalidValue_Negative) {
+  auto p = parser("@stride(-1) array<f32, 5>");
+  auto t = p->type_decl();
+  EXPECT_TRUE(t.errored);
+  EXPECT_FALSE(t.matched);
+  ASSERT_EQ(t.value, nullptr);
+  ASSERT_TRUE(p->has_error());
+  EXPECT_EQ(p->error(), "1:9: stride decoration must be greater than 0");
+}
+
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest,
+       DEPRECATED_TypeDecl_Array_Decoration_MissingClosingAttr) {
   auto p = parser("[[stride(16) array<f32, 5>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
   ASSERT_EQ(t.value, nullptr);
   ASSERT_TRUE(p->has_error());
-  EXPECT_EQ(p->error(), "1:14: expected ']]' for decoration list");
+  EXPECT_EQ(
+      p->error(),
+      R"(1:1: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:14: expected ']]' for decoration list)");
 }
 
-TEST_F(ParserImplTest, TypeDecl_Array_Decoration_UnknownDecoration) {
-  auto p = parser("[[unknown 16]] array<f32, 5>");
-  auto t = p->type_decl();
-  EXPECT_TRUE(t.errored);
-  EXPECT_FALSE(t.matched);
-  ASSERT_EQ(t.value, nullptr);
-  ASSERT_TRUE(p->has_error());
-  EXPECT_EQ(p->error(), "1:3: expected decoration");
-}
-
-TEST_F(ParserImplTest, TypeDecl_Array_Stride_MissingLeftParen) {
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest, DEPRECATED_TypeDecl_Array_Stride_MissingLeftParen) {
   auto p = parser("[[stride 4)]] array<f32, 5>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
   ASSERT_EQ(t.value, nullptr);
   ASSERT_TRUE(p->has_error());
-  EXPECT_EQ(p->error(), "1:10: expected '(' for stride decoration");
+  EXPECT_EQ(
+      p->error(),
+      R"(1:1: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:10: expected '(' for stride decoration)");
 }
 
-TEST_F(ParserImplTest, TypeDecl_Array_Stride_MissingRightParen) {
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest, DEPRECATED_TypeDecl_Array_Stride_MissingRightParen) {
   auto p = parser("[[stride(4]] array<f32, 5>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
   ASSERT_EQ(t.value, nullptr);
   ASSERT_TRUE(p->has_error());
-  EXPECT_EQ(p->error(), "1:11: expected ')' for stride decoration");
+  EXPECT_EQ(
+      p->error(),
+      R"(1:1: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:11: expected ')' for stride decoration)");
 }
 
-TEST_F(ParserImplTest, TypeDecl_Array_Stride_MissingValue) {
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest, DEPRECATED_TypeDecl_Array_Stride_MissingValue) {
   auto p = parser("[[stride()]] array<f32, 5>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
   ASSERT_EQ(t.value, nullptr);
   ASSERT_TRUE(p->has_error());
-  EXPECT_EQ(p->error(),
-            "1:10: expected signed integer literal for stride decoration");
+  EXPECT_EQ(
+      p->error(),
+      R"(1:1: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:10: expected signed integer literal for stride decoration)");
 }
 
-TEST_F(ParserImplTest, TypeDecl_Array_Stride_InvalidValue) {
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest, DEPRECATED_TypeDecl_Array_Stride_InvalidValue) {
   auto p = parser("[[stride(invalid)]] array<f32, 5>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
   ASSERT_EQ(t.value, nullptr);
   ASSERT_TRUE(p->has_error());
-  EXPECT_EQ(p->error(),
-            "1:10: expected signed integer literal for stride decoration");
+  EXPECT_EQ(
+      p->error(),
+      R"(1:1: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:10: expected signed integer literal for stride decoration)");
 }
 
-TEST_F(ParserImplTest, TypeDecl_Array_Stride_InvalidValue_Negative) {
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest, DEPRECATED_TypeDecl_Array_Stride_InvalidValue_Negative) {
   auto p = parser("[[stride(-1)]] array<f32, 5>");
   auto t = p->type_decl();
   EXPECT_TRUE(t.errored);
   EXPECT_FALSE(t.matched);
   ASSERT_EQ(t.value, nullptr);
   ASSERT_TRUE(p->has_error());
-  EXPECT_EQ(p->error(), "1:10: stride decoration must be greater than 0");
+  EXPECT_EQ(
+      p->error(),
+      R"(1:1: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:10: stride decoration must be greater than 0)");
 }
 
 TEST_F(ParserImplTest, TypeDecl_Array_Runtime) {
diff --git a/src/reader/wgsl/parser_impl_variable_decoration_list_test.cc b/src/reader/wgsl/parser_impl_variable_decoration_list_test.cc
index 5493345..5cb3801 100644
--- a/src/reader/wgsl/parser_impl_variable_decoration_list_test.cc
+++ b/src/reader/wgsl/parser_impl_variable_decoration_list_test.cc
@@ -20,7 +20,7 @@
 namespace {
 
 TEST_F(ParserImplTest, DecorationList_Parses) {
-  auto p = parser(R"([[location(4), builtin(position)]])");
+  auto p = parser(R"(@location(4) @builtin(position))");
   auto decos = p->decoration_list();
   ASSERT_FALSE(p->has_error()) << p->error();
   ASSERT_FALSE(decos.errored);
@@ -39,65 +39,94 @@
             ast::Builtin::kPosition);
 }
 
-TEST_F(ParserImplTest, DecorationList_Empty) {
+TEST_F(ParserImplTest, DecorationList_Invalid) {
+  auto p = parser(R"(@invalid)");
+  auto decos = p->decoration_list();
+  EXPECT_TRUE(p->has_error());
+  EXPECT_TRUE(decos.errored);
+  EXPECT_FALSE(decos.matched);
+  EXPECT_TRUE(decos.value.empty());
+  EXPECT_EQ(p->error(), R"(1:2: expected decoration)");
+}
+
+TEST_F(ParserImplTest, DecorationList_InvalidValue) {
+  auto p = parser("@builtin(invalid)");
+  auto decos = p->decoration_list();
+  EXPECT_TRUE(p->has_error());
+  EXPECT_TRUE(decos.errored);
+  EXPECT_FALSE(decos.matched);
+  EXPECT_TRUE(decos.value.empty());
+  EXPECT_EQ(p->error(), "1:10: invalid value for builtin decoration");
+}
+
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest, DEPRECATED_DecorationList_Empty) {
   auto p = parser(R"([[]])");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
   EXPECT_FALSE(decos.matched);
   EXPECT_TRUE(decos.value.empty());
-  EXPECT_EQ(p->error(), "1:3: empty decoration list");
+  EXPECT_EQ(
+      p->error(),
+      R"(1:1: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:3: empty decoration list)");
 }
 
-TEST_F(ParserImplTest, DecorationList_Invalid) {
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest, DEPRECATED_DecorationList_Invalid) {
   auto p = parser(R"([[invalid]])");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
   EXPECT_FALSE(decos.matched);
   EXPECT_TRUE(decos.value.empty());
-  EXPECT_EQ(p->error(), "1:3: expected decoration");
+  EXPECT_EQ(
+      p->error(),
+      R"(1:1: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:3: expected decoration)");
 }
 
-TEST_F(ParserImplTest, DecorationList_ExtraComma) {
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest, DEPRECATED_DecorationList_ExtraComma) {
   auto p = parser(R"([[builtin(position), ]])");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
   EXPECT_FALSE(decos.matched);
   EXPECT_TRUE(decos.value.empty());
-  EXPECT_EQ(p->error(), "1:22: expected decoration");
+  EXPECT_EQ(
+      p->error(),
+      R"(1:1: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:22: expected decoration)");
 }
 
-TEST_F(ParserImplTest, DecorationList_MissingComma) {
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest, DEPRECATED_DecorationList_MissingComma) {
   auto p = parser(R"([[binding(4) location(5)]])");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
   EXPECT_FALSE(decos.matched);
   EXPECT_TRUE(decos.value.empty());
-  EXPECT_EQ(p->error(), "1:14: expected ',' for decoration list");
+  EXPECT_EQ(
+      p->error(),
+      R"(1:1: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:14: expected ',' for decoration list)");
 }
 
-TEST_F(ParserImplTest, DecorationList_BadDecoration) {
-  auto p = parser(R"([[location(bad)]])");
-  auto decos = p->decoration_list();
-  EXPECT_TRUE(p->has_error());
-  EXPECT_TRUE(decos.errored);
-  EXPECT_FALSE(decos.matched);
-  EXPECT_TRUE(decos.value.empty());
-  EXPECT_EQ(p->error(),
-            "1:12: expected signed integer literal for location decoration");
-}
-
-TEST_F(ParserImplTest, DecorationList_InvalidBuiltin) {
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest, DEPRECATED_DecorationList_InvalidValue) {
   auto p = parser("[[builtin(invalid)]]");
   auto decos = p->decoration_list();
   EXPECT_TRUE(p->has_error());
   EXPECT_TRUE(decos.errored);
   EXPECT_FALSE(decos.matched);
   EXPECT_TRUE(decos.value.empty());
-  EXPECT_EQ(p->error(), "1:11: invalid value for builtin decoration");
+  EXPECT_EQ(
+      p->error(),
+      R"(1:1: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:11: invalid value for builtin decoration)");
 }
 
 }  // namespace
diff --git a/src/reader/wgsl/parser_impl_variable_ident_decl_test.cc b/src/reader/wgsl/parser_impl_variable_ident_decl_test.cc
index 489463e..73efe8c 100644
--- a/src/reader/wgsl/parser_impl_variable_ident_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_variable_ident_decl_test.cc
@@ -77,7 +77,7 @@
 }
 
 TEST_F(ParserImplTest, VariableIdentDecl_NonAccessDecoFail) {
-  auto p = parser("my_var : [[stride(1)]] S");
+  auto p = parser("my_var : @stride(1) S");
 
   auto* mem = Member("a", ty.i32(), ast::DecorationList{});
   ast::StructMemberList members;
@@ -90,19 +90,11 @@
   auto decl = p->expect_variable_ident_decl("test");
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(decl.errored);
-  ASSERT_EQ(p->error(), "1:12: unexpected decorations");
-}
-
-TEST_F(ParserImplTest, VariableIdentDecl_DecorationMissingRightBlock) {
-  auto p = parser("my_var : [[stride(4) S");
-  auto decl = p->expect_variable_ident_decl("test");
-  ASSERT_TRUE(p->has_error());
-  ASSERT_TRUE(decl.errored);
-  ASSERT_EQ(p->error(), "1:22: expected ']]' for decoration list");
+  ASSERT_EQ(p->error(), "1:11: unexpected decorations");
 }
 
 TEST_F(ParserImplTest, VariableIdentDecl_DecorationMissingRightParen) {
-  auto p = parser("my_var : [[stride(4]] S");
+  auto p = parser("my_var : @stride(4 S");
   auto decl = p->expect_variable_ident_decl("test");
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(decl.errored);
@@ -110,19 +102,62 @@
 }
 
 TEST_F(ParserImplTest, VariableIdentDecl_DecorationMissingLeftParen) {
+  auto p = parser("my_var : @stride 4) S");
+  auto decl = p->expect_variable_ident_decl("test");
+  ASSERT_TRUE(p->has_error());
+  ASSERT_TRUE(decl.errored);
+  ASSERT_EQ(p->error(), "1:18: expected '(' for stride decoration");
+}
+
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest,
+       DEPRECATED_VariableIdentDecl_DecorationMissingRightBlock) {
+  auto p = parser("my_var : [[stride(4) S");
+  auto decl = p->expect_variable_ident_decl("test");
+  ASSERT_TRUE(p->has_error());
+  ASSERT_TRUE(decl.errored);
+  ASSERT_EQ(
+      p->error(),
+      R"(1:10: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:22: expected ']]' for decoration list)");
+}
+
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest,
+       DEPRECATED_VariableIdentDecl_DecorationMissingRightParen) {
+  auto p = parser("my_var : [[stride(4]] S");
+  auto decl = p->expect_variable_ident_decl("test");
+  ASSERT_TRUE(p->has_error());
+  ASSERT_TRUE(decl.errored);
+  ASSERT_EQ(
+      p->error(),
+      R"(1:10: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:20: expected ')' for stride decoration)");
+}
+
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest,
+       DEPRECATED_VariableIdentDecl_DecorationMissingLeftParen) {
   auto p = parser("my_var : [[stride 4)]] S");
   auto decl = p->expect_variable_ident_decl("test");
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(decl.errored);
-  ASSERT_EQ(p->error(), "1:19: expected '(' for stride decoration");
+  ASSERT_EQ(
+      p->error(),
+      R"(1:10: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:19: expected '(' for stride decoration)");
 }
 
-TEST_F(ParserImplTest, VariableIdentDecl_DecorationEmpty) {
+// TODO(crbug.com/tint/1382): Remove
+TEST_F(ParserImplTest, DEPRECATED_VariableIdentDecl_DecorationEmpty) {
   auto p = parser("my_var : [[]] S");
   auto decl = p->expect_variable_ident_decl("test");
   ASSERT_TRUE(p->has_error());
   ASSERT_TRUE(decl.errored);
-  ASSERT_EQ(p->error(), "1:12: empty decoration list");
+  ASSERT_EQ(
+      p->error(),
+      R"(1:10: use of deprecated language feature: [[decoration]] style decorations have been replaced with @decoration style
+1:12: empty decoration list)");
 }
 
 }  // namespace
diff --git a/src/reader/wgsl/parser_test.cc b/src/reader/wgsl/parser_test.cc
index b1e5566..f6031dd 100644
--- a/src/reader/wgsl/parser_test.cc
+++ b/src/reader/wgsl/parser_test.cc
@@ -34,8 +34,8 @@
 
 TEST_F(ParserTest, Parses) {
   Source::File file("test.wgsl", R"(
-[[stage(fragment)]]
-fn main() -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main() -> @location(0) vec4<f32> {
   return vec4<f32>(.4, .2, .3, 1.);
 }
 )");
diff --git a/src/reader/wgsl/token.cc b/src/reader/wgsl/token.cc
index 864036c..8ba2cff 100644
--- a/src/reader/wgsl/token.cc
+++ b/src/reader/wgsl/token.cc
@@ -42,6 +42,8 @@
       return "&&";
     case Token::Type::kArrow:
       return "->";
+    case Token::Type::kAttr:
+      return "@";
     case Token::Type::kAttrLeft:
       return "[[";
     case Token::Type::kAttrRight:
diff --git a/src/reader/wgsl/token.h b/src/reader/wgsl/token.h
index dca2112..8fdc87e 100644
--- a/src/reader/wgsl/token.h
+++ b/src/reader/wgsl/token.h
@@ -50,9 +50,11 @@
     kAndAnd,
     /// A '->'
     kArrow,
-    /// A '[['
+    /// A '@'
+    kAttr,
+    /// A '[[' - [DEPRECATED] now '@'
     kAttrLeft,
-    /// A ']]'
+    /// A ']]' - [DEPRECATED] now '@'
     kAttrRight,
     /// A '/'
     kForwardSlash,
diff --git a/src/resolver/assignment_validation_test.cc b/src/resolver/assignment_validation_test.cc
index f573161..39cb300 100644
--- a/src/resolver/assignment_validation_test.cc
+++ b/src/resolver/assignment_validation_test.cc
@@ -27,7 +27,7 @@
 
 TEST_F(ResolverAssignmentValidationTest, ReadOnlyBuffer) {
   // [[block]] struct S { m : i32 };
-  // [[group(0), binding(0)]]
+  // @group(0) @binding(0)
   // var<storage,read> a : S;
   auto* s = Structure("S", {Member("m", ty.i32())},
                       {create<ast::StructBlockDecoration>()});
@@ -251,7 +251,7 @@
 
 TEST_F(ResolverAssignmentValidationTest, AssignNonConstructible_Atomic) {
   // [[block]] struct S { a : atomic<i32>; };
-  // [[group(0), binding(0)]] var<storage, read_write> v : S;
+  // @group(0) @binding(0) var<storage, read_write> v : S;
   // v.a = v.a;
 
   auto* s = Structure("S", {Member("a", ty.atomic(ty.i32()))},
@@ -273,7 +273,7 @@
 
 TEST_F(ResolverAssignmentValidationTest, AssignNonConstructible_RuntimeArray) {
   // [[block]] struct S { a : array<f32>; };
-  // [[group(0), binding(0)]] var<storage, read_write> v : S;
+  // @group(0) @binding(0) var<storage, read_write> v : S;
   // v.a = v.a;
 
   auto* s = Structure("S", {Member("a", ty.array(ty.f32()))},
@@ -299,7 +299,7 @@
   // struct S {
   //   arr: array<i32>;
   // };
-  // [[group(0), binding(0)]] var<storage, read_write> s : S;
+  // @group(0) @binding(0) var<storage, read_write> s : S;
   // fn f() {
   //   _ = s;
   // }
@@ -320,7 +320,7 @@
   // struct S {
   //   arr: array<i32>;
   // };
-  // [[group(0), binding(0)]] var<storage, read_write> s : S;
+  // @group(0) @binding(0) var<storage, read_write> s : S;
   // fn f() {
   //   _ = s.arr;
   // }
@@ -347,10 +347,10 @@
   // struct U {
   //   i:   i32;
   // };
-  // [[group(0), binding(0)]] var tex texture_2d;
-  // [[group(0), binding(1)]] var smp sampler;
-  // [[group(0), binding(2)]] var<uniform> u : U;
-  // [[group(0), binding(3)]] var<storage, read_write> s : S;
+  // @group(0) @binding(0) var tex texture_2d;
+  // @group(0) @binding(1) var smp sampler;
+  // @group(0) @binding(2) var<uniform> u : U;
+  // @group(0) @binding(3) var<storage, read_write> s : S;
   // var<workgroup> wg : array<f32, 10>
   // fn f() {
   //   _ = 1;
diff --git a/src/resolver/builtins_validation_test.cc b/src/resolver/builtins_validation_test.cc
index 251be8e..8bbcf3a 100644
--- a/src/resolver/builtins_validation_test.cc
+++ b/src/resolver/builtins_validation_test.cc
@@ -201,10 +201,10 @@
                          testing::ValuesIn(cases));
 
 TEST_F(ResolverBuiltinsValidationTest, FragDepthIsInput_Fail) {
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn fs_main(
-  //   [[builtin(frag_depth)]] fd: f32,
-  // ) -> [[location(0)]] f32 { return 1.0; }
+  //   @builtin(frag_depth) fd: f32,
+  // ) -> @location(0) f32 { return 1.0; }
   auto* fd = Param(
       "fd", ty.f32(),
       ast::DecorationList{Builtin(Source{{12, 34}}, ast::Builtin::kFragDepth)});
@@ -219,10 +219,10 @@
 
 TEST_F(ResolverBuiltinsValidationTest, FragDepthIsInputStruct_Fail) {
   // struct MyInputs {
-  //   [[builtin(frag_depth)]] ff: f32;
+  //   @builtin(frag_depth) ff: f32;
   // };
-  // [[stage(fragment)]]
-  // fn fragShader(arg: MyInputs) -> [[location(0)]] f32 { return 1.0; }
+  // @stage(fragment)
+  // fn fragShader(arg: MyInputs) -> @location(0) f32 { return 1.0; }
 
   auto* s = Structure(
       "MyInputs", {Member("frag_depth", ty.f32(),
@@ -240,9 +240,9 @@
 
 TEST_F(ResolverBuiltinsValidationTest, StructBuiltinInsideEntryPoint_Ignored) {
   // struct S {
-  //   [[builtin(vertex_index)]] idx: u32;
+  //   @builtin(vertex_index) idx: u32;
   // };
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn fragShader() { var s : S; }
 
   Structure("S",
@@ -257,10 +257,10 @@
 
 TEST_F(ResolverBuiltinsValidationTest, PositionNotF32_Struct_Fail) {
   // struct MyInputs {
-  //   [[builtin(kPosition)]] p: vec4<u32>;
+  //   @builtin(kPosition) p: vec4<u32>;
   // };
-  // [[stage(fragment)]]
-  // fn fragShader(is_front: MyInputs) -> [[location(0)]] f32 { return 1.0; }
+  // @stage(fragment)
+  // fn fragShader(is_front: MyInputs) -> @location(0) f32 { return 1.0; }
 
   auto* m = Member(
       "position", ty.vec4<u32>(),
@@ -275,8 +275,8 @@
 }
 
 TEST_F(ResolverBuiltinsValidationTest, PositionNotF32_ReturnType_Fail) {
-  // [[stage(vertex)]]
-  // fn main() -> [[builtin(position)]] f32 { return 1.0; }
+  // @stage(vertex)
+  // fn main() -> @builtin(position) f32 { return 1.0; }
   Func("main", {}, ty.f32(), {Return(1.0f)},
        {Stage(ast::PipelineStage::kVertex)},
        {Builtin(Source{{12, 34}}, ast::Builtin::kPosition)});
@@ -288,10 +288,10 @@
 
 TEST_F(ResolverBuiltinsValidationTest, FragDepthNotF32_Struct_Fail) {
   // struct MyInputs {
-  //   [[builtin(kFragDepth)]] p: i32;
+  //   @builtin(kFragDepth) p: i32;
   // };
-  // [[stage(fragment)]]
-  // fn fragShader(is_front: MyInputs) -> [[location(0)]] f32 { return 1.0; }
+  // @stage(fragment)
+  // fn fragShader(is_front: MyInputs) -> @location(0) f32 { return 1.0; }
 
   auto* m = Member(
       "frag_depth", ty.i32(),
@@ -307,10 +307,10 @@
 
 TEST_F(ResolverBuiltinsValidationTest, SampleMaskNotU32_Struct_Fail) {
   // struct MyInputs {
-  //   [[builtin(sample_mask)]] m: f32;
+  //   @builtin(sample_mask) m: f32;
   // };
-  // [[stage(fragment)]]
-  // fn fragShader(is_front: MyInputs) -> [[location(0)]] f32 { return 1.0; }
+  // @stage(fragment)
+  // fn fragShader(is_front: MyInputs) -> @location(0) f32 { return 1.0; }
 
   auto* s = Structure(
       "MyInputs", {Member("m", ty.f32(),
@@ -325,8 +325,8 @@
 }
 
 TEST_F(ResolverBuiltinsValidationTest, SampleMaskNotU32_ReturnType_Fail) {
-  // [[stage(fragment)]]
-  // fn main() -> [[builtin(sample_mask)]] i32 { return 1; }
+  // @stage(fragment)
+  // fn main() -> @builtin(sample_mask) i32 { return 1; }
   Func("main", {}, ty.i32(), {Return(1)},
        {Stage(ast::PipelineStage::kFragment)},
        {Builtin(Source{{12, 34}}, ast::Builtin::kSampleMask)});
@@ -337,10 +337,10 @@
 }
 
 TEST_F(ResolverBuiltinsValidationTest, SampleMaskIsNotU32_Fail) {
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn fs_main(
-  //   [[builtin(sample_mask)]] arg: bool
-  // ) -> [[location(0)]] f32 { return 1.0; }
+  //   @builtin(sample_mask) arg: bool
+  // ) -> @location(0) f32 { return 1.0; }
   auto* arg = Param("arg", ty.bool_(),
                     ast::DecorationList{
                         Builtin(Source{{12, 34}}, ast::Builtin::kSampleMask)});
@@ -354,10 +354,10 @@
 
 TEST_F(ResolverBuiltinsValidationTest, SampleIndexIsNotU32_Struct_Fail) {
   // struct MyInputs {
-  //   [[builtin(sample_index)]] m: f32;
+  //   @builtin(sample_index) m: f32;
   // };
-  // [[stage(fragment)]]
-  // fn fragShader(is_front: MyInputs) -> [[location(0)]] f32 { return 1.0; }
+  // @stage(fragment)
+  // fn fragShader(is_front: MyInputs) -> @location(0) f32 { return 1.0; }
 
   auto* s = Structure(
       "MyInputs", {Member("m", ty.f32(),
@@ -372,10 +372,10 @@
 }
 
 TEST_F(ResolverBuiltinsValidationTest, SampleIndexIsNotU32_Fail) {
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn fs_main(
-  //   [[builtin(sample_index)]] arg: bool
-  // ) -> [[location(0)]] f32 { return 1.0; }
+  //   @builtin(sample_index) arg: bool
+  // ) -> @location(0) f32 { return 1.0; }
   auto* arg = Param("arg", ty.bool_(),
                     ast::DecorationList{
                         Builtin(Source{{12, 34}}, ast::Builtin::kSampleIndex)});
@@ -388,10 +388,10 @@
 }
 
 TEST_F(ResolverBuiltinsValidationTest, PositionIsNotF32_Fail) {
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn fs_main(
-  //   [[builtin(kPosition)]] p: vec3<f32>,
-  // ) -> [[location(0)]] f32 { return 1.0; }
+  //   @builtin(kPosition) p: vec3<f32>,
+  // ) -> @location(0) f32 { return 1.0; }
   auto* p = Param(
       "p", ty.vec3<f32>(),
       ast::DecorationList{Builtin(Source{{12, 34}}, ast::Builtin::kPosition)});
@@ -404,8 +404,8 @@
 }
 
 TEST_F(ResolverBuiltinsValidationTest, FragDepthIsNotF32_Fail) {
-  // [[stage(fragment)]]
-  // fn fs_main() -> [[builtin(kFragDepth)]] f32 { var fd: i32; return fd; }
+  // @stage(fragment)
+  // fn fs_main() -> @builtin(kFragDepth) f32 { var fd: i32; return fd; }
   auto* fd = Var("fd", ty.i32());
   Func(
       "fs_main", {}, ty.i32(), {Decl(fd), Return(fd)},
@@ -417,11 +417,11 @@
 }
 
 TEST_F(ResolverBuiltinsValidationTest, VertexIndexIsNotU32_Fail) {
-  // [[stage(vertex)]]
+  // @stage(vertex)
   // fn main(
-  //   [[builtin(kVertexIndex)]] vi : f32,
-  //   [[builtin(kPosition)]] p :vec4<f32>
-  // ) -> [[builtin(kPosition)]] vec4<f32> { return vec4<f32>(); }
+  //   @builtin(kVertexIndex) vi : f32,
+  //   @builtin(kPosition) p :vec4<f32>
+  // ) -> @builtin(kPosition) vec4<f32> { return vec4<f32>(); }
   auto* p = Param("p", ty.vec4<f32>(),
                   ast::DecorationList{Builtin(ast::Builtin::kPosition)});
   auto* vi = Param("vi", ty.f32(),
@@ -436,11 +436,11 @@
 }
 
 TEST_F(ResolverBuiltinsValidationTest, InstanceIndexIsNotU32) {
-  // [[stage(vertex)]]
+  // @stage(vertex)
   // fn main(
-  //   [[builtin(kInstanceIndex)]] ii : f32,
-  //   [[builtin(kPosition)]] p :vec4<f32>
-  // ) -> [[builtin(kPosition)]] vec4<f32> { return vec4<f32>(); }
+  //   @builtin(kInstanceIndex) ii : f32,
+  //   @builtin(kPosition) p :vec4<f32>
+  // ) -> @builtin(kPosition) vec4<f32> { return vec4<f32>(); }
   auto* p = Param("p", ty.vec4<f32>(),
                   ast::DecorationList{Builtin(ast::Builtin::kPosition)});
   auto* ii = Param("ii", ty.f32(),
@@ -455,13 +455,13 @@
 }
 
 TEST_F(ResolverBuiltinsValidationTest, FragmentBuiltin_Pass) {
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn fs_main(
-  //   [[builtin(kPosition)]] p: vec4<f32>,
-  //   [[builtin(front_facing)]] ff: bool,
-  //   [[builtin(sample_index)]] si: u32,
-  //   [[builtin(sample_mask)]] sm : u32
-  // ) -> [[builtin(frag_depth)]] f32 { var fd: f32; return fd; }
+  //   @builtin(kPosition) p: vec4<f32>,
+  //   @builtin(front_facing) ff: bool,
+  //   @builtin(sample_index) si: u32,
+  //   @builtin(sample_mask) sm : u32
+  // ) -> @builtin(frag_depth) f32 { var fd: f32; return fd; }
   auto* p = Param("p", ty.vec4<f32>(),
                   ast::DecorationList{Builtin(ast::Builtin::kPosition)});
   auto* ff = Param("ff", ty.bool_(),
@@ -479,11 +479,11 @@
 }
 
 TEST_F(ResolverBuiltinsValidationTest, VertexBuiltin_Pass) {
-  // [[stage(vertex)]]
+  // @stage(vertex)
   // fn main(
-  //   [[builtin(vertex_index)]] vi : u32,
-  //   [[builtin(instance_index)]] ii : u32,
-  // ) -> [[builtin(position)]] vec4<f32> { var p :vec4<f32>; return p; }
+  //   @builtin(vertex_index) vi : u32,
+  //   @builtin(instance_index) ii : u32,
+  // ) -> @builtin(position) vec4<f32> { var p :vec4<f32>; return p; }
   auto* vi = Param("vi", ty.u32(),
                    ast::DecorationList{
                        Builtin(Source{{12, 34}}, ast::Builtin::kVertexIndex)});
@@ -504,13 +504,13 @@
 }
 
 TEST_F(ResolverBuiltinsValidationTest, ComputeBuiltin_Pass) {
-  // [[stage(compute), workgroup_size(1)]]
+  // @stage(compute) @workgroup_size(1)
   // fn main(
-  //   [[builtin(local_invocationId)]] li_id: vec3<u32>,
-  //   [[builtin(local_invocationIndex)]] li_index: u32,
-  //   [[builtin(global_invocationId)]] gi: vec3<u32>,
-  //   [[builtin(workgroup_id)]] wi: vec3<u32>,
-  //   [[builtin(num_workgroups)]] nwgs: vec3<u32>,
+  //   @builtin(local_invocationId) li_id: vec3<u32>,
+  //   @builtin(local_invocationIndex) li_index: u32,
+  //   @builtin(global_invocationId) gi: vec3<u32>,
+  //   @builtin(workgroup_id) wi: vec3<u32>,
+  //   @builtin(num_workgroups) nwgs: vec3<u32>,
   // ) {}
 
   auto* li_id =
@@ -618,13 +618,13 @@
 
 TEST_F(ResolverBuiltinsValidationTest, FragmentBuiltinStruct_Pass) {
   // Struct MyInputs {
-  //   [[builtin(kPosition)]] p: vec4<f32>;
-  //   [[builtin(frag_depth)]] fd: f32;
-  //   [[builtin(sample_index)]] si: u32;
-  //   [[builtin(sample_mask)]] sm : u32;;
+  //   @builtin(kPosition) p: vec4<f32>;
+  //   @builtin(frag_depth) fd: f32;
+  //   @builtin(sample_index) si: u32;
+  //   @builtin(sample_mask) sm : u32;;
   // };
-  // [[stage(fragment)]]
-  // fn fragShader(arg: MyInputs) -> [[location(0)]] f32 { return 1.0; }
+  // @stage(fragment)
+  // fn fragShader(arg: MyInputs) -> @location(0) f32 { return 1.0; }
 
   auto* s = Structure(
       "MyInputs",
@@ -642,10 +642,10 @@
 }
 
 TEST_F(ResolverBuiltinsValidationTest, FrontFacingParamIsNotBool_Fail) {
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn fs_main(
-  //   [[builtin(front_facing)]] is_front: i32;
-  // ) -> [[location(0)]] f32 { return 1.0; }
+  //   @builtin(front_facing) is_front: i32;
+  // ) -> @location(0) f32 { return 1.0; }
 
   auto* is_front = Param("is_front", ty.i32(),
                          ast::DecorationList{Builtin(
@@ -661,10 +661,10 @@
 
 TEST_F(ResolverBuiltinsValidationTest, FrontFacingMemberIsNotBool_Fail) {
   // struct MyInputs {
-  //   [[builtin(front_facing)]] pos: f32;
+  //   @builtin(front_facing) pos: f32;
   // };
-  // [[stage(fragment)]]
-  // fn fragShader(is_front: MyInputs) -> [[location(0)]] f32 { return 1.0; }
+  // @stage(fragment)
+  // fn fragShader(is_front: MyInputs) -> @location(0) f32 { return 1.0; }
 
   auto* s = Structure(
       "MyInputs", {Member("pos", ty.f32(),
diff --git a/src/resolver/call_validation_test.cc b/src/resolver/call_validation_test.cc
index 86e4a17..5af0bf9 100644
--- a/src/resolver/call_validation_test.cc
+++ b/src/resolver/call_validation_test.cc
@@ -172,7 +172,7 @@
   // fn bar(p: ptr<function, i32>) {
   // foo(p);
   // }
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn main() {
   //   var v: i32;
   //   bar(&v);
@@ -195,7 +195,7 @@
 
 TEST_F(ResolverCallValidationTest, LetPointer) {
   // fn x(p : ptr<function, i32>) -> i32 {}
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn main() {
   //   var v: i32;
   //   let p: ptr<function, i32> = &v;
@@ -227,7 +227,7 @@
   // let p: ptr<private, i32> = &v;
   // fn foo(p : ptr<private, i32>) -> i32 {}
   // var v: i32;
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn main() {
   //   var c: i32 = foo(p);
   // }
diff --git a/src/resolver/decoration_validation_test.cc b/src/resolver/decoration_validation_test.cc
index 8f043d6..592ba15 100644
--- a/src/resolver/decoration_validation_test.cc
+++ b/src/resolver/decoration_validation_test.cc
@@ -973,9 +973,9 @@
   Global(Source{{12, 34}}, "G", ty.Of(s), ast::StorageClass::kUniform);
 
   EXPECT_FALSE(r()->Resolve());
-  EXPECT_EQ(r()->error(),
-            "12:34 error: resource variables require [[group]] and [[binding]] "
-            "decorations");
+  EXPECT_EQ(
+      r()->error(),
+      R"(12:34 error: resource variables require @group and @binding decorations)");
 }
 
 TEST_F(ResourceDecorationTest, StorageBufferMissingBinding) {
@@ -985,9 +985,9 @@
          ast::Access::kRead);
 
   EXPECT_FALSE(r()->Resolve());
-  EXPECT_EQ(r()->error(),
-            "12:34 error: resource variables require [[group]] and [[binding]] "
-            "decorations");
+  EXPECT_EQ(
+      r()->error(),
+      R"(12:34 error: resource variables require @group and @binding decorations)");
 }
 
 TEST_F(ResourceDecorationTest, TextureMissingBinding) {
@@ -995,9 +995,9 @@
          ast::StorageClass::kNone);
 
   EXPECT_FALSE(r()->Resolve());
-  EXPECT_EQ(r()->error(),
-            "12:34 error: resource variables require [[group]] and [[binding]] "
-            "decorations");
+  EXPECT_EQ(
+      r()->error(),
+      R"(12:34 error: resource variables require @group and @binding decorations)");
 }
 
 TEST_F(ResourceDecorationTest, SamplerMissingBinding) {
@@ -1005,9 +1005,9 @@
          ast::StorageClass::kNone);
 
   EXPECT_FALSE(r()->Resolve());
-  EXPECT_EQ(r()->error(),
-            "12:34 error: resource variables require [[group]] and [[binding]] "
-            "decorations");
+  EXPECT_EQ(
+      r()->error(),
+      R"(12:34 error: resource variables require @group and @binding decorations)");
 }
 
 TEST_F(ResourceDecorationTest, BindingPairMissingBinding) {
@@ -1018,9 +1018,9 @@
          });
 
   EXPECT_FALSE(r()->Resolve());
-  EXPECT_EQ(r()->error(),
-            "12:34 error: resource variables require [[group]] and [[binding]] "
-            "decorations");
+  EXPECT_EQ(
+      r()->error(),
+      R"(12:34 error: resource variables require @group and @binding decorations)");
 }
 
 TEST_F(ResourceDecorationTest, BindingPairMissingGroup) {
@@ -1031,9 +1031,9 @@
          });
 
   EXPECT_FALSE(r()->Resolve());
-  EXPECT_EQ(r()->error(),
-            "12:34 error: resource variables require [[group]] and [[binding]] "
-            "decorations");
+  EXPECT_EQ(
+      r()->error(),
+      R"(12:34 error: resource variables require @group and @binding decorations)");
 }
 
 TEST_F(ResourceDecorationTest, BindingPointUsedTwiceByEntryPoint) {
@@ -1064,7 +1064,7 @@
   EXPECT_FALSE(r()->Resolve());
   EXPECT_EQ(
       r()->error(),
-      R"(56:78 error: entry point 'F' references multiple variables that use the same resource binding [[group(2), binding(1)]]
+      R"(56:78 error: entry point 'F' references multiple variables that use the same resource binding @group(2), @binding(1)
 12:34 note: first resource binding usage declared here)");
 }
 
@@ -1108,9 +1108,9 @@
          });
 
   EXPECT_FALSE(r()->Resolve());
-  EXPECT_EQ(r()->error(),
-            "12:34 error: non-resource variables must not have [[group]] or "
-            "[[binding]] decorations");
+  EXPECT_EQ(
+      r()->error(),
+      R"(12:34 error: non-resource variables must not have @group or @binding decorations)");
 }
 
 }  // namespace
@@ -1368,9 +1368,9 @@
        ast::DecorationList{Stage(ast::PipelineStage::kFragment)});
 
   EXPECT_FALSE(r()->Resolve());
-  EXPECT_EQ(r()->error(),
-            "12:34 error: interpolate attribute must only be used with "
-            "[[location]]");
+  EXPECT_EQ(
+      r()->error(),
+      R"(12:34 error: interpolate attribute must only be used with @location)");
 }
 
 TEST_F(InterpolateTest, MissingLocationAttribute_ReturnType) {
@@ -1381,9 +1381,9 @@
                     ast::InterpolationSampling::kNone)});
 
   EXPECT_FALSE(r()->Resolve());
-  EXPECT_EQ(r()->error(),
-            "12:34 error: interpolate attribute must only be used with "
-            "[[location]]");
+  EXPECT_EQ(
+      r()->error(),
+      R"(12:34 error: interpolate attribute must only be used with @location)");
 }
 
 TEST_F(InterpolateTest, MissingLocationAttribute_Struct) {
@@ -1393,9 +1393,9 @@
                                 ast::InterpolationSampling::kNone)})});
 
   EXPECT_FALSE(r()->Resolve());
-  EXPECT_EQ(r()->error(),
-            "12:34 error: interpolate attribute must only be used with "
-            "[[location]]");
+  EXPECT_EQ(
+      r()->error(),
+      R"(12:34 error: interpolate attribute must only be used with @location)");
 }
 
 }  // namespace
diff --git a/src/resolver/entry_point_validation_test.cc b/src/resolver/entry_point_validation_test.cc
index 0fc620b..a2c0eac 100644
--- a/src/resolver/entry_point_validation_test.cc
+++ b/src/resolver/entry_point_validation_test.cc
@@ -51,8 +51,8 @@
                                          public testing::Test {};
 
 TEST_F(ResolverEntryPointValidationTest, ReturnTypeAttribute_Location) {
-  // [[stage(fragment)]]
-  // fn main() -> [[location(0)]] f32 { return 1.0; }
+  // @stage(fragment)
+  // fn main() -> @location(0) f32 { return 1.0; }
   Func(Source{{12, 34}}, "main", {}, ty.f32(), {Return(1.0f)},
        {Stage(ast::PipelineStage::kFragment)}, {Location(0)});
 
@@ -60,8 +60,8 @@
 }
 
 TEST_F(ResolverEntryPointValidationTest, ReturnTypeAttribute_Builtin) {
-  // [[stage(vertex)]]
-  // fn main() -> [[builtin(position)]] vec4<f32> { return vec4<f32>(); }
+  // @stage(vertex)
+  // fn main() -> @builtin(position) vec4<f32> { return vec4<f32>(); }
   Func(Source{{12, 34}}, "main", {}, ty.vec4<f32>(),
        {Return(Construct(ty.vec4<f32>()))},
        {Stage(ast::PipelineStage::kVertex)},
@@ -71,7 +71,7 @@
 }
 
 TEST_F(ResolverEntryPointValidationTest, ReturnTypeAttribute_Missing) {
-  // [[stage(vertex)]]
+  // @stage(vertex)
   // fn main() -> f32 {
   //   return 1.0;
   // }
@@ -85,8 +85,8 @@
 }
 
 TEST_F(ResolverEntryPointValidationTest, ReturnTypeAttribute_Multiple) {
-  // [[stage(vertex)]]
-  // fn main() -> [[location(0)]] [[builtin(position)]] vec4<f32> {
+  // @stage(vertex)
+  // fn main() -> @location(0) @builtin(position) vec4<f32> {
   //   return vec4<f32>();
   // }
   Func(Source{{12, 34}}, "main", {}, ty.vec4<f32>(),
@@ -102,10 +102,10 @@
 
 TEST_F(ResolverEntryPointValidationTest, ReturnType_Struct_Valid) {
   // struct Output {
-  //   [[location(0)]] a : f32;
-  //   [[builtin(frag_depth)]] b : f32;
+  //   @location(0) a : f32;
+  //   @builtin(frag_depth) b : f32;
   // };
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn main() -> Output {
   //   return Output();
   // }
@@ -122,9 +122,9 @@
 TEST_F(ResolverEntryPointValidationTest,
        ReturnType_Struct_MemberMultipleAttributes) {
   // struct Output {
-  //   [[location(0)]] [[builtin(frag_depth)]] a : f32;
+  //   @location(0) @builtin(frag_depth) a : f32;
   // };
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn main() -> Output {
   //   return Output();
   // }
@@ -146,10 +146,10 @@
 TEST_F(ResolverEntryPointValidationTest,
        ReturnType_Struct_MemberMissingAttribute) {
   // struct Output {
-  //   [[location(0)]] a : f32;
+  //   @location(0) a : f32;
   //   b : f32;
   // };
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn main() -> Output {
   //   return Output();
   // }
@@ -168,10 +168,10 @@
 
 TEST_F(ResolverEntryPointValidationTest, ReturnType_Struct_DuplicateBuiltins) {
   // struct Output {
-  //   [[builtin(frag_depth)]] a : f32;
-  //   [[builtin(frag_depth)]] b : f32;
+  //   @builtin(frag_depth) a : f32;
+  //   @builtin(frag_depth) b : f32;
   // };
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn main() -> Output {
   //   return Output();
   // }
@@ -190,8 +190,8 @@
 }
 
 TEST_F(ResolverEntryPointValidationTest, ParameterAttribute_Location) {
-  // [[stage(fragment)]]
-  // fn main([[location(0)]] param : f32) {}
+  // @stage(fragment)
+  // fn main(@location(0) param : f32) {}
   auto* param = Param("param", ty.f32(), {Location(0)});
   Func(Source{{12, 34}}, "main", {param}, ty.void_(), {},
        {Stage(ast::PipelineStage::kFragment)});
@@ -200,7 +200,7 @@
 }
 
 TEST_F(ResolverEntryPointValidationTest, ParameterAttribute_Missing) {
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn main(param : f32) {}
   auto* param = Param(Source{{13, 43}}, "param", ty.vec4<f32>());
   Func(Source{{12, 34}}, "main", {param}, ty.void_(), {},
@@ -212,8 +212,8 @@
 }
 
 TEST_F(ResolverEntryPointValidationTest, ParameterAttribute_Multiple) {
-  // [[stage(fragment)]]
-  // fn main([[location(0)]] [[builtin(sample_index)]] param : u32) {}
+  // @stage(fragment)
+  // fn main(@location(0) @builtin(sample_index) param : u32) {}
   auto* param = Param("param", ty.u32(),
                       {Location(Source{{13, 43}}, 0),
                        Builtin(Source{{14, 52}}, ast::Builtin::kSampleIndex)});
@@ -227,10 +227,10 @@
 
 TEST_F(ResolverEntryPointValidationTest, Parameter_Struct_Valid) {
   // struct Input {
-  //   [[location(0)]] a : f32;
-  //   [[builtin(sample_index)]] b : u32;
+  //   @location(0) a : f32;
+  //   @builtin(sample_index) b : u32;
   // };
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn main(param : Input) {}
   auto* input = Structure(
       "Input", {Member("a", ty.f32(), {Location(0)}),
@@ -245,9 +245,9 @@
 TEST_F(ResolverEntryPointValidationTest,
        Parameter_Struct_MemberMultipleAttributes) {
   // struct Input {
-  //   [[location(0)]] [[builtin(sample_index)]] a : u32;
+  //   @location(0) @builtin(sample_index) a : u32;
   // };
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn main(param : Input) {}
   auto* input = Structure(
       "Input",
@@ -267,10 +267,10 @@
 TEST_F(ResolverEntryPointValidationTest,
        Parameter_Struct_MemberMissingAttribute) {
   // struct Input {
-  //   [[location(0)]] a : f32;
+  //   @location(0) a : f32;
   //   b : f32;
   // };
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn main(param : Input) {}
   auto* input = Structure(
       "Input", {Member(Source{{13, 43}}, "a", ty.f32(), {Location(0)}),
@@ -285,9 +285,9 @@
 }
 
 TEST_F(ResolverEntryPointValidationTest, Parameter_DuplicateBuiltins) {
-  // [[stage(fragment)]]
-  // fn main([[builtin(sample_index)]] param_a : u32,
-  //         [[builtin(sample_index)]] param_b : u32) {}
+  // @stage(fragment)
+  // fn main(@builtin(sample_index) param_a : u32,
+  //         @builtin(sample_index) param_b : u32) {}
   auto* param_a =
       Param("param_a", ty.u32(), {Builtin(ast::Builtin::kSampleIndex)});
   auto* param_b =
@@ -304,12 +304,12 @@
 
 TEST_F(ResolverEntryPointValidationTest, Parameter_Struct_DuplicateBuiltins) {
   // struct InputA {
-  //   [[builtin(sample_index)]] a : u32;
+  //   @builtin(sample_index) a : u32;
   // };
   // struct InputB {
-  //   [[builtin(sample_index)]] a : u32;
+  //   @builtin(sample_index) a : u32;
   // };
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn main(param_a : InputA, param_b : InputB) {}
   auto* input_a = Structure(
       "InputA", {Member("a", ty.u32(), {Builtin(ast::Builtin::kSampleIndex)})});
@@ -328,7 +328,7 @@
 }
 
 TEST_F(ResolverEntryPointValidationTest, VertexShaderMustReturnPosition) {
-  // [[stage(vertex)]]
+  // @stage(vertex)
   // fn main() {}
   Func(Source{{12, 34}}, "main", {}, ty.void_(), {},
        {Stage(ast::PipelineStage::kVertex)});
@@ -370,8 +370,8 @@
 };
 
 TEST_P(TypeValidationTest, BareInputs) {
-  // [[stage(fragment)]]
-  // fn main([[location(0)]] a : *) {}
+  // @stage(fragment)
+  // fn main(@location(0) a : *) {}
   auto params = GetParam();
   auto* a = Param("a", params.create_ast_type(*this), {Location(0)});
   Func(Source{{12, 34}}, "main", {a}, ty.void_(), {},
@@ -386,9 +386,9 @@
 
 TEST_P(TypeValidationTest, StructInputs) {
   // struct Input {
-  //   [[location(0)]] a : *;
+  //   @location(0) a : *;
   // };
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn main(a : Input) {}
   auto params = GetParam();
   auto* input = Structure(
@@ -405,8 +405,8 @@
 }
 
 TEST_P(TypeValidationTest, BareOutputs) {
-  // [[stage(fragment)]]
-  // fn main() -> [[location(0)]] * {
+  // @stage(fragment)
+  // fn main() -> @location(0) * {
   //   return *();
   // }
   auto params = GetParam();
@@ -423,9 +423,9 @@
 
 TEST_P(TypeValidationTest, StructOutputs) {
   // struct Output {
-  //   [[location(0)]] a : *;
+  //   @location(0) a : *;
   // };
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn main() -> Output {
   //   return Output();
   // }
@@ -453,8 +453,8 @@
 using LocationDecorationTests = ResolverTest;
 
 TEST_F(LocationDecorationTests, Pass) {
-  // [[stage(fragment)]]
-  // fn frag_main([[location(0)]] a: i32) {}
+  // @stage(fragment)
+  // fn frag_main(@location(0) a: i32) {}
 
   auto* p = Param(Source{{12, 34}}, "a", ty.i32(), {Location(0)});
   Func("frag_main", {p}, ty.void_(), {},
@@ -464,8 +464,8 @@
 }
 
 TEST_F(LocationDecorationTests, BadType_Input_bool) {
-  // [[stage(fragment)]]
-  // fn frag_main([[location(0)]] a: bool) {}
+  // @stage(fragment)
+  // fn frag_main(@location(0) a: bool) {}
 
   auto* p =
       Param(Source{{12, 34}}, "a", ty.bool_(), {Location(Source{{34, 56}}, 0)});
@@ -481,8 +481,8 @@
 }
 
 TEST_F(LocationDecorationTests, BadType_Output_Array) {
-  // [[stage(fragment)]]
-  // fn frag_main()->[[location(0)]] array<f32, 2> { return array<f32, 2>(); }
+  // @stage(fragment)
+  // fn frag_main()->@location(0) array<f32, 2> { return array<f32, 2>(); }
 
   Func(Source{{12, 34}}, "frag_main", {}, ty.array<f32, 2>(),
        {Return(Construct(ty.array<f32, 2>()))},
@@ -500,8 +500,8 @@
   // struct Input {
   //   a : f32;
   // };
-  // [[stage(fragment)]]
-  // fn main([[location(0)]] param : Input) {}
+  // @stage(fragment)
+  // fn main(@location(0) param : Input) {}
   auto* input = Structure("Input", {Member("a", ty.f32())});
   auto* param = Param(Source{{12, 34}}, "param", ty.Of(input),
                       {Location(Source{{13, 43}}, 0)});
@@ -518,12 +518,12 @@
 
 TEST_F(LocationDecorationTests, BadType_Input_Struct_NestedStruct) {
   // struct Inner {
-  //   [[location(0)]] b : f32;
+  //   @location(0) b : f32;
   // };
   // struct Input {
   //   a : Inner;
   // };
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn main(param : Input) {}
   auto* inner = Structure(
       "Inner", {Member(Source{{13, 43}}, "a", ty.f32(), {Location(0)})});
@@ -542,9 +542,9 @@
 TEST_F(LocationDecorationTests, BadType_Input_Struct_RuntimeArray) {
   // [[block]]
   // struct Input {
-  //   [[location(0)]] a : array<f32>;
+  //   @location(0) a : array<f32>;
   // };
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn main(param : Input) {}
   auto* input = Structure(
       "Input",
@@ -564,8 +564,8 @@
 
 TEST_F(LocationDecorationTests, BadMemberType_Input) {
   // [[block]]
-  // struct S { [[location(0)]] m: array<i32>; };
-  // [[stage(fragment)]]
+  // struct S { @location(0) m: array<i32>; };
+  // @stage(fragment)
   // fn frag_main( a: S) {}
 
   auto* m = Member(Source{{34, 56}}, "m", ty.array<i32>(),
@@ -585,8 +585,8 @@
 }
 
 TEST_F(LocationDecorationTests, BadMemberType_Output) {
-  // struct S { [[location(0)]] m: atomic<i32>; };
-  // [[stage(fragment)]]
+  // struct S { @location(0) m: atomic<i32>; };
+  // @stage(fragment)
   // fn frag_main() -> S {}
   auto* m = Member(Source{{34, 56}}, "m", ty.atomic<i32>(),
                    ast::DecorationList{Location(Source{{12, 34}}, 0u)});
@@ -604,7 +604,7 @@
 }
 
 TEST_F(LocationDecorationTests, BadMemberType_Unused) {
-  // struct S { [[location(0)]] m: mat3x2<f32>; };
+  // struct S { @location(0) m: mat3x2<f32>; };
 
   auto* m = Member(Source{{34, 56}}, "m", ty.mat3x2<f32>(),
                    ast::DecorationList{Location(Source{{12, 34}}, 0u)});
@@ -620,10 +620,10 @@
 
 TEST_F(LocationDecorationTests, ReturnType_Struct_Valid) {
   // struct Output {
-  //   [[location(0)]] a : f32;
-  //   [[builtin(frag_depth)]] b : f32;
+  //   @location(0) a : f32;
+  //   @builtin(frag_depth) b : f32;
   // };
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn main() -> Output {
   //   return Output();
   // }
@@ -641,8 +641,8 @@
   // struct Output {
   //   a : f32;
   // };
-  // [[stage(vertex)]]
-  // fn main() -> [[location(0)]] Output {
+  // @stage(vertex)
+  // fn main() -> @location(0) Output {
   //   return Output();
   // }
   auto* output = Structure("Output", {Member("a", ty.f32())});
@@ -660,12 +660,12 @@
 
 TEST_F(LocationDecorationTests, ReturnType_Struct_NestedStruct) {
   // struct Inner {
-  //   [[location(0)]] b : f32;
+  //   @location(0) b : f32;
   // };
   // struct Output {
   //   a : Inner;
   // };
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn main() -> Output { return Output(); }
   auto* inner = Structure(
       "Inner", {Member(Source{{13, 43}}, "a", ty.f32(), {Location(0)})});
@@ -684,9 +684,9 @@
 TEST_F(LocationDecorationTests, ReturnType_Struct_RuntimeArray) {
   // [[block]]
   // struct Output {
-  //   [[location(0)]] a : array<f32>;
+  //   @location(0) a : array<f32>;
   // };
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn main() -> Output {
   //   return Output();
   // }
@@ -760,9 +760,9 @@
 }
 
 TEST_F(LocationDecorationTests, Duplicate_input) {
-  // [[stage(fragment)]]
-  // fn main([[location(1)]] param_a : f32,
-  //         [[location(1)]] param_b : f32) {}
+  // @stage(fragment)
+  // fn main(@location(1) param_a : f32,
+  //         @location(1) param_b : f32) {}
   auto* param_a = Param("param_a", ty.f32(), {Location(1)});
   auto* param_b = Param("param_b", ty.f32(), {Location(Source{{12, 34}}, 1)});
   Func(Source{{12, 34}}, "main", {param_a, param_b}, ty.void_(), {},
@@ -775,12 +775,12 @@
 
 TEST_F(LocationDecorationTests, Duplicate_struct) {
   // struct InputA {
-  //   [[location(1)]] a : f32;
+  //   @location(1) a : f32;
   // };
   // struct InputB {
-  //   [[location(1)]] a : f32;
+  //   @location(1) a : f32;
   // };
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn main(param_a : InputA, param_b : InputB) {}
   auto* input_a = Structure("InputA", {Member("a", ty.f32(), {Location(1)})});
   auto* input_b = Structure(
diff --git a/src/resolver/function_validation_test.cc b/src/resolver/function_validation_test.cc
index f2976de..6263169 100644
--- a/src/resolver/function_validation_test.cc
+++ b/src/resolver/function_validation_test.cc
@@ -353,7 +353,7 @@
 }
 
 TEST_F(ResolverFunctionValidationTest, CannotCallEntryPoint) {
-  // [[stage(compute), workgroup_size(1)]] fn entrypoint() {}
+  // @stage(compute) @workgroup_size(1) fn entrypoint() {}
   // fn func() { return entrypoint(); }
   Func("entrypoint", ast::VariableList{}, ty.void_(), {},
        {Stage(ast::PipelineStage::kCompute), WorkgroupSize(1)});
@@ -371,8 +371,8 @@
 }
 
 TEST_F(ResolverFunctionValidationTest, PipelineStage_MustBeUnique_Fail) {
-  // [[stage(fragment)]]
-  // [[stage(vertex)]]
+  // @stage(fragment)
+  // @stage(vertex)
   // fn main() { return; }
   Func(Source{{12, 34}}, "main", ast::VariableList{}, ty.void_(),
        ast::StatementList{
@@ -440,7 +440,7 @@
 TEST_F(ResolverFunctionValidationTest, WorkgroupSize_GoodType_ConstU32) {
   // let x = 4u;
   // let x = 8u;
-  // [[stage(compute), workgroup_size(x, y, 16u)]]
+  // @stage(compute) @workgroup_size(x, y, 16u)
   // fn main() {}
   auto* x = GlobalConst("x", ty.u32(), Expr(4u));
   auto* y = GlobalConst("y", ty.u32(), Expr(8u));
diff --git a/src/resolver/intrinsic_validation_test.cc b/src/resolver/intrinsic_validation_test.cc
index edae91f..80a3dc9 100644
--- a/src/resolver/intrinsic_validation_test.cc
+++ b/src/resolver/intrinsic_validation_test.cc
@@ -36,7 +36,7 @@
 }
 
 TEST_F(ResolverIntrinsicValidationTest, InvalidPipelineStageDirect) {
-  // [[stage(compute), workgroup_size(1)]] fn func { return dpdx(1.0); }
+  // @stage(compute) @workgroup_size(1) fn func { return dpdx(1.0); }
 
   auto* dpdx = create<ast::CallExpression>(Source{{3, 4}}, Expr("dpdx"),
                                            ast::ExpressionList{Expr(1.0f)});
@@ -53,7 +53,7 @@
   // fn f0 { return dpdx(1.0); }
   // fn f1 { f0(); }
   // fn f2 { f1(); }
-  // [[stage(compute), workgroup_size(1)]] fn main { return f2(); }
+  // @stage(compute) @workgroup_size(1) fn main { return f2(); }
 
   auto* dpdx = create<ast::CallExpression>(Source{{3, 4}}, Expr("dpdx"),
                                            ast::ExpressionList{Expr(1.0f)});
diff --git a/src/resolver/ptr_ref_validation_test.cc b/src/resolver/ptr_ref_validation_test.cc
index 367b209..003388a 100644
--- a/src/resolver/ptr_ref_validation_test.cc
+++ b/src/resolver/ptr_ref_validation_test.cc
@@ -53,7 +53,7 @@
 }
 
 TEST_F(ResolverPtrRefValidationTest, AddressOfHandle) {
-  // [[group(0), binding(0)]] var t: texture_3d<f32>;
+  // @group(0) @binding(0) var t: texture_3d<f32>;
   // &t
   Global("t", ty.sampled_texture(ast::TextureDimension::k3d, ty.f32()),
          GroupAndBinding(0u, 0u));
@@ -95,7 +95,7 @@
 }
 
 TEST_F(ResolverPtrRefValidationTest, IndirectOfAddressOfHandle) {
-  // [[group(0), binding(0)]] var t: texture_3d<f32>;
+  // @group(0) @binding(0) var t: texture_3d<f32>;
   // *&t
   Global("t", ty.sampled_texture(ast::TextureDimension::k3d, ty.f32()),
          GroupAndBinding(0u, 0u));
@@ -142,7 +142,7 @@
   // [[block]] struct S {
   //    inner: Inner;
   // }
-  // [[group(0), binding(0)]] var<storage, read_write> s : S;
+  // @group(0) @binding(0) var<storage, read_write> s : S;
   // fn f() {
   //   let p : pointer<storage, i32> = &s.inner.arr[2];
   // }
diff --git a/src/resolver/resolver.cc b/src/resolver/resolver.cc
index 434f7ff..1cfed25 100644
--- a/src/resolver/resolver.cc
+++ b/src/resolver/resolver.cc
@@ -2151,7 +2151,7 @@
     return nullptr;
   }
 
-  // Look for explicit stride via [[stride(n)]] decoration
+  // Look for explicit stride via @stride(n) decoration
   uint32_t explicit_stride = 0;
   for (auto* deco : arr->decorations) {
     Mark(deco);
diff --git a/src/resolver/resolver_test.cc b/src/resolver/resolver_test.cc
index a32f563..5b97b25 100644
--- a/src/resolver/resolver_test.cc
+++ b/src/resolver/resolver_test.cc
@@ -920,7 +920,7 @@
 }
 
 TEST_F(ResolverTest, Function_WorkgroupSize_NotSet) {
-  // [[stage(compute), workgroup_size(1)]]
+  // @stage(compute) @workgroup_size(1)
   // fn main() {}
   auto* func = Func("main", ast::VariableList{}, ty.void_(), {}, {});
 
@@ -938,7 +938,7 @@
 }
 
 TEST_F(ResolverTest, Function_WorkgroupSize_Literals) {
-  // [[stage(compute), workgroup_size(8, 2, 3)]]
+  // @stage(compute) @workgroup_size(8, 2, 3)
   // fn main() {}
   auto* func =
       Func("main", ast::VariableList{}, ty.void_(), {},
@@ -961,7 +961,7 @@
   // let width = 16;
   // let height = 8;
   // let depth = 2;
-  // [[stage(compute), workgroup_size(width, height, depth)]]
+  // @stage(compute) @workgroup_size(width, height, depth)
   // fn main() {}
   GlobalConst("width", ty.i32(), Expr(16));
   GlobalConst("height", ty.i32(), Expr(8));
@@ -986,7 +986,7 @@
 TEST_F(ResolverTest, Function_WorkgroupSize_Consts_NestedInitializer) {
   // let width = i32(i32(i32(8)));
   // let height = i32(i32(i32(4)));
-  // [[stage(compute), workgroup_size(width, height)]]
+  // @stage(compute) @workgroup_size(width, height)
   // fn main() {}
   GlobalConst("width", ty.i32(),
               Construct(ty.i32(), Construct(ty.i32(), Construct(ty.i32(), 8))));
@@ -1010,10 +1010,10 @@
 }
 
 TEST_F(ResolverTest, Function_WorkgroupSize_OverridableConsts) {
-  // [[override(0)]] let width = 16;
-  // [[override(1)]] let height = 8;
-  // [[override(2)]] let depth = 2;
-  // [[stage(compute), workgroup_size(width, height, depth)]]
+  // @override(0) let width = 16;
+  // @override(1) let height = 8;
+  // @override(2) let depth = 2;
+  // @stage(compute) @workgroup_size(width, height, depth)
   // fn main() {}
   auto* width = GlobalConst("width", ty.i32(), Expr(16), {Override(0)});
   auto* height = GlobalConst("height", ty.i32(), Expr(8), {Override(1)});
@@ -1036,10 +1036,10 @@
 }
 
 TEST_F(ResolverTest, Function_WorkgroupSize_OverridableConsts_NoInit) {
-  // [[override(0)]] let width : i32;
-  // [[override(1)]] let height : i32;
-  // [[override(2)]] let depth : i32;
-  // [[stage(compute), workgroup_size(width, height, depth)]]
+  // @override(0) let width : i32;
+  // @override(1) let height : i32;
+  // @override(2) let depth : i32;
+  // @stage(compute) @workgroup_size(width, height, depth)
   // fn main() {}
   auto* width = GlobalConst("width", ty.i32(), nullptr, {Override(0)});
   auto* height = GlobalConst("height", ty.i32(), nullptr, {Override(1)});
@@ -1062,9 +1062,9 @@
 }
 
 TEST_F(ResolverTest, Function_WorkgroupSize_Mixed) {
-  // [[override(1)]] let height = 2;
+  // @override(1) let height = 2;
   // let depth = 3;
-  // [[stage(compute), workgroup_size(8, height, depth)]]
+  // @stage(compute) @workgroup_size(8, height, depth)
   // fn main() {}
   auto* height = GlobalConst("height", ty.i32(), Expr(2), {Override(0)});
   GlobalConst("depth", ty.i32(), Expr(3));
@@ -1816,8 +1816,8 @@
 }
 
 TEST_F(ResolverTest, BindingPoint_SetForResources) {
-  // [[group(1), binding(2)]] var s1 : sampler;
-  // [[group(3), binding(4)]] var s2 : sampler;
+  // @group(1) @binding(2) var s1 : sampler;
+  // @group(3) @binding(4) var s2 : sampler;
   auto* s1 = Global(Sym(), ty.sampler(ast::SamplerKind::kSampler),
                     ast::DecorationList{create<ast::GroupDecoration>(1),
                                         create<ast::BindingDecoration>(2)});
diff --git a/src/resolver/resolver_validation.cc b/src/resolver/resolver_validation.cc
index 3218e4a..5edc4ee 100644
--- a/src/resolver/resolver_validation.cc
+++ b/src/resolver/resolver_validation.cc
@@ -271,8 +271,8 @@
                    "' must be a multiple of " + std::to_string(required_align) +
                    " bytes, but '" + member_name_of(m) +
                    "' is currently at offset " + std::to_string(m->Offset()) +
-                   ". Consider setting [[align(" +
-                   std::to_string(required_align) + ")]] on this member",
+                   ". Consider setting @align(" +
+                   std::to_string(required_align) + ") on this member",
                m->Declaration()->source);
 
       AddNote("see layout of struct:\n" + str->Layout(builder_->Symbols()),
@@ -299,7 +299,7 @@
             "member be a multiple of 16 bytes, but there are currently " +
                 std::to_string(prev_to_curr_offset) + " bytes between '" +
                 member_name_of(prev_member) + "' and '" + member_name_of(m) +
-                "'. Consider setting [[align(16)]] on this member",
+                "'. Consider setting @align(16) on this member",
             m->Declaration()->source);
 
         AddNote("see layout of struct:\n" + str->Layout(builder_->Symbols()),
@@ -326,10 +326,10 @@
               "bytes, but array stride of '" +
                   member_name_of(m) + "' is currently " +
                   std::to_string(arr->Stride()) +
-                  ". Consider setting [[stride(" +
+                  ". Consider setting @stride(" +
                   std::to_string(
                       utils::RoundUp(required_align, arr->Stride())) +
-                  ")]] on the array type",
+                  ") on the array type",
               m->Declaration()->type->source);
           AddNote("see layout of struct:\n" + str->Layout(builder_->Symbols()),
                   str->Declaration()->source);
@@ -429,7 +429,7 @@
       // attributes.
       if (!binding_point) {
         AddError(
-            "resource variables require [[group]] and [[binding]] "
+            "resource variables require @group and @binding "
             "decorations",
             decl->source);
         return false;
@@ -441,7 +441,7 @@
         // https://gpuweb.github.io/gpuweb/wgsl/#attribute-binding
         // Must only be applied to a resource variable
         AddError(
-            "non-resource variables must not have [[group]] or [[binding]] "
+            "non-resource variables must not have @group or @binding "
             "decorations",
             decl->source);
         return false;
@@ -1037,7 +1037,7 @@
       if (interpolate_attribute) {
         if (!pipeline_io_attribute ||
             !pipeline_io_attribute->Is<ast::LocationDecoration>()) {
-          AddError("interpolate attribute must only be used with [[location]]",
+          AddError("interpolate attribute must only be used with @location",
                    interpolate_attribute->source);
           return false;
         }
@@ -1167,9 +1167,9 @@
       auto func_name = builder_->Symbols().NameFor(decl->symbol);
       AddError("entry point '" + func_name +
                    "' references multiple variables that use the "
-                   "same resource binding [[group(" +
-                   std::to_string(bp.group) + "), binding(" +
-                   std::to_string(bp.binding) + ")]]",
+                   "same resource binding @group(" +
+                   std::to_string(bp.group) + "), @binding(" +
+                   std::to_string(bp.binding) + ")",
                var_decl->source);
       AddNote("first resource binding usage declared here",
               res.first->second->source);
@@ -2035,7 +2035,7 @@
     }
 
     if (interpolate_attribute && !has_location) {
-      AddError("interpolate attribute must only be used with [[location]]",
+      AddError("interpolate attribute must only be used with @location",
                interpolate_attribute->source);
       return false;
     }
diff --git a/src/resolver/storage_class_layout_validation_test.cc b/src/resolver/storage_class_layout_validation_test.cc
index 467608d..f9fcc12 100644
--- a/src/resolver/storage_class_layout_validation_test.cc
+++ b/src/resolver/storage_class_layout_validation_test.cc
@@ -28,10 +28,10 @@
        StorageBuffer_UnalignedMember) {
   // [[block]]
   // struct S {
-  //     [[size(5)]] a : f32;
-  //     [[align(1)]] b : f32;
+  //     @size(5) a : f32;
+  //     @align(1) b : f32;
   // };
-  // [[group(0), binding(0)]]
+  // @group(0) @binding(0)
   // var<storage> a : S;
 
   Structure(Source{{12, 34}}, "S",
@@ -45,7 +45,7 @@
   ASSERT_FALSE(r()->Resolve());
   EXPECT_EQ(
       r()->error(),
-      R"(34:56 error: the offset of a struct member of type 'f32' in storage class 'storage' must be a multiple of 4 bytes, but 'b' is currently at offset 5. Consider setting [[align(4)]] on this member
+      R"(34:56 error: the offset of a struct member of type 'f32' in storage class 'storage' must be a multiple of 4 bytes, but 'b' is currently at offset 5. Consider setting @align(4) on this member
 12:34 note: see layout of struct:
 /*           align(4) size(12) */ struct S {
 /* offset(0) align(4) size( 5) */   a : f32;
@@ -59,10 +59,10 @@
        StorageBuffer_UnalignedMember_SuggestedFix) {
   // [[block]]
   // struct S {
-  //     [[size(5)]] a : f32;
-  //     [[align(4)]] b : f32;
+  //     @size(5) a : f32;
+  //     @align(4) b : f32;
   // };
-  // [[group(0), binding(0)]]
+  // @group(0) @binding(0)
   // var<storage> a : S;
 
   Structure(Source{{12, 34}}, "S",
@@ -89,7 +89,7 @@
   //   inner : Inner;
   // };
   //
-  // [[group(0), binding(0)]]
+  // @group(0) @binding(0)
   // var<uniform> a : Outer;
 
   Structure(Source{{12, 34}}, "Inner", {Member("scalar", ty.i32())});
@@ -107,7 +107,7 @@
   ASSERT_FALSE(r()->Resolve());
   EXPECT_EQ(
       r()->error(),
-      R"(56:78 error: the offset of a struct member of type 'Inner' in storage class 'uniform' must be a multiple of 16 bytes, but 'inner' is currently at offset 4. Consider setting [[align(16)]] on this member
+      R"(56:78 error: the offset of a struct member of type 'Inner' in storage class 'uniform' must be a multiple of 16 bytes, but 'inner' is currently at offset 4. Consider setting @align(16) on this member
 34:56 note: see layout of struct:
 /*           align(4) size(8) */ struct Outer {
 /* offset(0) align(4) size(4) */   scalar : f32;
@@ -129,10 +129,10 @@
   // [[block]]
   // struct Outer {
   //   scalar : f32;
-  //   [[align(16)]] inner : Inner;
+  //   @align(16) inner : Inner;
   // };
   //
-  // [[group(0), binding(0)]]
+  // @group(0) @binding(0)
   // var<uniform> a : Outer;
 
   Structure(Source{{12, 34}}, "Inner", {Member("scalar", ty.i32())});
@@ -154,7 +154,7 @@
 // Detect unaligned array member for uniform buffers
 TEST_F(ResolverStorageClassLayoutValidationTest,
        UniformBuffer_UnalignedMember_Array) {
-  // type Inner = [[stride(16)]] array<f32, 10>;
+  // type Inner = @stride(16) array<f32, 10>;
   //
   // [[block]]
   // struct Outer {
@@ -162,7 +162,7 @@
   //   inner : Inner;
   // };
   //
-  // [[group(0), binding(0)]]
+  // @group(0) @binding(0)
   // var<uniform> a : Outer;
   Alias("Inner", ty.array(ty.f32(), 10, 16));
 
@@ -179,26 +179,26 @@
   ASSERT_FALSE(r()->Resolve());
   EXPECT_EQ(
       r()->error(),
-      R"(56:78 error: the offset of a struct member of type '[[stride(16)]] array<f32, 10>' in storage class 'uniform' must be a multiple of 16 bytes, but 'inner' is currently at offset 4. Consider setting [[align(16)]] on this member
+      R"(56:78 error: the offset of a struct member of type '@stride(16) array<f32, 10>' in storage class 'uniform' must be a multiple of 16 bytes, but 'inner' is currently at offset 4. Consider setting @align(16) on this member
 12:34 note: see layout of struct:
 /*             align(4) size(164) */ struct Outer {
 /* offset(  0) align(4) size(  4) */   scalar : f32;
-/* offset(  4) align(4) size(160) */   inner : [[stride(16)]] array<f32, 10>;
+/* offset(  4) align(4) size(160) */   inner : @stride(16) array<f32, 10>;
 /*                                */ };
 78:90 note: see declaration of variable)");
 }
 
 TEST_F(ResolverStorageClassLayoutValidationTest,
        UniformBuffer_UnalignedMember_Array_SuggestedFix) {
-  // type Inner = [[stride(16)]] array<f32, 10>;
+  // type Inner = @stride(16) array<f32, 10>;
   //
   // [[block]]
   // struct Outer {
   //   scalar : f32;
-  //   [[align(16)]] inner : Inner;
+  //   @align(16) inner : Inner;
   // };
   //
-  // [[group(0), binding(0)]]
+  // @group(0) @binding(0)
   // var<uniform> a : Outer;
   Alias("Inner", ty.array(ty.f32(), 10, 16));
 
@@ -221,7 +221,7 @@
 TEST_F(ResolverStorageClassLayoutValidationTest,
        UniformBuffer_MembersOffsetNotMultipleOf16) {
   // struct Inner {
-  //   [[align(1), size(5)]] scalar : i32;
+  //   @align(1) @size(5) scalar : i32;
   // };
   //
   // [[block]]
@@ -230,7 +230,7 @@
   //   scalar : i32;
   // };
   //
-  // [[group(0), binding(0)]]
+  // @group(0) @binding(0)
   // var<uniform> a : Outer;
 
   Structure(Source{{12, 34}}, "Inner",
@@ -249,7 +249,7 @@
   ASSERT_FALSE(r()->Resolve());
   EXPECT_EQ(
       r()->error(),
-      R"(78:90 error: uniform storage requires that the number of bytes between the start of the previous member of type struct and the current member be a multiple of 16 bytes, but there are currently 8 bytes between 'inner' and 'scalar'. Consider setting [[align(16)]] on this member
+      R"(78:90 error: uniform storage requires that the number of bytes between the start of the previous member of type struct and the current member be a multiple of 16 bytes, but there are currently 8 bytes between 'inner' and 'scalar'. Consider setting @align(16) on this member
 34:56 note: see layout of struct:
 /*            align(4) size(12) */ struct Outer {
 /* offset( 0) align(1) size( 5) */   inner : Inner;
@@ -270,7 +270,7 @@
   //   a : i32;
   //   b : i32;
   //   c : i32;
-  //   [[align(1), size(5)]] scalar : i32;
+  //   @align(1) @size(5) scalar : i32;
   // };
   //
   // [[block]]
@@ -279,7 +279,7 @@
   //   scalar : i32;
   // };
   //
-  // [[group(0), binding(0)]]
+  // @group(0) @binding(0)
   // var<uniform> a : Outer;
 
   Structure(Source{{12, 34}}, "Inner",
@@ -303,7 +303,7 @@
   ASSERT_FALSE(r()->Resolve());
   EXPECT_EQ(
       r()->error(),
-      R"(78:90 error: uniform storage requires that the number of bytes between the start of the previous member of type struct and the current member be a multiple of 16 bytes, but there are currently 20 bytes between 'inner' and 'scalar'. Consider setting [[align(16)]] on this member
+      R"(78:90 error: uniform storage requires that the number of bytes between the start of the previous member of type struct and the current member be a multiple of 16 bytes, but there are currently 20 bytes between 'inner' and 'scalar'. Consider setting @align(16) on this member
 34:56 note: see layout of struct:
 /*            align(4) size(24) */ struct Outer {
 /* offset( 0) align(4) size(20) */   inner : Inner;
@@ -323,16 +323,16 @@
 TEST_F(ResolverStorageClassLayoutValidationTest,
        UniformBuffer_MembersOffsetNotMultipleOf16_SuggestedFix) {
   // struct Inner {
-  //   [[align(1), size(5)]] scalar : i32;
+  //   @align(1) @size(5) scalar : i32;
   // };
   //
   // [[block]]
   // struct Outer {
-  //   [[align(16)]] inner : Inner;
+  //   @align(16) inner : Inner;
   //   scalar : i32;
   // };
   //
-  // [[group(0), binding(0)]]
+  // @group(0) @binding(0)
   // var<uniform> a : Outer;
 
   Structure(Source{{12, 34}}, "Inner",
@@ -360,7 +360,7 @@
   //     v : vec3<f32>;
   //     s : f32;
   // };
-  // [[group(0), binding(0)]]
+  // @group(0) @binding(0)
   // var<uniform> a : ScalarPackedAtEndOfVec3;
 
   Structure("ScalarPackedAtEndOfVec3",
@@ -379,7 +379,7 @@
 // Detect array stride must be a multiple of 16 bytes for uniform buffers
 TEST_F(ResolverStorageClassLayoutValidationTest,
        UniformBuffer_InvalidArrayStride) {
-  // type Inner = [[stride(8)]] array<f32, 10>;
+  // type Inner = @stride(8) array<f32, 10>;
   //
   // [[block]]
   // struct Outer {
@@ -387,7 +387,7 @@
   //   scalar : i32;
   // };
   //
-  // [[group(0), binding(0)]]
+  // @group(0) @binding(0)
   // var<uniform> a : Outer;
 
   Alias("Inner", ty.array(ty.f32(), 10, 8));
@@ -405,10 +405,10 @@
   ASSERT_FALSE(r()->Resolve());
   EXPECT_EQ(
       r()->error(),
-      R"(34:56 error: uniform storage requires that array elements be aligned to 16 bytes, but array stride of 'inner' is currently 8. Consider setting [[stride(16)]] on the array type
+      R"(34:56 error: uniform storage requires that array elements be aligned to 16 bytes, but array stride of 'inner' is currently 8. Consider setting @stride(16) on the array type
 12:34 note: see layout of struct:
 /*            align(4) size(84) */ struct Outer {
-/* offset( 0) align(4) size(80) */   inner : [[stride(8)]] array<f32, 10>;
+/* offset( 0) align(4) size(80) */   inner : @stride(8) array<f32, 10>;
 /* offset(80) align(4) size( 4) */   scalar : i32;
 /*                              */ };
 78:90 note: see declaration of variable)");
@@ -416,7 +416,7 @@
 
 TEST_F(ResolverStorageClassLayoutValidationTest,
        UniformBuffer_InvalidArrayStride_SuggestedFix) {
-  // type Inner = [[stride(16)]] array<f32, 10>;
+  // type Inner = @stride(16) array<f32, 10>;
   //
   // [[block]]
   // struct Outer {
@@ -424,7 +424,7 @@
   //   scalar : i32;
   // };
   //
-  // [[group(0), binding(0)]]
+  // @group(0) @binding(0)
   // var<uniform> a : Outer;
 
   Alias("Inner", ty.array(ty.f32(), 10, 16));
diff --git a/src/resolver/storage_class_validation_test.cc b/src/resolver/storage_class_validation_test.cc
index 5d922c2..9965e08 100644
--- a/src/resolver/storage_class_validation_test.cc
+++ b/src/resolver/storage_class_validation_test.cc
@@ -226,7 +226,7 @@
 
 TEST_F(ResolverStorageClassValidationTest, UniformBuffer_Struct_Runtime) {
   // [[block]] struct S { m:  array<f32>; };
-  // [[group(0), binding(0)]] var<uniform, > svar : S;
+  // @group(0) @binding(0) var<uniform, > svar : S;
 
   auto* s = Structure(Source{{12, 34}}, "S", {Member("m", ty.array<i32>())},
                       {create<ast::StructBlockDecoration>()});
diff --git a/src/resolver/type_validation_test.cc b/src/resolver/type_validation_test.cc
index 08f37be..292a57f 100644
--- a/src/resolver/type_validation_test.cc
+++ b/src/resolver/type_validation_test.cc
@@ -79,7 +79,7 @@
 }
 
 TEST_F(ResolverTypeValidationTest, GlobalConstantNoConstructor_Pass) {
-  // [[override(0)]] let a :i32;
+  // @override(0) let a :i32;
   GlobalConst(Source{{12, 34}}, "a", ty.i32(), nullptr,
               ast::DecorationList{create<ast::OverrideDecoration>(0)});
 
@@ -336,7 +336,7 @@
 }
 
 TEST_F(ResolverTypeValidationTest, ArraySize_TooBig_ExplicitStride) {
-  // var<private> a : [[stride(8)]] array<f32, 0x20000000>;
+  // var<private> a : @stride(8) array<f32, 0x20000000>;
   Global("a", ty.array(Source{{12, 34}}, ty.f32(), 0x20000000, 8),
          ast::StorageClass::kPrivate);
   EXPECT_FALSE(r()->Resolve());
@@ -396,7 +396,7 @@
 }
 
 TEST_F(ResolverTypeValidationTest, RuntimeArrayInFunction_Fail) {
-  /// [[stage(vertex)]]
+  /// @stage(vertex)
   // fn func() { var a : array<i32>; }
 
   auto* var =
@@ -594,7 +594,7 @@
 
 TEST_F(ResolverTypeValidationTest, RuntimeArrayAsParameter_Fail) {
   // fn func(a : array<u32>) {}
-  // [[stage(vertex)]] fn main() {}
+  // @stage(vertex) fn main() {}
 
   auto* param = Param(Source{{12, 34}}, "a", ty.array<i32>());
 
@@ -855,7 +855,7 @@
 
 using StorageTextureDimensionTest = ResolverTestWithParam<DimensionParams>;
 TEST_P(StorageTextureDimensionTest, All) {
-  // [[group(0), binding(0)]]
+  // @group(0) @binding(0)
   // var a : texture_storage_*<ru32int, write>;
   auto& params = GetParam();
 
@@ -905,13 +905,13 @@
 using StorageTextureFormatTest = ResolverTestWithParam<FormatParams>;
 TEST_P(StorageTextureFormatTest, All) {
   auto& params = GetParam();
-  // [[group(0), binding(0)]]
+  // @group(0) @binding(0)
   // var a : texture_storage_1d<*, write>;
-  // [[group(0), binding(1)]]
+  // @group(0) @binding(1)
   // var b : texture_storage_2d<*, write>;
-  // [[group(0), binding(2)]]
+  // @group(0) @binding(2)
   // var c : texture_storage_2d_array<*, write>;
-  // [[group(0), binding(3)]]
+  // @group(0) @binding(3)
   // var d : texture_storage_3d<*, write>;
 
   auto* st_a = ty.storage_texture(Source{{12, 34}}, ast::TextureDimension::k1d,
@@ -951,7 +951,7 @@
 using StorageTextureAccessTest = ResolverTest;
 
 TEST_F(StorageTextureAccessTest, MissingAccess_Fail) {
-  // [[group(0), binding(0)]]
+  // @group(0) @binding(0)
   // var a : texture_storage_1d<ru32int>;
 
   auto* st =
@@ -967,7 +967,7 @@
 }
 
 TEST_F(StorageTextureAccessTest, RWAccess_Fail) {
-  // [[group(0), binding(0)]]
+  // @group(0) @binding(0)
   // var a : texture_storage_1d<ru32int, read_write>;
 
   auto* st =
@@ -984,7 +984,7 @@
 }
 
 TEST_F(StorageTextureAccessTest, ReadOnlyAccess_Fail) {
-  // [[group(0), binding(0)]]
+  // @group(0) @binding(0)
   // var a : texture_storage_1d<ru32int, read>;
 
   auto* st = ty.storage_texture(Source{{12, 34}}, ast::TextureDimension::k1d,
@@ -1000,7 +1000,7 @@
 }
 
 TEST_F(StorageTextureAccessTest, WriteOnlyAccess_Pass) {
-  // [[group(0), binding(0)]]
+  // @group(0) @binding(0)
   // var a : texture_storage_1d<ru32int, write>;
 
   auto* st =
diff --git a/src/resolver/validation_test.cc b/src/resolver/validation_test.cc
index 0b3152a..2a8e41b 100644
--- a/src/resolver/validation_test.cc
+++ b/src/resolver/validation_test.cc
@@ -80,7 +80,7 @@
   // var<workgroup> dst : vec4<f32>;
   // fn f2(){ dst = wg; }
   // fn f1() { f2(); }
-  // [[stage(fragment)]]
+  // @stage(fragment)
   // fn f0() {
   //  f1();
   //}
diff --git a/src/resolver/var_let_test.cc b/src/resolver/var_let_test.cc
index 631537b..0bce039 100644
--- a/src/resolver/var_let_test.cc
+++ b/src/resolver/var_let_test.cc
@@ -288,7 +288,7 @@
   // [[block]] struct S {
   //    inner: Inner;
   // }
-  // [[group(0), binding(0)]] var<storage, read_write> s : S;
+  // @group(0) @binding(0) var<storage, read_write> s : S;
   // fn f() {
   //   let p = &s.inner.arr[2];
   // }
diff --git a/src/resolver/var_let_validation_test.cc b/src/resolver/var_let_validation_test.cc
index 9ee07b0..8260136 100644
--- a/src/resolver/var_let_validation_test.cc
+++ b/src/resolver/var_let_validation_test.cc
@@ -79,7 +79,7 @@
 }
 
 TEST_F(ResolverVarLetValidationTest, LetTypeNotConstructible) {
-  // [[group(0), binding(0)]] var t1 : texture_2d<f32>;
+  // @group(0) @binding(0) var t1 : texture_2d<f32>;
   // let t2 : t1;
   auto* t1 =
       Global("t1", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()),
@@ -223,7 +223,7 @@
   // [[block]] struct S {
   //    inner: Inner;
   // }
-  // [[group(0), binding(0)]] var<storage> s : S;
+  // @group(0) @binding(0) var<storage> s : S;
   // fn f() {
   //   let p : pointer<storage, i32, read_write> = &s.inner.arr[2];
   // }
@@ -286,7 +286,7 @@
 }
 
 TEST_F(ResolverVarLetValidationTest, NonConstructibleType_InferredType) {
-  // [[group(0), binding(0)]] var s : sampler;
+  // @group(0) @binding(0) var s : sampler;
   // fn foo() {
   //   var v = s;
   // }
diff --git a/src/sem/array.cc b/src/sem/array.cc
index a5757be..9bb3604 100644
--- a/src/sem/array.cc
+++ b/src/sem/array.cc
@@ -58,7 +58,7 @@
 std::string Array::FriendlyName(const SymbolTable& symbols) const {
   std::ostringstream out;
   if (!IsStrideImplicit()) {
-    out << "[[stride(" << stride_ << ")]] ";
+    out << "@stride(" << stride_ << ") ";
   }
   out << "array<" << element_->FriendlyName(symbols);
   if (!IsRuntimeSized()) {
diff --git a/src/sem/array.h b/src/sem/array.h
index b1992ff..feb4020 100644
--- a/src/sem/array.h
+++ b/src/sem/array.h
@@ -61,12 +61,12 @@
 
   /// @returns the byte alignment of the array
   /// @note this may differ from the alignment of a structure member of this
-  /// array type, if the member is annotated with the `[[align(n)]]` decoration.
+  /// array type, if the member is annotated with the `@align(n)` decoration.
   uint32_t Align() const override;
 
   /// @returns the byte size of the array
   /// @note this may differ from the size of a structure member of this array
-  /// type, if the member is annotated with the `[[size(n)]]` decoration.
+  /// type, if the member is annotated with the `@size(n)` decoration.
   uint32_t Size() const override;
 
   /// @returns the number of bytes from the start of one element of the
diff --git a/src/sem/sem_array_test.cc b/src/sem/sem_array_test.cc
index 04207b6..a74c58f 100644
--- a/src/sem/sem_array_test.cc
+++ b/src/sem/sem_array_test.cc
@@ -65,12 +65,12 @@
 
 TEST_F(ArrayTest, FriendlyNameRuntimeSizedNonImplicitStride) {
   auto* arr = create<Array>(create<I32>(), 0, 0, 4, 8, 4);
-  EXPECT_EQ(arr->FriendlyName(Symbols()), "[[stride(8)]] array<i32>");
+  EXPECT_EQ(arr->FriendlyName(Symbols()), "@stride(8) array<i32>");
 }
 
 TEST_F(ArrayTest, FriendlyNameStaticSizedNonImplicitStride) {
   auto* arr = create<Array>(create<I32>(), 5, 4, 20, 8, 4);
-  EXPECT_EQ(arr->FriendlyName(Symbols()), "[[stride(8)]] array<i32, 5>");
+  EXPECT_EQ(arr->FriendlyName(Symbols()), "@stride(8) array<i32, 5>");
 }
 
 TEST_F(ArrayTest, TypeName_RuntimeArray) {
diff --git a/src/sem/struct.h b/src/sem/struct.h
index 3c42c6c..f041058 100644
--- a/src/sem/struct.h
+++ b/src/sem/struct.h
@@ -89,13 +89,13 @@
 
   /// @returns the byte alignment of the structure
   /// @note this may differ from the alignment of a structure member of this
-  /// structure type, if the member is annotated with the `[[align(n)]]`
+  /// structure type, if the member is annotated with the `@align(n)`
   /// decoration.
   uint32_t Align() const override;
 
   /// @returns the byte size of the structure
   /// @note this may differ from the size of a structure member of this
-  /// structure type, if the member is annotated with the `[[size(n)]]`
+  /// structure type, if the member is annotated with the `@size(n)`
   /// decoration.
   uint32_t Size() const override;
 
diff --git a/src/transform/add_empty_entry_point_test.cc b/src/transform/add_empty_entry_point_test.cc
index 722af1a..4cee0bc 100644
--- a/src/transform/add_empty_entry_point_test.cc
+++ b/src/transform/add_empty_entry_point_test.cc
@@ -28,7 +28,7 @@
   auto* src = R"()";
 
   auto* expect = R"(
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn unused_entry_point() {
 }
 )";
@@ -40,7 +40,7 @@
 
 TEST_F(AddEmptyEntryPointTest, ExistingEntryPoint) {
   auto* src = R"(
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
 }
 )";
@@ -56,7 +56,7 @@
   auto* src = R"(var<private> unused_entry_point : f32;)";
 
   auto* expect = R"(
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn unused_entry_point_1() {
 }
 
diff --git a/src/transform/add_spirv_block_decoration.h b/src/transform/add_spirv_block_decoration.h
index c5e67bb..2f23fb9 100644
--- a/src/transform/add_spirv_block_decoration.h
+++ b/src/transform/add_spirv_block_decoration.h
@@ -24,10 +24,10 @@
 namespace transform {
 
 /// AddSpirvBlockDecoration is a transform that adds an
-/// [[internal(spirv_block)]] attribute to any structure that is used as the
+/// `@internal(spirv_block)` attribute to any structure that is used as the
 /// store type of a buffer. If that structure is nested inside another structure
 /// or an array, then it is wrapped inside another structure which gets the
-/// [[internal(spirv_block)]] attribute instead.
+/// `@internal(spirv_block)` attribute instead.
 class AddSpirvBlockDecoration
     : public Castable<AddSpirvBlockDecoration, Transform> {
  public:
@@ -43,7 +43,7 @@
     ~SpirvBlockDecoration() override;
 
     /// @return a short description of the internal decoration which will be
-    /// displayed as `[[internal(<name>)]]`
+    /// displayed as `@internal(<name>)`
     std::string InternalName() const override;
 
     /// Performs a deep clone of this object using the CloneContext `ctx`.
diff --git a/src/transform/add_spirv_block_decoration_test.cc b/src/transform/add_spirv_block_decoration_test.cc
index e504c50..3a8455f 100644
--- a/src/transform/add_spirv_block_decoration_test.cc
+++ b/src/transform/add_spirv_block_decoration_test.cc
@@ -42,7 +42,7 @@
 
 var<private> p : S;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   p.f = 1.0;
 }
@@ -57,11 +57,11 @@
 TEST_F(AddSpirvBlockDecorationTest, Noop_UsedForShaderIO) {
   auto* src = R"(
 struct S {
-  [[location(0)]]
+  @location(0)
   f : f32;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> S {
   return S();
 }
@@ -75,23 +75,23 @@
 
 TEST_F(AddSpirvBlockDecorationTest, BasicScalar) {
   auto* src = R"(
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u : f32;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let f = u;
 }
 )";
   auto* expect = R"(
-[[internal(spirv_block)]]
+@internal(spirv_block)
 struct u_block {
   inner : f32;
 }
 
-[[group(0), binding(0)]] var<uniform> u : u_block;
+@group(0) @binding(0) var<uniform> u : u_block;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let f = u.inner;
 }
@@ -104,23 +104,23 @@
 
 TEST_F(AddSpirvBlockDecorationTest, BasicArray) {
   auto* src = R"(
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u : array<vec4<f32>, 4u>;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let a = u;
 }
 )";
   auto* expect = R"(
-[[internal(spirv_block)]]
+@internal(spirv_block)
 struct u_block {
   inner : array<vec4<f32>, 4u>;
 }
 
-[[group(0), binding(0)]] var<uniform> u : u_block;
+@group(0) @binding(0) var<uniform> u : u_block;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let a = u.inner;
 }
@@ -135,10 +135,10 @@
   auto* src = R"(
 type Numbers = array<vec4<f32>, 4u>;
 
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u : Numbers;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let a = u;
 }
@@ -146,14 +146,14 @@
   auto* expect = R"(
 type Numbers = array<vec4<f32>, 4u>;
 
-[[internal(spirv_block)]]
+@internal(spirv_block)
 struct u_block {
   inner : array<vec4<f32>, 4u>;
 }
 
-[[group(0), binding(0)]] var<uniform> u : u_block;
+@group(0) @binding(0) var<uniform> u : u_block;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let a = u.inner;
 }
@@ -170,23 +170,23 @@
   f : f32;
 };
 
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u : S;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let f = u.f;
 }
 )";
   auto* expect = R"(
-[[internal(spirv_block)]]
+@internal(spirv_block)
 struct S {
   f : f32;
 }
 
-[[group(0), binding(0)]] var<uniform> u : S;
+@group(0) @binding(0) var<uniform> u : S;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let f = u.f;
 }
@@ -207,10 +207,10 @@
   i : Inner;
 };
 
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u : Outer;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let f = u.i.f;
 }
@@ -220,14 +220,14 @@
   f : f32;
 }
 
-[[internal(spirv_block)]]
+@internal(spirv_block)
 struct Outer {
   i : Inner;
 }
 
-[[group(0), binding(0)]] var<uniform> u : Outer;
+@group(0) @binding(0) var<uniform> u : Outer;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let f = u.i.f;
 }
@@ -248,13 +248,13 @@
   i : Inner;
 };
 
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u0 : Outer;
 
-[[group(0), binding(1)]]
+@group(0) @binding(1)
 var<uniform> u1 : Inner;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let f0 = u0.i.f;
   let f1 = u1.f;
@@ -265,21 +265,21 @@
   f : f32;
 }
 
-[[internal(spirv_block)]]
+@internal(spirv_block)
 struct Outer {
   i : Inner;
 }
 
-[[group(0), binding(0)]] var<uniform> u0 : Outer;
+@group(0) @binding(0) var<uniform> u0 : Outer;
 
-[[internal(spirv_block)]]
+@internal(spirv_block)
 struct u1_block {
   inner : Inner;
 }
 
-[[group(0), binding(1)]] var<uniform> u1 : u1_block;
+@group(0) @binding(1) var<uniform> u1 : u1_block;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let f0 = u0.i.f;
   let f1 = u1.inner.f;
@@ -303,10 +303,10 @@
 
 var<private> p : Outer;
 
-[[group(0), binding(1)]]
+@group(0) @binding(1)
 var<uniform> u : Inner;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let f0 = p.i.f;
   let f1 = u.f;
@@ -323,14 +323,14 @@
 
 var<private> p : Outer;
 
-[[internal(spirv_block)]]
+@internal(spirv_block)
 struct u_block {
   inner : Inner;
 }
 
-[[group(0), binding(1)]] var<uniform> u : u_block;
+@group(0) @binding(1) var<uniform> u : u_block;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let f0 = p.i.f;
   let f1 = u.inner.f;
@@ -352,16 +352,16 @@
   i : Inner;
 };
 
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u0 : S;
 
-[[group(0), binding(1)]]
+@group(0) @binding(1)
 var<uniform> u1 : Inner;
 
-[[group(0), binding(2)]]
+@group(0) @binding(2)
 var<uniform> u2 : Inner;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let f0 = u0.i.f;
   let f1 = u1.f;
@@ -373,23 +373,23 @@
   f : f32;
 }
 
-[[internal(spirv_block)]]
+@internal(spirv_block)
 struct S {
   i : Inner;
 }
 
-[[group(0), binding(0)]] var<uniform> u0 : S;
+@group(0) @binding(0) var<uniform> u0 : S;
 
-[[internal(spirv_block)]]
+@internal(spirv_block)
 struct u1_block {
   inner : Inner;
 }
 
-[[group(0), binding(1)]] var<uniform> u1 : u1_block;
+@group(0) @binding(1) var<uniform> u1 : u1_block;
 
-[[group(0), binding(2)]] var<uniform> u2 : u1_block;
+@group(0) @binding(2) var<uniform> u2 : u1_block;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let f0 = u0.i.f;
   let f1 = u1.inner.f;
@@ -408,10 +408,10 @@
   f : f32;
 };
 
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u : S;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let f = u.f;
   let a = array<S, 4>();
@@ -422,14 +422,14 @@
   f : f32;
 }
 
-[[internal(spirv_block)]]
+@internal(spirv_block)
 struct u_block {
   inner : S;
 }
 
-[[group(0), binding(0)]] var<uniform> u : u_block;
+@group(0) @binding(0) var<uniform> u : u_block;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let f = u.inner.f;
   let a = array<S, 4>();
@@ -447,13 +447,13 @@
   f : f32;
 };
 
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u0 : S;
 
-[[group(0), binding(1)]]
+@group(0) @binding(1)
 var<uniform> u1 : S;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let f0 = u0.f;
   let f1 = u1.f;
@@ -465,16 +465,16 @@
   f : f32;
 }
 
-[[internal(spirv_block)]]
+@internal(spirv_block)
 struct u0_block {
   inner : S;
 }
 
-[[group(0), binding(0)]] var<uniform> u0 : u0_block;
+@group(0) @binding(0) var<uniform> u0 : u0_block;
 
-[[group(0), binding(1)]] var<uniform> u1 : u0_block;
+@group(0) @binding(1) var<uniform> u1 : u0_block;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let f0 = u0.inner.f;
   let f1 = u1.inner.f;
@@ -501,13 +501,13 @@
 
 type MyOuter = Outer;
 
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u0 : MyOuter;
 
-[[group(0), binding(1)]]
+@group(0) @binding(1)
 var<uniform> u1 : MyInner;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let f0 = u0.i.f;
   let f1 = u1.f;
@@ -520,23 +520,23 @@
 
 type MyInner = Inner;
 
-[[internal(spirv_block)]]
+@internal(spirv_block)
 struct Outer {
   i : MyInner;
 }
 
 type MyOuter = Outer;
 
-[[group(0), binding(0)]] var<uniform> u0 : MyOuter;
+@group(0) @binding(0) var<uniform> u0 : MyOuter;
 
-[[internal(spirv_block)]]
+@internal(spirv_block)
 struct u1_block {
   inner : Inner;
 }
 
-[[group(0), binding(1)]] var<uniform> u1 : u1_block;
+@group(0) @binding(1) var<uniform> u1 : u1_block;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let f0 = u0.i.f;
   let f1 = u1.inner.f;
diff --git a/src/transform/array_length_from_uniform.h b/src/transform/array_length_from_uniform.h
index 6ab1598..bd7a461 100644
--- a/src/transform/array_length_from_uniform.h
+++ b/src/transform/array_length_from_uniform.h
@@ -38,7 +38,7 @@
 ///  buffer_size : array<u32, 8>;
 /// };
 ///
-/// [[group(0), binding(30)]]
+/// @group(0) @binding(30)
 /// var<uniform> buffer_size_ubo : buffer_size_struct;
 /// ```
 /// The binding group and number used for this uniform buffer is provided via
diff --git a/src/transform/array_length_from_uniform_test.cc b/src/transform/array_length_from_uniform_test.cc
index b9139a9..944fc6a 100644
--- a/src/transform/array_length_from_uniform_test.cc
+++ b/src/transform/array_length_from_uniform_test.cc
@@ -52,9 +52,9 @@
 
 TEST_F(ArrayLengthFromUniformTest, Basic) {
   auto* src = R"(
-[[group(0), binding(0)]] var<storage, read> sb : array<i32>;
+@group(0) @binding(0) var<storage, read> sb : array<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var len : u32 = arrayLength(&sb);
 }
@@ -65,11 +65,11 @@
   buffer_size : array<vec4<u32>, 1u>;
 }
 
-[[group(0), binding(30)]] var<uniform> tint_symbol_1 : tint_symbol;
+@group(0) @binding(30) var<uniform> tint_symbol_1 : tint_symbol;
 
-[[group(0), binding(0)]] var<storage, read> sb : array<i32>;
+@group(0) @binding(0) var<storage, read> sb : array<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var len : u32 = (tint_symbol_1.buffer_size[0u][0u] / 4u);
 }
@@ -95,9 +95,9 @@
   arr : array<i32>;
 };
 
-[[group(0), binding(0)]] var<storage, read> sb : SB;
+@group(0) @binding(0) var<storage, read> sb : SB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var len : u32 = arrayLength(&sb.arr);
 }
@@ -108,16 +108,16 @@
   buffer_size : array<vec4<u32>, 1u>;
 }
 
-[[group(0), binding(30)]] var<uniform> tint_symbol_1 : tint_symbol;
+@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;
+@group(0) @binding(0) var<storage, read> sb : SB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var len : u32 = ((tint_symbol_1.buffer_size[0u][0u] - 4u) / 4u);
 }
@@ -138,9 +138,9 @@
 
 TEST_F(ArrayLengthFromUniformTest, WithStride) {
   auto* src = R"(
-[[group(0), binding(0)]] var<storage, read> sb : [[stride(64)]] array<i32>;
+@group(0) @binding(0) var<storage, read> sb : @stride(64) array<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var len : u32 = arrayLength(&sb);
 }
@@ -151,11 +151,11 @@
   buffer_size : array<vec4<u32>, 1u>;
 }
 
-[[group(0), binding(30)]] var<uniform> tint_symbol_1 : tint_symbol;
+@group(0) @binding(30) var<uniform> tint_symbol_1 : tint_symbol;
 
-[[group(0), binding(0)]] var<storage, read> sb : [[stride(64)]] array<i32>;
+@group(0) @binding(0) var<storage, read> sb : @stride(64) array<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var len : u32 = (tint_symbol_1.buffer_size[0u][0u] / 64u);
 }
@@ -179,12 +179,12 @@
 struct SB {
   x : i32;
   y : f32;
-  arr : [[stride(64)]] array<i32>;
+  arr : @stride(64) array<i32>;
 };
 
-[[group(0), binding(0)]] var<storage, read> sb : SB;
+@group(0) @binding(0) var<storage, read> sb : SB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var len : u32 = arrayLength(&sb.arr);
 }
@@ -195,17 +195,17 @@
   buffer_size : array<vec4<u32>, 1u>;
 }
 
-[[group(0), binding(30)]] var<uniform> tint_symbol_1 : tint_symbol;
+@group(0) @binding(30) var<uniform> tint_symbol_1 : tint_symbol;
 
 struct SB {
   x : i32;
   y : f32;
-  arr : [[stride(64)]] array<i32>;
+  arr : @stride(64) array<i32>;
 }
 
-[[group(0), binding(0)]] var<storage, read> sb : SB;
+@group(0) @binding(0) var<storage, read> sb : SB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var len : u32 = ((tint_symbol_1.buffer_size[0u][0u] - 8u) / 64u);
 }
@@ -239,13 +239,13 @@
   arr4 : array<vec4<f32>>;
 };
 
-[[group(0), binding(2)]] var<storage, read> sb1 : SB1;
-[[group(1), binding(2)]] var<storage, read> sb2 : SB2;
-[[group(2), binding(2)]] var<storage, read> sb3 : array<vec4<f32>>;
-[[group(3), binding(2)]] var<storage, read> sb4 : SB4;
-[[group(4), binding(2)]] var<storage, read> sb5 : array<vec4<f32>>;
+@group(0) @binding(2) var<storage, read> sb1 : SB1;
+@group(1) @binding(2) var<storage, read> sb2 : SB2;
+@group(2) @binding(2) var<storage, read> sb3 : array<vec4<f32>>;
+@group(3) @binding(2) var<storage, read> sb4 : SB4;
+@group(4) @binding(2) var<storage, read> sb5 : array<vec4<f32>>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var len1 : u32 = arrayLength(&(sb1.arr1));
   var len2 : u32 = arrayLength(&(sb2.arr2));
@@ -261,7 +261,7 @@
   buffer_size : array<vec4<u32>, 2u>;
 }
 
-[[group(0), binding(30)]] var<uniform> tint_symbol_1 : tint_symbol;
+@group(0) @binding(30) var<uniform> tint_symbol_1 : tint_symbol;
 
 struct SB1 {
   x : i32;
@@ -278,17 +278,17 @@
   arr4 : array<vec4<f32>>;
 }
 
-[[group(0), binding(2)]] var<storage, read> sb1 : SB1;
+@group(0) @binding(2) var<storage, read> sb1 : SB1;
 
-[[group(1), binding(2)]] var<storage, read> sb2 : SB2;
+@group(1) @binding(2) var<storage, read> sb2 : SB2;
 
-[[group(2), binding(2)]] var<storage, read> sb3 : array<vec4<f32>>;
+@group(2) @binding(2) var<storage, read> sb3 : array<vec4<f32>>;
 
-[[group(3), binding(2)]] var<storage, read> sb4 : SB4;
+@group(3) @binding(2) var<storage, read> sb4 : SB4;
 
-[[group(4), binding(2)]] var<storage, read> sb5 : array<vec4<f32>>;
+@group(4) @binding(2) var<storage, read> sb5 : array<vec4<f32>>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var len1 : u32 = ((tint_symbol_1.buffer_size[0u][0u] - 4u) / 4u);
   var len2 : u32 = ((tint_symbol_1.buffer_size[0u][1u] - 16u) / 16u);
@@ -331,13 +331,13 @@
   arr4 : array<vec4<f32>>;
 };
 
-[[group(0), binding(2)]] var<storage, read> sb1 : SB1;
-[[group(1), binding(2)]] var<storage, read> sb2 : SB2;
-[[group(2), binding(2)]] var<storage, read> sb3 : array<vec4<f32>>;
-[[group(3), binding(2)]] var<storage, read> sb4 : SB4;
-[[group(4), binding(2)]] var<storage, read> sb5 : array<vec4<f32>>;
+@group(0) @binding(2) var<storage, read> sb1 : SB1;
+@group(1) @binding(2) var<storage, read> sb2 : SB2;
+@group(2) @binding(2) var<storage, read> sb3 : array<vec4<f32>>;
+@group(3) @binding(2) var<storage, read> sb4 : SB4;
+@group(4) @binding(2) var<storage, read> sb5 : array<vec4<f32>>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var len1 : u32 = arrayLength(&(sb1.arr1));
   var len3 : u32 = arrayLength(&sb3);
@@ -350,7 +350,7 @@
   buffer_size : array<vec4<u32>, 1u>;
 }
 
-[[group(0), binding(30)]] var<uniform> tint_symbol_1 : tint_symbol;
+@group(0) @binding(30) var<uniform> tint_symbol_1 : tint_symbol;
 
 struct SB1 {
   x : i32;
@@ -367,17 +367,17 @@
   arr4 : array<vec4<f32>>;
 }
 
-[[group(0), binding(2)]] var<storage, read> sb1 : SB1;
+@group(0) @binding(2) var<storage, read> sb1 : SB1;
 
-[[group(1), binding(2)]] var<storage, read> sb2 : SB2;
+@group(1) @binding(2) var<storage, read> sb2 : SB2;
 
-[[group(2), binding(2)]] var<storage, read> sb3 : array<vec4<f32>>;
+@group(2) @binding(2) var<storage, read> sb3 : array<vec4<f32>>;
 
-[[group(3), binding(2)]] var<storage, read> sb4 : SB4;
+@group(3) @binding(2) var<storage, read> sb4 : SB4;
 
-[[group(4), binding(2)]] var<storage, read> sb5 : array<vec4<f32>>;
+@group(4) @binding(2) var<storage, read> sb5 : array<vec4<f32>>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var len1 : u32 = ((tint_symbol_1.buffer_size[0u][0u] - 4u) / 4u);
   var len3 : u32 = (tint_symbol_1.buffer_size[0u][2u] / 16u);
@@ -409,9 +409,9 @@
   arr : array<i32>;
 }
 
-[[group(0), binding(0)]] var<storage, read> sb : SB;
+@group(0) @binding(0) var<storage, read> sb : SB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   ignore(&(sb.arr));
 }
@@ -442,11 +442,11 @@
   arr2 : array<vec4<f32>>;
 };
 
-[[group(0), binding(2)]] var<storage, read> sb1 : SB1;
+@group(0) @binding(2) var<storage, read> sb1 : SB1;
 
-[[group(1), binding(2)]] var<storage, read> sb2 : SB2;
+@group(1) @binding(2) var<storage, read> sb2 : SB2;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var len1 : u32 = arrayLength(&(sb1.arr1));
   var len2 : u32 = arrayLength(&(sb2.arr2));
@@ -459,7 +459,7 @@
   buffer_size : array<vec4<u32>, 1u>;
 }
 
-[[group(0), binding(30)]] var<uniform> tint_symbol_1 : tint_symbol;
+@group(0) @binding(30) var<uniform> tint_symbol_1 : tint_symbol;
 
 struct SB1 {
   x : i32;
@@ -471,11 +471,11 @@
   arr2 : array<vec4<f32>>;
 }
 
-[[group(0), binding(2)]] var<storage, read> sb1 : SB1;
+@group(0) @binding(2) var<storage, read> sb1 : SB1;
 
-[[group(1), binding(2)]] var<storage, read> sb2 : SB2;
+@group(1) @binding(2) var<storage, read> sb2 : SB2;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var len1 : u32 = ((tint_symbol_1.buffer_size[0u][0u] - 4u) / 4u);
   var len2 : u32 = arrayLength(&(sb2.arr2));
diff --git a/src/transform/binding_remapper_test.cc b/src/transform/binding_remapper_test.cc
index de85cb0..5827cb2 100644
--- a/src/transform/binding_remapper_test.cc
+++ b/src/transform/binding_remapper_test.cc
@@ -30,11 +30,11 @@
   a : f32;
 }
 
-[[group(2), binding(1)]] var<storage, read> a : S;
+@group(2) @binding(1) var<storage, read> a : S;
 
-[[group(3), binding(2)]] var<storage, read> b : S;
+@group(3) @binding(2) var<storage, read> b : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
 }
 )";
@@ -55,11 +55,11 @@
   a : f32;
 };
 
-[[group(2), binding(1)]] var<storage, read> a : S;
+@group(2) @binding(1) var<storage, read> a : S;
 
-[[group(3), binding(2)]] var<storage, read> b : S;
+@group(3) @binding(2) var<storage, read> b : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
 }
 )";
@@ -69,11 +69,11 @@
   a : f32;
 }
 
-[[group(1), binding(2)]] var<storage, read> a : S;
+@group(1) @binding(2) var<storage, read> a : S;
 
-[[group(3), binding(2)]] var<storage, read> b : S;
+@group(3) @binding(2) var<storage, read> b : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
 }
 )";
@@ -83,7 +83,7 @@
       BindingRemapper::BindingPoints{
           {{2, 1}, {1, 2}},  // Remap
           {{4, 5}, {6, 7}},  // Not found
-                             // Keep [[group(3), binding(2)]] as is
+                             // Keep @group(3) @binding(2) as is
       },
       BindingRemapper::AccessControls{});
   auto got = Run<BindingRemapper>(src, data);
@@ -97,13 +97,13 @@
   a : f32;
 };
 
-[[group(2), binding(1)]] var<storage, read> a : S;
+@group(2) @binding(1) var<storage, read> a : S;
 
-[[group(3), binding(2)]] var<storage, write> b : S;
+@group(3) @binding(2) var<storage, write> b : S;
 
-[[group(4), binding(3)]] var<storage, read> c : S;
+@group(4) @binding(3) var<storage, read> c : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
 }
 )";
@@ -113,13 +113,13 @@
   a : f32;
 }
 
-[[group(2), binding(1)]] var<storage, write> a : S;
+@group(2) @binding(1) var<storage, write> a : S;
 
-[[group(3), binding(2)]] var<storage, write> b : S;
+@group(3) @binding(2) var<storage, write> b : S;
 
-[[group(4), binding(3)]] var<storage, read> c : S;
+@group(4) @binding(3) var<storage, read> c : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
 }
 )";
@@ -129,7 +129,7 @@
       BindingRemapper::BindingPoints{},
       BindingRemapper::AccessControls{
           {{2, 1}, ast::Access::kWrite},  // Modify access control
-          // Keep [[group(3), binding(2)]] as is
+          // Keep @group(3) @binding(2) as is
           {{4, 3}, ast::Access::kRead},  // Add access control
       });
   auto got = Run<BindingRemapper>(src, data);
@@ -151,13 +151,13 @@
 
 type A = S;
 
-[[group(2), binding(1)]] var<storage> a : ReadOnlyS;
+@group(2) @binding(1) var<storage> a : ReadOnlyS;
 
-[[group(3), binding(2)]] var<storage> b : WriteOnlyS;
+@group(3) @binding(2) var<storage> b : WriteOnlyS;
 
-[[group(4), binding(3)]] var<storage> c : A;
+@group(4) @binding(3) var<storage> c : A;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
 }
 )";
@@ -173,13 +173,13 @@
 
 type A = S;
 
-[[group(2), binding(1)]] var<storage, write> a : S;
+@group(2) @binding(1) var<storage, write> a : S;
 
-[[group(3), binding(2)]] var<storage> b : WriteOnlyS;
+@group(3) @binding(2) var<storage> b : WriteOnlyS;
 
-[[group(4), binding(3)]] var<storage, write> c : S;
+@group(4) @binding(3) var<storage, write> c : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
 }
 )";
@@ -189,7 +189,7 @@
       BindingRemapper::BindingPoints{},
       BindingRemapper::AccessControls{
           {{2, 1}, ast::Access::kWrite},  // Modify access control
-          // Keep [[group(3), binding(2)]] as is
+          // Keep @group(3) @binding(2) as is
           {{4, 3}, ast::Access::kRead},  // Add access control
       });
   auto got = Run<BindingRemapper>(src, data);
@@ -203,11 +203,11 @@
   a : f32;
 };
 
-[[group(2), binding(1)]] var<storage, read> a : S;
+@group(2) @binding(1) var<storage, read> a : S;
 
-[[group(3), binding(2)]] var<storage, read> b : S;
+@group(3) @binding(2) var<storage, read> b : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
 }
 )";
@@ -217,11 +217,11 @@
   a : f32;
 }
 
-[[group(4), binding(5)]] var<storage, write> a : S;
+@group(4) @binding(5) var<storage, write> a : S;
 
-[[group(6), binding(7)]] var<storage, write> b : S;
+@group(6) @binding(7) var<storage, write> b : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
 }
 )";
@@ -247,15 +247,15 @@
   i : i32;
 };
 
-[[group(2), binding(1)]] var<storage, read> a : S;
+@group(2) @binding(1) var<storage, read> a : S;
 
-[[group(3), binding(2)]] var<storage, read> b : S;
+@group(3) @binding(2) var<storage, read> b : S;
 
-[[group(4), binding(3)]] var<storage, read> c : S;
+@group(4) @binding(3) var<storage, read> c : S;
 
-[[group(5), binding(4)]] var<storage, read> d : S;
+@group(5) @binding(4) var<storage, read> d : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let x : i32 = (((a.i + b.i) + c.i) + d.i);
 }
@@ -266,15 +266,15 @@
   i : i32;
 }
 
-[[internal(disable_validation__binding_point_collision), group(1), binding(1)]] var<storage, read> a : S;
+@internal(disable_validation__binding_point_collision) @group(1) @binding(1) var<storage, read> a : S;
 
-[[internal(disable_validation__binding_point_collision), group(1), binding(1)]] var<storage, read> b : S;
+@internal(disable_validation__binding_point_collision) @group(1) @binding(1) var<storage, read> b : S;
 
-[[internal(disable_validation__binding_point_collision), group(5), binding(4)]] var<storage, read> c : S;
+@internal(disable_validation__binding_point_collision) @group(5) @binding(4) var<storage, read> c : S;
 
-[[internal(disable_validation__binding_point_collision), group(5), binding(4)]] var<storage, read> d : S;
+@internal(disable_validation__binding_point_collision) @group(5) @binding(4) var<storage, read> d : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let x : i32 = (((a.i + b.i) + c.i) + d.i);
 }
@@ -299,20 +299,20 @@
   i : i32;
 };
 
-[[group(2), binding(1)]] var<storage, read> a : S;
+@group(2) @binding(1) var<storage, read> a : S;
 
-[[group(3), binding(2)]] var<storage, read> b : S;
+@group(3) @binding(2) var<storage, read> b : S;
 
-[[group(4), binding(3)]] var<storage, read> c : S;
+@group(4) @binding(3) var<storage, read> c : S;
 
-[[group(5), binding(4)]] var<storage, read> d : S;
+@group(5) @binding(4) var<storage, read> d : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f1() {
   let x : i32 = (a.i + c.i);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f2() {
   let x : i32 = (b.i + d.i);
 }
@@ -323,20 +323,20 @@
   i : i32;
 }
 
-[[group(1), binding(1)]] var<storage, read> a : S;
+@group(1) @binding(1) var<storage, read> a : S;
 
-[[group(1), binding(1)]] var<storage, read> b : S;
+@group(1) @binding(1) var<storage, read> b : S;
 
-[[group(5), binding(4)]] var<storage, read> c : S;
+@group(5) @binding(4) var<storage, read> c : S;
 
-[[group(5), binding(4)]] var<storage, read> d : S;
+@group(5) @binding(4) var<storage, read> d : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f1() {
   let x : i32 = (a.i + c.i);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f2() {
   let x : i32 = (b.i + d.i);
 }
@@ -361,10 +361,10 @@
   a : f32;
 };
 
-[[group(2), binding(1)]] var<storage, read> a : S;
-[[group(3), binding(2)]] var<storage, read> b : S;
+@group(2) @binding(1) var<storage, read> a : S;
+@group(3) @binding(2) var<storage, read> b : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {}
 )";
 
diff --git a/src/transform/calculate_array_length_test.cc b/src/transform/calculate_array_length_test.cc
index 83e0ac7..88643ae 100644
--- a/src/transform/calculate_array_length_test.cc
+++ b/src/transform/calculate_array_length_test.cc
@@ -38,21 +38,21 @@
 
 TEST_F(CalculateArrayLengthTest, Basic) {
   auto* src = R"(
-[[group(0), binding(0)]] var<storage, read> sb : array<i32>;
+@group(0) @binding(0) var<storage, read> sb : array<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var len : u32 = arrayLength(&sb);
 }
 )";
 
   auto* expect = R"(
-[[internal(intrinsic_buffer_size)]]
-fn tint_symbol([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : array<i32>, result : ptr<function, u32>)
+@internal(intrinsic_buffer_size)
+fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : array<i32>, result : ptr<function, u32>)
 
-[[group(0), binding(0)]] var<storage, read> sb : array<i32>;
+@group(0) @binding(0) var<storage, read> sb : array<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var tint_symbol_1 : u32 = 0u;
   tint_symbol(sb, &(tint_symbol_1));
@@ -73,9 +73,9 @@
   arr : array<i32>;
 };
 
-[[group(0), binding(0)]] var<storage, read> sb : SB;
+@group(0) @binding(0) var<storage, read> sb : SB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var len : u32 = arrayLength(&sb.arr);
 }
@@ -87,12 +87,12 @@
   arr : array<i32>;
 }
 
-[[internal(intrinsic_buffer_size)]]
-fn tint_symbol([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, result : ptr<function, u32>)
+@internal(intrinsic_buffer_size)
+fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, result : ptr<function, u32>)
 
-[[group(0), binding(0)]] var<storage, read> sb : SB;
+@group(0) @binding(0) var<storage, read> sb : SB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var tint_symbol_1 : u32 = 0u;
   tint_symbol(sb, &(tint_symbol_1));
@@ -108,9 +108,9 @@
 
 TEST_F(CalculateArrayLengthTest, InSameBlock) {
   auto* src = R"(
-[[group(0), binding(0)]] var<storage, read> sb : array<i32>;;
+@group(0) @binding(0) var<storage, read> sb : array<i32>;;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var a : u32 = arrayLength(&sb);
   var b : u32 = arrayLength(&sb);
@@ -119,12 +119,12 @@
 )";
 
   auto* expect = R"(
-[[internal(intrinsic_buffer_size)]]
-fn tint_symbol([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : array<i32>, result : ptr<function, u32>)
+@internal(intrinsic_buffer_size)
+fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : array<i32>, result : ptr<function, u32>)
 
-[[group(0), binding(0)]] var<storage, read> sb : array<i32>;
+@group(0) @binding(0) var<storage, read> sb : array<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var tint_symbol_1 : u32 = 0u;
   tint_symbol(sb, &(tint_symbol_1));
@@ -147,9 +147,9 @@
   arr : array<i32>;
 };
 
-[[group(0), binding(0)]] var<storage, read> sb : SB;
+@group(0) @binding(0) var<storage, read> sb : SB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var a : u32 = arrayLength(&sb.arr);
   var b : u32 = arrayLength(&sb.arr);
@@ -163,12 +163,12 @@
   arr : array<i32>;
 }
 
-[[internal(intrinsic_buffer_size)]]
-fn tint_symbol([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, result : ptr<function, u32>)
+@internal(intrinsic_buffer_size)
+fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, result : ptr<function, u32>)
 
-[[group(0), binding(0)]] var<storage, read> sb : SB;
+@group(0) @binding(0) var<storage, read> sb : SB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var tint_symbol_1 : u32 = 0u;
   tint_symbol(sb, &(tint_symbol_1));
@@ -186,21 +186,21 @@
 
 TEST_F(CalculateArrayLengthTest, WithStride) {
   auto* src = R"(
-[[group(0), binding(0)]] var<storage, read> sb : [[stride(64)]] array<i32>;
+@group(0) @binding(0) var<storage, read> sb : @stride(64) array<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var len : u32 = arrayLength(&sb);
 }
 )";
 
   auto* expect = R"(
-[[internal(intrinsic_buffer_size)]]
-fn tint_symbol([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : [[stride(64)]] array<i32>, result : ptr<function, u32>)
+@internal(intrinsic_buffer_size)
+fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : @stride(64) array<i32>, result : ptr<function, u32>)
 
-[[group(0), binding(0)]] var<storage, read> sb : [[stride(64)]] array<i32>;
+@group(0) @binding(0) var<storage, read> sb : @stride(64) array<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var tint_symbol_1 : u32 = 0u;
   tint_symbol(sb, &(tint_symbol_1));
@@ -219,12 +219,12 @@
 struct SB {
   x : i32;
   y : f32;
-  arr : [[stride(64)]] array<i32>;
+  arr : @stride(64) array<i32>;
 };
 
-[[group(0), binding(0)]] var<storage, read> sb : SB;
+@group(0) @binding(0) var<storage, read> sb : SB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var len : u32 = arrayLength(&sb.arr);
 }
@@ -234,15 +234,15 @@
 struct SB {
   x : i32;
   y : f32;
-  arr : [[stride(64)]] array<i32>;
+  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>)
+@internal(intrinsic_buffer_size)
+fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, result : ptr<function, u32>)
 
-[[group(0), binding(0)]] var<storage, read> sb : SB;
+@group(0) @binding(0) var<storage, read> sb : SB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var tint_symbol_1 : u32 = 0u;
   tint_symbol(sb, &(tint_symbol_1));
@@ -263,9 +263,9 @@
   arr : array<i32>;
 };
 
-[[group(0), binding(0)]] var<storage, read> sb : SB;
+@group(0) @binding(0) var<storage, read> sb : SB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   if (true) {
     var len : u32 = arrayLength(&sb.arr);
@@ -283,12 +283,12 @@
   arr : array<i32>;
 }
 
-[[internal(intrinsic_buffer_size)]]
-fn tint_symbol([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, result : ptr<function, u32>)
+@internal(intrinsic_buffer_size)
+fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, result : ptr<function, u32>)
 
-[[group(0), binding(0)]] var<storage, read> sb : SB;
+@group(0) @binding(0) var<storage, read> sb : SB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   if (true) {
     var tint_symbol_1 : u32 = 0u;
@@ -323,13 +323,13 @@
   arr2 : array<vec4<f32>>;
 };
 
-[[group(0), binding(0)]] var<storage, read> sb1 : SB1;
+@group(0) @binding(0) var<storage, read> sb1 : SB1;
 
-[[group(0), binding(1)]] var<storage, read> sb2 : SB2;
+@group(0) @binding(1) var<storage, read> sb2 : SB2;
 
-[[group(0), binding(2)]] var<storage, read> sb3 : array<i32>;
+@group(0) @binding(2) var<storage, read> sb3 : array<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var len1 : u32 = arrayLength(&(sb1.arr1));
   var len2 : u32 = arrayLength(&(sb2.arr2));
@@ -339,32 +339,32 @@
 )";
 
   auto* expect = R"(
-[[internal(intrinsic_buffer_size)]]
-fn tint_symbol_6([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : array<i32>, result : ptr<function, u32>)
+@internal(intrinsic_buffer_size)
+fn tint_symbol_6(@internal(disable_validation__ignore_constructible_function_parameter) buffer : array<i32>, result : ptr<function, u32>)
 
 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>)
+@internal(intrinsic_buffer_size)
+fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB1, result : ptr<function, u32>)
 
 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>)
+@internal(intrinsic_buffer_size)
+fn tint_symbol_3(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB2, result : ptr<function, u32>)
 
-[[group(0), binding(0)]] var<storage, read> sb1 : SB1;
+@group(0) @binding(0) var<storage, read> sb1 : SB1;
 
-[[group(0), binding(1)]] var<storage, read> sb2 : SB2;
+@group(0) @binding(1) var<storage, read> sb2 : SB2;
 
-[[group(0), binding(2)]] var<storage, read> sb3 : array<i32>;
+@group(0) @binding(2) var<storage, read> sb3 : array<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var tint_symbol_1 : u32 = 0u;
   tint_symbol(sb1, &(tint_symbol_1));
@@ -394,10 +394,10 @@
   arr : array<i32>;
 };
 
-[[group(0), binding(0)]] var<storage, read> a : SB;
-[[group(0), binding(1)]] var<storage, read> b : SB;
+@group(0) @binding(0) var<storage, read> a : SB;
+@group(0) @binding(1) var<storage, read> b : SB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = &a;
   var a : u32 = arrayLength(&a.arr);
@@ -414,14 +414,14 @@
   arr : array<i32>;
 }
 
-[[internal(intrinsic_buffer_size)]]
-fn tint_symbol([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, result : ptr<function, u32>)
+@internal(intrinsic_buffer_size)
+fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, result : ptr<function, u32>)
 
-[[group(0), binding(0)]] var<storage, read> a : SB;
+@group(0) @binding(0) var<storage, read> a : SB;
 
-[[group(0), binding(1)]] var<storage, read> b : SB;
+@group(0) @binding(1) var<storage, read> b : SB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var tint_symbol_1 : u32 = 0u;
   tint_symbol(a, &(tint_symbol_1));
diff --git a/src/transform/canonicalize_entry_point_io.h b/src/transform/canonicalize_entry_point_io.h
index baaa65a..0bf16ba 100644
--- a/src/transform/canonicalize_entry_point_io.h
+++ b/src/transform/canonicalize_entry_point_io.h
@@ -31,13 +31,13 @@
 /// Before:
 /// ```
 /// struct Locations{
-///   [[location(1)]] loc1 : f32;
-///   [[location(2)]] loc2 : vec4<u32>;
+///   @location(1) loc1 : f32;
+///   @location(2) loc2 : vec4<u32>;
 /// };
 ///
-/// [[stage(fragment)]]
-/// fn frag_main([[builtin(position)]] coord : vec4<f32>,
-///              locations : Locations) -> [[location(0)]] f32 {
+/// @stage(fragment)
+/// fn frag_main(@builtin(position) coord : vec4<f32>,
+///              locations : Locations) -> @location(0) f32 {
 ///   if (coord.w > 1.0) {
 ///     return 0.0;
 ///   }
@@ -54,13 +54,13 @@
 /// };
 ///
 /// struct frag_main_in {
-///   [[builtin(position)]] coord : vec4<f32>;
-///   [[location(1)]] loc1 : f32;
-///   [[location(2)]] loc2 : vec4<u32>
+///   @builtin(position) coord : vec4<f32>;
+///   @location(1) loc1 : f32;
+///   @location(2) loc2 : vec4<u32>
 /// };
 ///
 /// struct frag_main_out {
-///   [[location(0)]] loc0 : f32;
+///   @location(0) loc0 : f32;
 /// };
 ///
 /// fn frag_main_inner(coord : vec4<f32>,
@@ -72,7 +72,7 @@
 ///   return col;
 /// }
 ///
-/// [[stage(fragment)]]
+/// @stage(fragment)
 /// fn frag_main(in : frag_main_in) -> frag_main_out {
 ///   let inner_retval = frag_main_inner(in.coord, Locations(in.loc1, in.loc2));
 ///   var wrapper_result : frag_main_out;
diff --git a/src/transform/canonicalize_entry_point_io_test.cc b/src/transform/canonicalize_entry_point_io_test.cc
index 3c16ee5..0219ff2 100644
--- a/src/transform/canonicalize_entry_point_io_test.cc
+++ b/src/transform/canonicalize_entry_point_io_test.cc
@@ -51,11 +51,11 @@
   // Test that we do not introduce wrapper functions when there is no shader IO
   // to process.
   auto* src = R"(
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() {
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main() {
 }
 )";
@@ -72,26 +72,26 @@
 
 TEST_F(CanonicalizeEntryPointIOTest, Parameters_Spirv) {
   auto* src = R"(
-[[stage(fragment)]]
-fn frag_main([[location(1)]] loc1 : f32,
-             [[location(2)]] loc2 : vec4<u32>,
-             [[builtin(position)]] coord : vec4<f32>) {
+@stage(fragment)
+fn frag_main(@location(1) loc1 : f32,
+             @location(2) loc2 : vec4<u32>,
+             @builtin(position) coord : vec4<f32>) {
   var col : f32 = (coord.x * loc1);
 }
 )";
 
   auto* expect = R"(
-[[location(1), internal(disable_validation__ignore_storage_class)]] var<in> loc1_1 : f32;
+@location(1) @internal(disable_validation__ignore_storage_class) var<in> loc1_1 : f32;
 
-[[location(2), interpolate(flat), internal(disable_validation__ignore_storage_class)]] var<in> loc2_1 : vec4<u32>;
+@location(2) @interpolate(flat) @internal(disable_validation__ignore_storage_class) var<in> loc2_1 : vec4<u32>;
 
-[[builtin(position), internal(disable_validation__ignore_storage_class)]] var<in> coord_1 : vec4<f32>;
+@builtin(position) @internal(disable_validation__ignore_storage_class) var<in> coord_1 : vec4<f32>;
 
 fn frag_main_inner(loc1 : f32, loc2 : vec4<u32>, coord : vec4<f32>) {
   var col : f32 = (coord.x * loc1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() {
   frag_main_inner(loc1_1, loc2_1, coord_1);
 }
@@ -107,19 +107,19 @@
 
 TEST_F(CanonicalizeEntryPointIOTest, Parameters_Msl) {
   auto* src = R"(
-[[stage(fragment)]]
-fn frag_main([[location(1)]] loc1 : f32,
-             [[location(2)]] loc2 : vec4<u32>,
-             [[builtin(position)]] coord : vec4<f32>) {
+@stage(fragment)
+fn frag_main(@location(1) loc1 : f32,
+             @location(2) loc2 : vec4<u32>,
+             @builtin(position) coord : vec4<f32>) {
   var col : f32 = (coord.x * loc1);
 }
 )";
 
   auto* expect = R"(
 struct tint_symbol_1 {
-  [[location(1)]]
+  @location(1)
   loc1 : f32;
-  [[location(2)]]
+  @location(2)
   loc2 : vec4<u32>;
 }
 
@@ -127,8 +127,8 @@
   var col : f32 = (coord.x * loc1);
 }
 
-[[stage(fragment)]]
-fn frag_main([[builtin(position)]] coord : vec4<f32>, tint_symbol : tint_symbol_1) {
+@stage(fragment)
+fn frag_main(@builtin(position) coord : vec4<f32>, tint_symbol : tint_symbol_1) {
   frag_main_inner(tint_symbol.loc1, tint_symbol.loc2, coord);
 }
 )";
@@ -143,21 +143,21 @@
 
 TEST_F(CanonicalizeEntryPointIOTest, Parameters_Hlsl) {
   auto* src = R"(
-[[stage(fragment)]]
-fn frag_main([[location(1)]] loc1 : f32,
-             [[location(2)]] loc2 : vec4<u32>,
-             [[builtin(position)]] coord : vec4<f32>) {
+@stage(fragment)
+fn frag_main(@location(1) loc1 : f32,
+             @location(2) loc2 : vec4<u32>,
+             @builtin(position) coord : vec4<f32>) {
   var col : f32 = (coord.x * loc1);
 }
 )";
 
   auto* expect = R"(
 struct tint_symbol_1 {
-  [[location(1)]]
+  @location(1)
   loc1 : f32;
-  [[location(2)]]
+  @location(2)
   loc2 : vec4<u32>;
-  [[builtin(position)]]
+  @builtin(position)
   coord : vec4<f32>;
 }
 
@@ -165,7 +165,7 @@
   var col : f32 = (coord.x * loc1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main(tint_symbol : tint_symbol_1) {
   frag_main_inner(tint_symbol.loc1, tint_symbol.loc2, tint_symbol.coord);
 }
@@ -183,8 +183,8 @@
   auto* src = R"(
 type myf32 = f32;
 
-[[stage(fragment)]]
-fn frag_main([[location(1)]] loc1 : myf32) {
+@stage(fragment)
+fn frag_main(@location(1) loc1 : myf32) {
   var x : myf32 = loc1;
 }
 )";
@@ -193,7 +193,7 @@
 type myf32 = f32;
 
 struct tint_symbol_1 {
-  [[location(1)]]
+  @location(1)
   loc1 : f32;
 }
 
@@ -201,7 +201,7 @@
   var x : myf32 = loc1;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main(tint_symbol : tint_symbol_1) {
   frag_main_inner(tint_symbol.loc1);
 }
@@ -218,15 +218,15 @@
 TEST_F(CanonicalizeEntryPointIOTest, StructParameters_Spirv) {
   auto* src = R"(
 struct FragBuiltins {
-  [[builtin(position)]] coord : vec4<f32>;
+  @builtin(position) coord : vec4<f32>;
 };
 struct FragLocations {
-  [[location(1)]] loc1 : f32;
-  [[location(2)]] loc2 : vec4<u32>;
+  @location(1) loc1 : f32;
+  @location(2) loc2 : vec4<u32>;
 };
 
-[[stage(fragment)]]
-fn frag_main([[location(0)]] loc0 : f32,
+@stage(fragment)
+fn frag_main(@location(0) loc0 : f32,
              locations : FragLocations,
              builtins : FragBuiltins) {
   var col : f32 = ((builtins.coord.x * locations.loc1) + loc0);
@@ -234,13 +234,13 @@
 )";
 
   auto* expect = R"(
-[[location(0), internal(disable_validation__ignore_storage_class)]] var<in> loc0_1 : f32;
+@location(0) @internal(disable_validation__ignore_storage_class) var<in> loc0_1 : f32;
 
-[[location(1), internal(disable_validation__ignore_storage_class)]] var<in> loc1_1 : f32;
+@location(1) @internal(disable_validation__ignore_storage_class) var<in> loc1_1 : f32;
 
-[[location(2), interpolate(flat), internal(disable_validation__ignore_storage_class)]] var<in> loc2_1 : vec4<u32>;
+@location(2) @interpolate(flat) @internal(disable_validation__ignore_storage_class) var<in> loc2_1 : vec4<u32>;
 
-[[builtin(position), internal(disable_validation__ignore_storage_class)]] var<in> coord_1 : vec4<f32>;
+@builtin(position) @internal(disable_validation__ignore_storage_class) var<in> coord_1 : vec4<f32>;
 
 struct FragBuiltins {
   coord : vec4<f32>;
@@ -255,7 +255,7 @@
   var col : f32 = ((builtins.coord.x * locations.loc1) + loc0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() {
   frag_main_inner(loc0_1, FragLocations(loc1_1, loc2_1), FragBuiltins(coord_1));
 }
@@ -272,15 +272,15 @@
 TEST_F(CanonicalizeEntryPointIOTest, StructParameters_kMsl) {
   auto* src = R"(
 struct FragBuiltins {
-  [[builtin(position)]] coord : vec4<f32>;
+  @builtin(position) coord : vec4<f32>;
 };
 struct FragLocations {
-  [[location(1)]] loc1 : f32;
-  [[location(2)]] loc2 : vec4<u32>;
+  @location(1) loc1 : f32;
+  @location(2) loc2 : vec4<u32>;
 };
 
-[[stage(fragment)]]
-fn frag_main([[location(0)]] loc0 : f32,
+@stage(fragment)
+fn frag_main(@location(0) loc0 : f32,
              locations : FragLocations,
              builtins : FragBuiltins) {
   var col : f32 = ((builtins.coord.x * locations.loc1) + loc0);
@@ -298,11 +298,11 @@
 }
 
 struct tint_symbol_1 {
-  [[location(0)]]
+  @location(0)
   loc0 : f32;
-  [[location(1)]]
+  @location(1)
   loc1 : f32;
-  [[location(2)]]
+  @location(2)
   loc2 : vec4<u32>;
 }
 
@@ -310,8 +310,8 @@
   var col : f32 = ((builtins.coord.x * locations.loc1) + loc0);
 }
 
-[[stage(fragment)]]
-fn frag_main([[builtin(position)]] coord : vec4<f32>, tint_symbol : tint_symbol_1) {
+@stage(fragment)
+fn frag_main(@builtin(position) coord : vec4<f32>, tint_symbol : tint_symbol_1) {
   frag_main_inner(tint_symbol.loc0, FragLocations(tint_symbol.loc1, tint_symbol.loc2), FragBuiltins(coord));
 }
 )";
@@ -327,15 +327,15 @@
 TEST_F(CanonicalizeEntryPointIOTest, StructParameters_Hlsl) {
   auto* src = R"(
 struct FragBuiltins {
-  [[builtin(position)]] coord : vec4<f32>;
+  @builtin(position) coord : vec4<f32>;
 };
 struct FragLocations {
-  [[location(1)]] loc1 : f32;
-  [[location(2)]] loc2 : vec4<u32>;
+  @location(1) loc1 : f32;
+  @location(2) loc2 : vec4<u32>;
 };
 
-[[stage(fragment)]]
-fn frag_main([[location(0)]] loc0 : f32,
+@stage(fragment)
+fn frag_main(@location(0) loc0 : f32,
              locations : FragLocations,
              builtins : FragBuiltins) {
   var col : f32 = ((builtins.coord.x * locations.loc1) + loc0);
@@ -353,13 +353,13 @@
 }
 
 struct tint_symbol_1 {
-  [[location(0)]]
+  @location(0)
   loc0 : f32;
-  [[location(1)]]
+  @location(1)
   loc1 : f32;
-  [[location(2)]]
+  @location(2)
   loc2 : vec4<u32>;
-  [[builtin(position)]]
+  @builtin(position)
   coord : vec4<f32>;
 }
 
@@ -367,7 +367,7 @@
   var col : f32 = ((builtins.coord.x * locations.loc1) + loc0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main(tint_symbol : tint_symbol_1) {
   frag_main_inner(tint_symbol.loc0, FragLocations(tint_symbol.loc1, tint_symbol.loc2), FragBuiltins(tint_symbol.coord));
 }
@@ -383,20 +383,20 @@
 
 TEST_F(CanonicalizeEntryPointIOTest, Return_NonStruct_Spirv) {
   auto* src = R"(
-[[stage(fragment)]]
-fn frag_main() -> [[builtin(frag_depth)]] f32 {
+@stage(fragment)
+fn frag_main() -> @builtin(frag_depth) f32 {
   return 1.0;
 }
 )";
 
   auto* expect = R"(
-[[builtin(frag_depth), internal(disable_validation__ignore_storage_class)]] var<out> value : f32;
+@builtin(frag_depth) @internal(disable_validation__ignore_storage_class) var<out> value : f32;
 
 fn frag_main_inner() -> f32 {
   return 1.0;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() {
   let inner_result = frag_main_inner();
   value = inner_result;
@@ -413,15 +413,15 @@
 
 TEST_F(CanonicalizeEntryPointIOTest, Return_NonStruct_Msl) {
   auto* src = R"(
-[[stage(fragment)]]
-fn frag_main() -> [[builtin(frag_depth)]] f32 {
+@stage(fragment)
+fn frag_main() -> @builtin(frag_depth) f32 {
   return 1.0;
 }
 )";
 
   auto* expect = R"(
 struct tint_symbol {
-  [[builtin(frag_depth)]]
+  @builtin(frag_depth)
   value : f32;
 }
 
@@ -429,7 +429,7 @@
   return 1.0;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() -> tint_symbol {
   let inner_result = frag_main_inner();
   var wrapper_result : tint_symbol;
@@ -448,15 +448,15 @@
 
 TEST_F(CanonicalizeEntryPointIOTest, Return_NonStruct_Hlsl) {
   auto* src = R"(
-[[stage(fragment)]]
-fn frag_main() -> [[builtin(frag_depth)]] f32 {
+@stage(fragment)
+fn frag_main() -> @builtin(frag_depth) f32 {
   return 1.0;
 }
 )";
 
   auto* expect = R"(
 struct tint_symbol {
-  [[builtin(frag_depth)]]
+  @builtin(frag_depth)
   value : f32;
 }
 
@@ -464,7 +464,7 @@
   return 1.0;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() -> tint_symbol {
   let inner_result = frag_main_inner();
   var wrapper_result : tint_symbol;
@@ -484,12 +484,12 @@
 TEST_F(CanonicalizeEntryPointIOTest, Return_Struct_Spirv) {
   auto* src = R"(
 struct FragOutput {
-  [[location(0)]] color : vec4<f32>;
-  [[builtin(frag_depth)]] depth : f32;
-  [[builtin(sample_mask)]] mask : u32;
+  @location(0) color : vec4<f32>;
+  @builtin(frag_depth) depth : f32;
+  @builtin(sample_mask) mask : u32;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() -> FragOutput {
   var output : FragOutput;
   output.depth = 1.0;
@@ -500,11 +500,11 @@
 )";
 
   auto* expect = R"(
-[[location(0), internal(disable_validation__ignore_storage_class)]] var<out> color_1 : vec4<f32>;
+@location(0) @internal(disable_validation__ignore_storage_class) var<out> color_1 : vec4<f32>;
 
-[[builtin(frag_depth), internal(disable_validation__ignore_storage_class)]] var<out> depth_1 : f32;
+@builtin(frag_depth) @internal(disable_validation__ignore_storage_class) var<out> depth_1 : f32;
 
-[[builtin(sample_mask), internal(disable_validation__ignore_storage_class)]] var<out> mask_1 : array<u32, 1>;
+@builtin(sample_mask) @internal(disable_validation__ignore_storage_class) var<out> mask_1 : array<u32, 1>;
 
 struct FragOutput {
   color : vec4<f32>;
@@ -520,7 +520,7 @@
   return output;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() {
   let inner_result = frag_main_inner();
   color_1 = inner_result.color;
@@ -540,12 +540,12 @@
 TEST_F(CanonicalizeEntryPointIOTest, Return_Struct_Msl) {
   auto* src = R"(
 struct FragOutput {
-  [[location(0)]] color : vec4<f32>;
-  [[builtin(frag_depth)]] depth : f32;
-  [[builtin(sample_mask)]] mask : u32;
+  @location(0) color : vec4<f32>;
+  @builtin(frag_depth) depth : f32;
+  @builtin(sample_mask) mask : u32;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() -> FragOutput {
   var output : FragOutput;
   output.depth = 1.0;
@@ -563,11 +563,11 @@
 }
 
 struct tint_symbol {
-  [[location(0)]]
+  @location(0)
   color : vec4<f32>;
-  [[builtin(frag_depth)]]
+  @builtin(frag_depth)
   depth : f32;
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   mask : u32;
 }
 
@@ -579,7 +579,7 @@
   return output;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() -> tint_symbol {
   let inner_result = frag_main_inner();
   var wrapper_result : tint_symbol;
@@ -601,12 +601,12 @@
 TEST_F(CanonicalizeEntryPointIOTest, Return_Struct_Hlsl) {
   auto* src = R"(
 struct FragOutput {
-  [[location(0)]] color : vec4<f32>;
-  [[builtin(frag_depth)]] depth : f32;
-  [[builtin(sample_mask)]] mask : u32;
+  @location(0) color : vec4<f32>;
+  @builtin(frag_depth) depth : f32;
+  @builtin(sample_mask) mask : u32;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() -> FragOutput {
   var output : FragOutput;
   output.depth = 1.0;
@@ -624,11 +624,11 @@
 }
 
 struct tint_symbol {
-  [[location(0)]]
+  @location(0)
   color : vec4<f32>;
-  [[builtin(frag_depth)]]
+  @builtin(frag_depth)
   depth : f32;
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   mask : u32;
 }
 
@@ -640,7 +640,7 @@
   return output;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() -> tint_symbol {
   let inner_result = frag_main_inner();
   var wrapper_result : tint_symbol;
@@ -663,33 +663,33 @@
        StructParameters_SharedDeviceFunction_Spirv) {
   auto* src = R"(
 struct FragmentInput {
-  [[location(0)]] value : f32;
-  [[location(1)]] mul : f32;
+  @location(0) value : f32;
+  @location(1) mul : f32;
 };
 
 fn foo(x : FragmentInput) -> f32 {
   return x.value * x.mul;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main1(inputs : FragmentInput) {
   var x : f32 = foo(inputs);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main2(inputs : FragmentInput) {
   var x : f32 = foo(inputs);
 }
 )";
 
   auto* expect = R"(
-[[location(0), internal(disable_validation__ignore_storage_class)]] var<in> value_1 : f32;
+@location(0) @internal(disable_validation__ignore_storage_class) var<in> value_1 : f32;
 
-[[location(1), internal(disable_validation__ignore_storage_class)]] var<in> mul_1 : f32;
+@location(1) @internal(disable_validation__ignore_storage_class) var<in> mul_1 : f32;
 
-[[location(0), internal(disable_validation__ignore_storage_class)]] var<in> value_2 : f32;
+@location(0) @internal(disable_validation__ignore_storage_class) var<in> value_2 : f32;
 
-[[location(1), internal(disable_validation__ignore_storage_class)]] var<in> mul_2 : f32;
+@location(1) @internal(disable_validation__ignore_storage_class) var<in> mul_2 : f32;
 
 struct FragmentInput {
   value : f32;
@@ -704,7 +704,7 @@
   var x : f32 = foo(inputs);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main1() {
   frag_main1_inner(FragmentInput(value_1, mul_1));
 }
@@ -713,7 +713,7 @@
   var x : f32 = foo(inputs);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main2() {
   frag_main2_inner(FragmentInput(value_2, mul_2));
 }
@@ -731,20 +731,20 @@
        StructParameters_SharedDeviceFunction_Msl) {
   auto* src = R"(
 struct FragmentInput {
-  [[location(0)]] value : f32;
-  [[location(1)]] mul : f32;
+  @location(0) value : f32;
+  @location(1) mul : f32;
 };
 
 fn foo(x : FragmentInput) -> f32 {
   return x.value * x.mul;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main1(inputs : FragmentInput) {
   var x : f32 = foo(inputs);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main2(inputs : FragmentInput) {
   var x : f32 = foo(inputs);
 }
@@ -761,9 +761,9 @@
 }
 
 struct tint_symbol_1 {
-  [[location(0)]]
+  @location(0)
   value : f32;
-  [[location(1)]]
+  @location(1)
   mul : f32;
 }
 
@@ -771,15 +771,15 @@
   var x : f32 = foo(inputs);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main1(tint_symbol : tint_symbol_1) {
   frag_main1_inner(FragmentInput(tint_symbol.value, tint_symbol.mul));
 }
 
 struct tint_symbol_3 {
-  [[location(0)]]
+  @location(0)
   value : f32;
-  [[location(1)]]
+  @location(1)
   mul : f32;
 }
 
@@ -787,7 +787,7 @@
   var x : f32 = foo(inputs);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main2(tint_symbol_2 : tint_symbol_3) {
   frag_main2_inner(FragmentInput(tint_symbol_2.value, tint_symbol_2.mul));
 }
@@ -805,20 +805,20 @@
        StructParameters_SharedDeviceFunction_Hlsl) {
   auto* src = R"(
 struct FragmentInput {
-  [[location(0)]] value : f32;
-  [[location(1)]] mul : f32;
+  @location(0) value : f32;
+  @location(1) mul : f32;
 };
 
 fn foo(x : FragmentInput) -> f32 {
   return x.value * x.mul;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main1(inputs : FragmentInput) {
   var x : f32 = foo(inputs);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main2(inputs : FragmentInput) {
   var x : f32 = foo(inputs);
 }
@@ -835,9 +835,9 @@
 }
 
 struct tint_symbol_1 {
-  [[location(0)]]
+  @location(0)
   value : f32;
-  [[location(1)]]
+  @location(1)
   mul : f32;
 }
 
@@ -845,15 +845,15 @@
   var x : f32 = foo(inputs);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main1(tint_symbol : tint_symbol_1) {
   frag_main1_inner(FragmentInput(tint_symbol.value, tint_symbol.mul));
 }
 
 struct tint_symbol_3 {
-  [[location(0)]]
+  @location(0)
   value : f32;
-  [[location(1)]]
+  @location(1)
   mul : f32;
 }
 
@@ -861,7 +861,7 @@
   var x : f32 = foo(inputs);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main2(tint_symbol_2 : tint_symbol_3) {
   frag_main2_inner(FragmentInput(tint_symbol_2.value, tint_symbol_2.mul));
 }
@@ -878,8 +878,8 @@
 TEST_F(CanonicalizeEntryPointIOTest, Struct_ModuleScopeVariable) {
   auto* src = R"(
 struct FragmentInput {
-  [[location(0)]] col1 : f32;
-  [[location(1)]] col2 : f32;
+  @location(0) col1 : f32;
+  @location(1) col2 : f32;
 };
 
 var<private> global_inputs : FragmentInput;
@@ -892,7 +892,7 @@
   return global_inputs.col2 * 2.0;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main1(inputs : FragmentInput) {
  global_inputs = inputs;
  var r : f32 = foo();
@@ -917,9 +917,9 @@
 }
 
 struct tint_symbol_1 {
-  [[location(0)]]
+  @location(0)
   col1 : f32;
-  [[location(1)]]
+  @location(1)
   col2 : f32;
 }
 
@@ -929,7 +929,7 @@
   var g : f32 = bar();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main1(tint_symbol : tint_symbol_1) {
   frag_main1_inner(FragmentInput(tint_symbol.col1, tint_symbol.col2));
 }
@@ -948,13 +948,13 @@
 type myf32 = f32;
 
 struct FragmentInput {
-  [[location(0)]] col1 : myf32;
-  [[location(1)]] col2 : myf32;
+  @location(0) col1 : myf32;
+  @location(1) col2 : myf32;
 };
 
 struct FragmentOutput {
-  [[location(0)]] col1 : myf32;
-  [[location(1)]] col2 : myf32;
+  @location(0) col1 : myf32;
+  @location(1) col2 : myf32;
 };
 
 type MyFragmentInput = FragmentInput;
@@ -965,7 +965,7 @@
   return x.col1;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main(inputs : MyFragmentInput) -> MyFragmentOutput {
   var x : myf32 = foo(inputs);
   return MyFragmentOutput(x, inputs.col2);
@@ -994,16 +994,16 @@
 }
 
 struct tint_symbol_1 {
-  [[location(0)]]
+  @location(0)
   col1 : f32;
-  [[location(1)]]
+  @location(1)
   col2 : f32;
 }
 
 struct tint_symbol_2 {
-  [[location(0)]]
+  @location(0)
   col1 : f32;
-  [[location(1)]]
+  @location(1)
   col2 : f32;
 }
 
@@ -1012,7 +1012,7 @@
   return MyFragmentOutput(x, inputs.col2);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main(tint_symbol : tint_symbol_1) -> tint_symbol_2 {
   let inner_result = frag_main_inner(MyFragmentInput(tint_symbol.col1, tint_symbol.col2));
   var wrapper_result : tint_symbol_2;
@@ -1033,25 +1033,25 @@
 TEST_F(CanonicalizeEntryPointIOTest, InterpolateAttributes) {
   auto* src = R"(
 struct VertexOut {
-  [[builtin(position)]] pos : vec4<f32>;
-  [[location(1), interpolate(flat)]] loc1: f32;
-  [[location(2), interpolate(linear, sample)]] loc2 : f32;
-  [[location(3), interpolate(perspective, centroid)]] loc3 : f32;
+  @builtin(position) pos : vec4<f32>;
+  @location(1) @interpolate(flat) loc1: f32;
+  @location(2) @interpolate(linear, sample) loc2 : f32;
+  @location(3) @interpolate(perspective, centroid) loc3 : f32;
 };
 
 struct FragmentIn {
-  [[location(1), interpolate(flat)]] loc1: f32;
-  [[location(2), interpolate(linear, sample)]] loc2 : f32;
+  @location(1) @interpolate(flat) loc1: f32;
+  @location(2) @interpolate(linear, sample) loc2 : f32;
 };
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main() -> VertexOut {
   return VertexOut();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main(inputs : FragmentIn,
-             [[location(3), interpolate(perspective, centroid)]] loc3 : f32) {
+             @location(3) @interpolate(perspective, centroid) loc3 : f32) {
   let x = inputs.loc1 + inputs.loc2 + loc3;
 }
 )";
@@ -1070,13 +1070,13 @@
 }
 
 struct tint_symbol {
-  [[location(1), interpolate(flat)]]
+  @location(1) @interpolate(flat)
   loc1 : f32;
-  [[location(2), interpolate(linear, sample)]]
+  @location(2) @interpolate(linear, sample)
   loc2 : f32;
-  [[location(3), interpolate(perspective, centroid)]]
+  @location(3) @interpolate(perspective, centroid)
   loc3 : f32;
-  [[builtin(position)]]
+  @builtin(position)
   pos : vec4<f32>;
 }
 
@@ -1084,7 +1084,7 @@
   return VertexOut();
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main() -> tint_symbol {
   let inner_result = vert_main_inner();
   var wrapper_result : tint_symbol;
@@ -1096,11 +1096,11 @@
 }
 
 struct tint_symbol_2 {
-  [[location(1), interpolate(flat)]]
+  @location(1) @interpolate(flat)
   loc1 : f32;
-  [[location(2), interpolate(linear, sample)]]
+  @location(2) @interpolate(linear, sample)
   loc2 : f32;
-  [[location(3), interpolate(perspective, centroid)]]
+  @location(3) @interpolate(perspective, centroid)
   loc3 : f32;
 }
 
@@ -1108,7 +1108,7 @@
   let x = ((inputs.loc1 + inputs.loc2) + loc3);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main(tint_symbol_1 : tint_symbol_2) {
   frag_main_inner(FragmentIn(tint_symbol_1.loc1, tint_symbol_1.loc2), tint_symbol_1.loc3);
 }
@@ -1127,33 +1127,33 @@
   // fragment inputs, but not vertex inputs or fragment outputs.
   auto* src = R"(
 struct VertexIn {
-  [[location(0)]] i : i32;
-  [[location(1)]] u : u32;
-  [[location(2)]] vi : vec4<i32>;
-  [[location(3)]] vu : vec4<u32>;
+  @location(0) i : i32;
+  @location(1) u : u32;
+  @location(2) vi : vec4<i32>;
+  @location(3) vu : vec4<u32>;
 };
 
 struct VertexOut {
-  [[location(0)]] i : i32;
-  [[location(1)]] u : u32;
-  [[location(2)]] vi : vec4<i32>;
-  [[location(3)]] vu : vec4<u32>;
-  [[builtin(position)]] pos : vec4<f32>;
+  @location(0) i : i32;
+  @location(1) u : u32;
+  @location(2) vi : vec4<i32>;
+  @location(3) vu : vec4<u32>;
+  @builtin(position) pos : vec4<f32>;
 };
 
 struct FragmentInterface {
-  [[location(0)]] i : i32;
-  [[location(1)]] u : u32;
-  [[location(2)]] vi : vec4<i32>;
-  [[location(3)]] vu : vec4<u32>;
+  @location(0) i : i32;
+  @location(1) u : u32;
+  @location(2) vi : vec4<i32>;
+  @location(3) vu : vec4<u32>;
 };
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main(in : VertexIn) -> VertexOut {
   return VertexOut(in.i, in.u, in.vi, in.vu, vec4<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main(inputs : FragmentInterface) -> FragmentInterface {
   return inputs;
 }
@@ -1161,39 +1161,39 @@
 
   auto* expect =
       R"(
-[[location(0), internal(disable_validation__ignore_storage_class)]] var<in> i_1 : i32;
+@location(0) @internal(disable_validation__ignore_storage_class) var<in> i_1 : i32;
 
-[[location(1), internal(disable_validation__ignore_storage_class)]] var<in> u_1 : u32;
+@location(1) @internal(disable_validation__ignore_storage_class) var<in> u_1 : u32;
 
-[[location(2), internal(disable_validation__ignore_storage_class)]] var<in> vi_1 : vec4<i32>;
+@location(2) @internal(disable_validation__ignore_storage_class) var<in> vi_1 : vec4<i32>;
 
-[[location(3), internal(disable_validation__ignore_storage_class)]] var<in> vu_1 : vec4<u32>;
+@location(3) @internal(disable_validation__ignore_storage_class) var<in> vu_1 : vec4<u32>;
 
-[[location(0), interpolate(flat), internal(disable_validation__ignore_storage_class)]] var<out> i_2 : i32;
+@location(0) @interpolate(flat) @internal(disable_validation__ignore_storage_class) var<out> i_2 : i32;
 
-[[location(1), interpolate(flat), internal(disable_validation__ignore_storage_class)]] var<out> u_2 : u32;
+@location(1) @interpolate(flat) @internal(disable_validation__ignore_storage_class) var<out> u_2 : u32;
 
-[[location(2), interpolate(flat), internal(disable_validation__ignore_storage_class)]] var<out> vi_2 : vec4<i32>;
+@location(2) @interpolate(flat) @internal(disable_validation__ignore_storage_class) var<out> vi_2 : vec4<i32>;
 
-[[location(3), interpolate(flat), internal(disable_validation__ignore_storage_class)]] var<out> vu_2 : vec4<u32>;
+@location(3) @interpolate(flat) @internal(disable_validation__ignore_storage_class) var<out> vu_2 : vec4<u32>;
 
-[[builtin(position), internal(disable_validation__ignore_storage_class)]] var<out> pos_1 : vec4<f32>;
+@builtin(position) @internal(disable_validation__ignore_storage_class) var<out> pos_1 : vec4<f32>;
 
-[[location(0), interpolate(flat), internal(disable_validation__ignore_storage_class)]] var<in> i_3 : i32;
+@location(0) @interpolate(flat) @internal(disable_validation__ignore_storage_class) var<in> i_3 : i32;
 
-[[location(1), interpolate(flat), internal(disable_validation__ignore_storage_class)]] var<in> u_3 : u32;
+@location(1) @interpolate(flat) @internal(disable_validation__ignore_storage_class) var<in> u_3 : u32;
 
-[[location(2), interpolate(flat), internal(disable_validation__ignore_storage_class)]] var<in> vi_3 : vec4<i32>;
+@location(2) @interpolate(flat) @internal(disable_validation__ignore_storage_class) var<in> vi_3 : vec4<i32>;
 
-[[location(3), interpolate(flat), internal(disable_validation__ignore_storage_class)]] var<in> vu_3 : vec4<u32>;
+@location(3) @interpolate(flat) @internal(disable_validation__ignore_storage_class) var<in> vu_3 : vec4<u32>;
 
-[[location(0), internal(disable_validation__ignore_storage_class)]] var<out> i_4 : i32;
+@location(0) @internal(disable_validation__ignore_storage_class) var<out> i_4 : i32;
 
-[[location(1), internal(disable_validation__ignore_storage_class)]] var<out> u_4 : u32;
+@location(1) @internal(disable_validation__ignore_storage_class) var<out> u_4 : u32;
 
-[[location(2), internal(disable_validation__ignore_storage_class)]] var<out> vi_4 : vec4<i32>;
+@location(2) @internal(disable_validation__ignore_storage_class) var<out> vi_4 : vec4<i32>;
 
-[[location(3), internal(disable_validation__ignore_storage_class)]] var<out> vu_4 : vec4<u32>;
+@location(3) @internal(disable_validation__ignore_storage_class) var<out> vu_4 : vec4<u32>;
 
 struct VertexIn {
   i : i32;
@@ -1221,7 +1221,7 @@
   return VertexOut(in.i, in.u, in.vi, in.vu, vec4<f32>());
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main() {
   let inner_result = vert_main_inner(VertexIn(i_1, u_1, vi_1, vu_1));
   i_2 = inner_result.i;
@@ -1235,7 +1235,7 @@
   return inputs;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() {
   let inner_result_1 = frag_main_inner(FragmentInterface(i_3, u_3, vi_3, vu_3));
   i_4 = inner_result_1.i;
@@ -1259,12 +1259,12 @@
   [[builtin(position), invariant]] pos : vec4<f32>;
 };
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main1() -> VertexOut {
   return VertexOut();
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main2() -> [[builtin(position), invariant]] vec4<f32> {
   return vec4<f32>();
 }
@@ -1276,7 +1276,7 @@
 }
 
 struct tint_symbol {
-  [[builtin(position), invariant]]
+  @builtin(position) @invariant
   pos : vec4<f32>;
 }
 
@@ -1284,7 +1284,7 @@
   return VertexOut();
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main1() -> tint_symbol {
   let inner_result = main1_inner();
   var wrapper_result : tint_symbol;
@@ -1293,7 +1293,7 @@
 }
 
 struct tint_symbol_1 {
-  [[builtin(position), invariant]]
+  @builtin(position) @invariant
   value : vec4<f32>;
 }
 
@@ -1301,7 +1301,7 @@
   return vec4<f32>();
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main2() -> tint_symbol_1 {
   let inner_result_1 = main2_inner();
   var wrapper_result_1 : tint_symbol_1;
@@ -1321,16 +1321,16 @@
 TEST_F(CanonicalizeEntryPointIOTest, Struct_LayoutDecorations) {
   auto* src = R"(
 struct FragmentInput {
-  [[size(16), location(1)]] value : f32;
-  [[builtin(position)]] [[align(32)]] coord : vec4<f32>;
-  [[location(0), interpolate(linear, sample)]] [[align(128)]] loc0 : f32;
+  @size(16) @location(1) value : f32;
+  @builtin(position) @align(32) coord : vec4<f32>;
+  @location(0) @interpolate(linear, sample) @align(128) loc0 : f32;
 };
 
 struct FragmentOutput {
-  [[size(16), location(1), interpolate(flat)]] value : f32;
+  @size(16) @location(1) @interpolate(flat) value : f32;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main(inputs : FragmentInput) -> FragmentOutput {
   return FragmentOutput(inputs.coord.x * inputs.value + inputs.loc0);
 }
@@ -1338,30 +1338,30 @@
 
   auto* expect = R"(
 struct FragmentInput {
-  [[size(16)]]
+  @size(16)
   value : f32;
-  [[align(32)]]
+  @align(32)
   coord : vec4<f32>;
-  [[align(128)]]
+  @align(128)
   loc0 : f32;
 }
 
 struct FragmentOutput {
-  [[size(16)]]
+  @size(16)
   value : f32;
 }
 
 struct tint_symbol_1 {
-  [[location(0), interpolate(linear, sample)]]
+  @location(0) @interpolate(linear, sample)
   loc0 : f32;
-  [[location(1)]]
+  @location(1)
   value : f32;
-  [[builtin(position)]]
+  @builtin(position)
   coord : vec4<f32>;
 }
 
 struct tint_symbol_2 {
-  [[location(1), interpolate(flat)]]
+  @location(1) @interpolate(flat)
   value : f32;
 }
 
@@ -1369,7 +1369,7 @@
   return FragmentOutput(((inputs.coord.x * inputs.value) + inputs.loc0));
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main(tint_symbol : tint_symbol_1) -> tint_symbol_2 {
   let inner_result = frag_main_inner(FragmentInput(tint_symbol.value, tint_symbol.coord, tint_symbol.loc0));
   var wrapper_result : tint_symbol_2;
@@ -1389,29 +1389,29 @@
 TEST_F(CanonicalizeEntryPointIOTest, SortedMembers) {
   auto* src = R"(
 struct VertexOutput {
-  [[location(1)]] b : u32;
-  [[builtin(position)]] pos : vec4<f32>;
-  [[location(3)]] d : u32;
-  [[location(0)]] a : f32;
-  [[location(2)]] c : i32;
+  @location(1) b : u32;
+  @builtin(position) pos : vec4<f32>;
+  @location(3) d : u32;
+  @location(0) a : f32;
+  @location(2) c : i32;
 };
 
 struct FragmentInputExtra {
-  [[location(3)]] d : u32;
-  [[builtin(position)]] pos : vec4<f32>;
-  [[location(0)]] a : f32;
+  @location(3) d : u32;
+  @builtin(position) pos : vec4<f32>;
+  @location(0) a : f32;
 };
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main() -> VertexOutput {
   return VertexOutput();
 }
 
-[[stage(fragment)]]
-fn frag_main([[builtin(front_facing)]] ff : bool,
-             [[location(2)]] c : i32,
+@stage(fragment)
+fn frag_main(@builtin(front_facing) ff : bool,
+             @location(2) c : i32,
              inputs : FragmentInputExtra,
-             [[location(1)]] b : u32) {
+             @location(1) b : u32) {
 }
 )";
 
@@ -1431,15 +1431,15 @@
 }
 
 struct tint_symbol {
-  [[location(0)]]
+  @location(0)
   a : f32;
-  [[location(1)]]
+  @location(1)
   b : u32;
-  [[location(2)]]
+  @location(2)
   c : i32;
-  [[location(3)]]
+  @location(3)
   d : u32;
-  [[builtin(position)]]
+  @builtin(position)
   pos : vec4<f32>;
 }
 
@@ -1447,7 +1447,7 @@
   return VertexOutput();
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main() -> tint_symbol {
   let inner_result = vert_main_inner();
   var wrapper_result : tint_symbol;
@@ -1460,24 +1460,24 @@
 }
 
 struct tint_symbol_2 {
-  [[location(0)]]
+  @location(0)
   a : f32;
-  [[location(1)]]
+  @location(1)
   b : u32;
-  [[location(2)]]
+  @location(2)
   c : i32;
-  [[location(3)]]
+  @location(3)
   d : u32;
-  [[builtin(position)]]
+  @builtin(position)
   pos : vec4<f32>;
-  [[builtin(front_facing)]]
+  @builtin(front_facing)
   ff : bool;
 }
 
 fn frag_main_inner(ff : bool, c : i32, inputs : FragmentInputExtra, b : u32) {
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main(tint_symbol_1 : tint_symbol_2) {
   frag_main_inner(tint_symbol_1.ff, tint_symbol_1.c, FragmentInputExtra(tint_symbol_1.d, tint_symbol_1.pos, tint_symbol_1.a), tint_symbol_1.b);
 }
@@ -1493,21 +1493,21 @@
 
 TEST_F(CanonicalizeEntryPointIOTest, DontRenameSymbols) {
   auto* src = R"(
-[[stage(fragment)]]
-fn tint_symbol_1([[location(0)]] col : f32) {
+@stage(fragment)
+fn tint_symbol_1(@location(0) col : f32) {
 }
 )";
 
   auto* expect = R"(
 struct tint_symbol_2 {
-  [[location(0)]]
+  @location(0)
   col : f32;
 }
 
 fn tint_symbol_1_inner(col : f32) {
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn tint_symbol_1(tint_symbol : tint_symbol_2) {
   tint_symbol_1_inner(tint_symbol.col);
 }
@@ -1523,21 +1523,21 @@
 
 TEST_F(CanonicalizeEntryPointIOTest, FixedSampleMask_VoidNoReturn) {
   auto* src = R"(
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() {
 }
 )";
 
   auto* expect = R"(
 struct tint_symbol {
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   fixed_sample_mask : u32;
 }
 
 fn frag_main_inner() {
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() -> tint_symbol {
   frag_main_inner();
   var wrapper_result : tint_symbol;
@@ -1556,7 +1556,7 @@
 
 TEST_F(CanonicalizeEntryPointIOTest, FixedSampleMask_VoidWithReturn) {
   auto* src = R"(
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() {
   return;
 }
@@ -1564,7 +1564,7 @@
 
   auto* expect = R"(
 struct tint_symbol {
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   fixed_sample_mask : u32;
 }
 
@@ -1572,7 +1572,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() -> tint_symbol {
   frag_main_inner();
   var wrapper_result : tint_symbol;
@@ -1591,15 +1591,15 @@
 
 TEST_F(CanonicalizeEntryPointIOTest, FixedSampleMask_WithAuthoredMask) {
   auto* src = R"(
-[[stage(fragment)]]
-fn frag_main() -> [[builtin(sample_mask)]] u32 {
+@stage(fragment)
+fn frag_main() -> @builtin(sample_mask) u32 {
   return 7u;
 }
 )";
 
   auto* expect = R"(
 struct tint_symbol {
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   value : u32;
 }
 
@@ -1607,7 +1607,7 @@
   return 7u;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() -> tint_symbol {
   let inner_result = frag_main_inner();
   var wrapper_result : tint_symbol;
@@ -1626,17 +1626,17 @@
 
 TEST_F(CanonicalizeEntryPointIOTest, FixedSampleMask_WithoutAuthoredMask) {
   auto* src = R"(
-[[stage(fragment)]]
-fn frag_main() -> [[location(0)]] f32 {
+@stage(fragment)
+fn frag_main() -> @location(0) f32 {
   return 1.0;
 }
 )";
 
   auto* expect = R"(
 struct tint_symbol {
-  [[location(0)]]
+  @location(0)
   value : f32;
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   fixed_sample_mask : u32;
 }
 
@@ -1644,7 +1644,7 @@
   return 1.0;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() -> tint_symbol {
   let inner_result = frag_main_inner();
   var wrapper_result : tint_symbol;
@@ -1665,12 +1665,12 @@
 TEST_F(CanonicalizeEntryPointIOTest, FixedSampleMask_StructWithAuthoredMask) {
   auto* src = R"(
 struct Output {
-  [[builtin(frag_depth)]] depth : f32;
-  [[builtin(sample_mask)]] mask : u32;
-  [[location(0)]] value : f32;
+  @builtin(frag_depth) depth : f32;
+  @builtin(sample_mask) mask : u32;
+  @location(0) value : f32;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() -> Output {
   return Output(0.5, 7u, 1.0);
 }
@@ -1684,11 +1684,11 @@
 }
 
 struct tint_symbol {
-  [[location(0)]]
+  @location(0)
   value : f32;
-  [[builtin(frag_depth)]]
+  @builtin(frag_depth)
   depth : f32;
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   mask : u32;
 }
 
@@ -1696,7 +1696,7 @@
   return Output(0.5, 7u, 1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() -> tint_symbol {
   let inner_result = frag_main_inner();
   var wrapper_result : tint_symbol;
@@ -1719,11 +1719,11 @@
        FixedSampleMask_StructWithoutAuthoredMask) {
   auto* src = R"(
 struct Output {
-  [[builtin(frag_depth)]] depth : f32;
-  [[location(0)]] value : f32;
+  @builtin(frag_depth) depth : f32;
+  @location(0) value : f32;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() -> Output {
   return Output(0.5, 1.0);
 }
@@ -1736,11 +1736,11 @@
 }
 
 struct tint_symbol {
-  [[location(0)]]
+  @location(0)
   value : f32;
-  [[builtin(frag_depth)]]
+  @builtin(frag_depth)
   depth : f32;
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   fixed_sample_mask : u32;
 }
 
@@ -1748,7 +1748,7 @@
   return Output(0.5, 1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() -> tint_symbol {
   let inner_result = frag_main_inner();
   var wrapper_result : tint_symbol;
@@ -1769,29 +1769,29 @@
 
 TEST_F(CanonicalizeEntryPointIOTest, FixedSampleMask_MultipleShaders) {
   auto* src = R"(
-[[stage(fragment)]]
-fn frag_main1() -> [[builtin(sample_mask)]] u32 {
+@stage(fragment)
+fn frag_main1() -> @builtin(sample_mask) u32 {
   return 7u;
 }
 
-[[stage(fragment)]]
-fn frag_main2() -> [[location(0)]] f32 {
+@stage(fragment)
+fn frag_main2() -> @location(0) f32 {
   return 1.0;
 }
 
-[[stage(vertex)]]
-fn vert_main1() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vert_main1() -> @builtin(position) vec4<f32> {
   return vec4<f32>();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main1() {
 }
 )";
 
   auto* expect = R"(
 struct tint_symbol {
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   value : u32;
 }
 
@@ -1799,7 +1799,7 @@
   return 7u;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main1() -> tint_symbol {
   let inner_result = frag_main1_inner();
   var wrapper_result : tint_symbol;
@@ -1808,9 +1808,9 @@
 }
 
 struct tint_symbol_1 {
-  [[location(0)]]
+  @location(0)
   value : f32;
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   fixed_sample_mask : u32;
 }
 
@@ -1818,7 +1818,7 @@
   return 1.0;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main2() -> tint_symbol_1 {
   let inner_result_1 = frag_main2_inner();
   var wrapper_result_1 : tint_symbol_1;
@@ -1828,7 +1828,7 @@
 }
 
 struct tint_symbol_2 {
-  [[builtin(position)]]
+  @builtin(position)
   value : vec4<f32>;
 }
 
@@ -1836,7 +1836,7 @@
   return vec4<f32>();
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main1() -> tint_symbol_2 {
   let inner_result_2 = vert_main1_inner();
   var wrapper_result_2 : tint_symbol_2;
@@ -1844,7 +1844,7 @@
   return wrapper_result_2;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main1() {
 }
 )";
@@ -1860,11 +1860,11 @@
 TEST_F(CanonicalizeEntryPointIOTest, FixedSampleMask_AvoidNameClash) {
   auto* src = R"(
 struct FragOut {
-  [[location(0)]] fixed_sample_mask : vec4<f32>;
-  [[location(1)]] fixed_sample_mask_1 : vec4<f32>;
+  @location(0) fixed_sample_mask : vec4<f32>;
+  @location(1) fixed_sample_mask_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() -> FragOut {
   return FragOut();
 }
@@ -1877,11 +1877,11 @@
 }
 
 struct tint_symbol {
-  [[location(0)]]
+  @location(0)
   fixed_sample_mask : vec4<f32>;
-  [[location(1)]]
+  @location(1)
   fixed_sample_mask_1 : vec4<f32>;
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   fixed_sample_mask_2 : u32;
 }
 
@@ -1889,7 +1889,7 @@
   return FragOut();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() -> tint_symbol {
   let inner_result = frag_main_inner();
   var wrapper_result : tint_symbol;
@@ -1911,22 +1911,22 @@
 TEST_F(CanonicalizeEntryPointIOTest,
        EmitVertexPointSize_ReturnNonStruct_Spirv) {
   auto* src = R"(
-[[stage(vertex)]]
-fn vert_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vert_main() -> @builtin(position) vec4<f32> {
   return vec4<f32>();
 }
 )";
 
   auto* expect = R"(
-[[builtin(position), internal(disable_validation__ignore_storage_class)]] var<out> value : vec4<f32>;
+@builtin(position) @internal(disable_validation__ignore_storage_class) var<out> value : vec4<f32>;
 
-[[builtin(pointsize), internal(disable_validation__ignore_storage_class)]] var<out> vertex_point_size : f32;
+@builtin(pointsize) @internal(disable_validation__ignore_storage_class) var<out> vertex_point_size : f32;
 
 fn vert_main_inner() -> vec4<f32> {
   return vec4<f32>();
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main() {
   let inner_result = vert_main_inner();
   value = inner_result;
@@ -1944,17 +1944,17 @@
 
 TEST_F(CanonicalizeEntryPointIOTest, EmitVertexPointSize_ReturnNonStruct_Msl) {
   auto* src = R"(
-[[stage(vertex)]]
-fn vert_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vert_main() -> @builtin(position) vec4<f32> {
   return vec4<f32>();
 }
 )";
 
   auto* expect = R"(
 struct tint_symbol {
-  [[builtin(position)]]
+  @builtin(position)
   value : vec4<f32>;
-  [[builtin(pointsize)]]
+  @builtin(pointsize)
   vertex_point_size : f32;
 }
 
@@ -1962,7 +1962,7 @@
   return vec4<f32>();
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main() -> tint_symbol {
   let inner_result = vert_main_inner();
   var wrapper_result : tint_symbol;
@@ -1983,19 +1983,19 @@
 TEST_F(CanonicalizeEntryPointIOTest, EmitVertexPointSize_ReturnStruct_Spirv) {
   auto* src = R"(
 struct VertOut {
-  [[builtin(position)]] pos : vec4<f32>;
+  @builtin(position) pos : vec4<f32>;
 };
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main() -> VertOut {
   return VertOut();
 }
 )";
 
   auto* expect = R"(
-[[builtin(position), internal(disable_validation__ignore_storage_class)]] var<out> pos_1 : vec4<f32>;
+@builtin(position) @internal(disable_validation__ignore_storage_class) var<out> pos_1 : vec4<f32>;
 
-[[builtin(pointsize), internal(disable_validation__ignore_storage_class)]] var<out> vertex_point_size : f32;
+@builtin(pointsize) @internal(disable_validation__ignore_storage_class) var<out> vertex_point_size : f32;
 
 struct VertOut {
   pos : vec4<f32>;
@@ -2005,7 +2005,7 @@
   return VertOut();
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main() {
   let inner_result = vert_main_inner();
   pos_1 = inner_result.pos;
@@ -2024,10 +2024,10 @@
 TEST_F(CanonicalizeEntryPointIOTest, EmitVertexPointSize_ReturnStruct_Msl) {
   auto* src = R"(
 struct VertOut {
-  [[builtin(position)]] pos : vec4<f32>;
+  @builtin(position) pos : vec4<f32>;
 };
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main() -> VertOut {
   return VertOut();
 }
@@ -2039,9 +2039,9 @@
 }
 
 struct tint_symbol {
-  [[builtin(position)]]
+  @builtin(position)
   pos : vec4<f32>;
-  [[builtin(pointsize)]]
+  @builtin(pointsize)
   vertex_point_size : f32;
 }
 
@@ -2049,7 +2049,7 @@
   return VertOut();
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main() -> tint_symbol {
   let inner_result = vert_main_inner();
   var wrapper_result : tint_symbol;
@@ -2074,19 +2074,19 @@
 var<private> vertex_point_size_2 : f32;
 
 struct VertIn1 {
-  [[location(0)]] collide : f32;
+  @location(0) collide : f32;
 };
 
 struct VertIn2 {
-  [[location(1)]] collide : f32;
+  @location(1) collide : f32;
 };
 
 struct VertOut {
-  [[location(0)]] vertex_point_size : f32;
-  [[builtin(position)]] vertex_point_size_1 : vec4<f32>;
+  @location(0) vertex_point_size : f32;
+  @builtin(position) vertex_point_size_1 : vec4<f32>;
 };
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main(collide : VertIn1, collide_1 : VertIn2) -> VertOut {
   let x = collide.collide + collide_1.collide;
   return VertOut();
@@ -2094,15 +2094,15 @@
 )";
 
   auto* expect = R"(
-[[location(0), internal(disable_validation__ignore_storage_class)]] var<in> collide_2 : f32;
+@location(0) @internal(disable_validation__ignore_storage_class) var<in> collide_2 : f32;
 
-[[location(1), internal(disable_validation__ignore_storage_class)]] var<in> collide_3 : f32;
+@location(1) @internal(disable_validation__ignore_storage_class) var<in> collide_3 : f32;
 
-[[location(0), internal(disable_validation__ignore_storage_class)]] var<out> vertex_point_size_3 : f32;
+@location(0) @internal(disable_validation__ignore_storage_class) var<out> vertex_point_size_3 : f32;
 
-[[builtin(position), internal(disable_validation__ignore_storage_class)]] var<out> vertex_point_size_1_1 : vec4<f32>;
+@builtin(position) @internal(disable_validation__ignore_storage_class) var<out> vertex_point_size_1_1 : vec4<f32>;
 
-[[builtin(pointsize), internal(disable_validation__ignore_storage_class)]] var<out> vertex_point_size_4 : f32;
+@builtin(pointsize) @internal(disable_validation__ignore_storage_class) var<out> vertex_point_size_4 : f32;
 
 var<private> vertex_point_size : f32;
 
@@ -2128,7 +2128,7 @@
   return VertOut();
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main() {
   let inner_result = vert_main_inner(VertIn1(collide_2), VertIn2(collide_3));
   vertex_point_size_3 = inner_result.vertex_point_size;
@@ -2148,19 +2148,19 @@
 TEST_F(CanonicalizeEntryPointIOTest, EmitVertexPointSize_AvoidNameClash_Msl) {
   auto* src = R"(
 struct VertIn1 {
-  [[location(0)]] collide : f32;
+  @location(0) collide : f32;
 };
 
 struct VertIn2 {
-  [[location(1)]] collide : f32;
+  @location(1) collide : f32;
 };
 
 struct VertOut {
-  [[location(0)]] vertex_point_size : vec4<f32>;
-  [[builtin(position)]] vertex_point_size_1 : vec4<f32>;
+  @location(0) vertex_point_size : vec4<f32>;
+  @builtin(position) vertex_point_size_1 : vec4<f32>;
 };
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main(collide : VertIn1, collide_1 : VertIn2) -> VertOut {
   let x = collide.collide + collide_1.collide;
   return VertOut();
@@ -2182,18 +2182,18 @@
 }
 
 struct tint_symbol_1 {
-  [[location(0)]]
+  @location(0)
   collide : f32;
-  [[location(1)]]
+  @location(1)
   collide_2 : f32;
 }
 
 struct tint_symbol_2 {
-  [[location(0)]]
+  @location(0)
   vertex_point_size : vec4<f32>;
-  [[builtin(position)]]
+  @builtin(position)
   vertex_point_size_1 : vec4<f32>;
-  [[builtin(pointsize)]]
+  @builtin(pointsize)
   vertex_point_size_2 : f32;
 }
 
@@ -2202,7 +2202,7 @@
   return VertOut();
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main(tint_symbol : tint_symbol_1) -> tint_symbol_2 {
   let inner_result = vert_main_inner(VertIn1(tint_symbol.collide), VertIn2(tint_symbol.collide_2));
   var wrapper_result : tint_symbol_2;
@@ -2224,19 +2224,19 @@
 TEST_F(CanonicalizeEntryPointIOTest, EmitVertexPointSize_AvoidNameClash_Hlsl) {
   auto* src = R"(
 struct VertIn1 {
-  [[location(0)]] collide : f32;
+  @location(0) collide : f32;
 };
 
 struct VertIn2 {
-  [[location(1)]] collide : f32;
+  @location(1) collide : f32;
 };
 
 struct VertOut {
-  [[location(0)]] vertex_point_size : vec4<f32>;
-  [[builtin(position)]] vertex_point_size_1 : vec4<f32>;
+  @location(0) vertex_point_size : vec4<f32>;
+  @builtin(position) vertex_point_size_1 : vec4<f32>;
 };
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main(collide : VertIn1, collide_1 : VertIn2) -> VertOut {
   let x = collide.collide + collide_1.collide;
   return VertOut();
@@ -2258,18 +2258,18 @@
 }
 
 struct tint_symbol_1 {
-  [[location(0)]]
+  @location(0)
   collide : f32;
-  [[location(1)]]
+  @location(1)
   collide_2 : f32;
 }
 
 struct tint_symbol_2 {
-  [[location(0)]]
+  @location(0)
   vertex_point_size : vec4<f32>;
-  [[builtin(position)]]
+  @builtin(position)
   vertex_point_size_1 : vec4<f32>;
-  [[builtin(pointsize)]]
+  @builtin(pointsize)
   vertex_point_size_2 : f32;
 }
 
@@ -2278,7 +2278,7 @@
   return VertOut();
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main(tint_symbol : tint_symbol_1) -> tint_symbol_2 {
   let inner_result = vert_main_inner(VertIn1(tint_symbol.collide), VertIn2(tint_symbol.collide_2));
   var wrapper_result : tint_symbol_2;
@@ -2299,26 +2299,26 @@
 
 TEST_F(CanonicalizeEntryPointIOTest, SpirvSampleMaskBuiltins) {
   auto* src = R"(
-[[stage(fragment)]]
-fn main([[builtin(sample_index)]] sample_index : u32,
-        [[builtin(sample_mask)]] mask_in : u32
-        ) -> [[builtin(sample_mask)]] u32 {
+@stage(fragment)
+fn main(@builtin(sample_index) sample_index : u32,
+        @builtin(sample_mask) mask_in : u32
+        ) -> @builtin(sample_mask) u32 {
   return mask_in;
 }
 )";
 
   auto* expect = R"(
-[[builtin(sample_index), internal(disable_validation__ignore_storage_class)]] var<in> sample_index_1 : u32;
+@builtin(sample_index) @internal(disable_validation__ignore_storage_class) var<in> sample_index_1 : u32;
 
-[[builtin(sample_mask), internal(disable_validation__ignore_storage_class)]] var<in> mask_in_1 : array<u32, 1>;
+@builtin(sample_mask) @internal(disable_validation__ignore_storage_class) var<in> mask_in_1 : array<u32, 1>;
 
-[[builtin(sample_mask), internal(disable_validation__ignore_storage_class)]] var<out> value : array<u32, 1>;
+@builtin(sample_mask) @internal(disable_validation__ignore_storage_class) var<out> value : array<u32, 1>;
 
 fn main_inner(sample_index : u32, mask_in : u32) -> u32 {
   return mask_in;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let inner_result = main_inner(sample_index_1, mask_in_1[0]);
   value[0] = inner_result;
diff --git a/src/transform/decompose_memory_access.h b/src/transform/decompose_memory_access.h
index 67f3eb9..9fb1b0f 100644
--- a/src/transform/decompose_memory_access.h
+++ b/src/transform/decompose_memory_access.h
@@ -82,7 +82,7 @@
     ~Intrinsic() override;
 
     /// @return a short description of the internal decoration which will be
-    /// displayed as `[[internal(<name>)]]`
+    /// displayed as `@internal(<name>)`
     std::string InternalName() const override;
 
     /// Performs a deep clone of this object using the CloneContext `ctx`.
diff --git a/src/transform/decompose_memory_access_test.cc b/src/transform/decompose_memory_access_test.cc
index c28f48e..2fd6e10 100644
--- a/src/transform/decompose_memory_access_test.cc
+++ b/src/transform/decompose_memory_access_test.cc
@@ -49,9 +49,9 @@
   v : array<vec3<f32>, 2>;
 };
 
-[[group(0), binding(0)]] var<storage, read_write> sb : SB;
+@group(0) @binding(0) var<storage, read_write> sb : SB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var a : i32 = sb.a;
   var b : u32 = sb.b;
@@ -104,81 +104,81 @@
   v : array<vec3<f32>, 2>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb : SB;
+@group(0) @binding(0) var<storage, read_write> sb : SB;
 
-[[internal(intrinsic_load_storage_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> i32
+@internal(intrinsic_load_storage_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> i32
 
-[[internal(intrinsic_load_storage_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_1([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> u32
+@internal(intrinsic_load_storage_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_1(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> u32
 
-[[internal(intrinsic_load_storage_f32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_2([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> f32
+@internal(intrinsic_load_storage_f32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_2(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> f32
 
-[[internal(intrinsic_load_storage_vec2_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_3([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> vec2<i32>
+@internal(intrinsic_load_storage_vec2_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_3(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> vec2<i32>
 
-[[internal(intrinsic_load_storage_vec2_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_4([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> vec2<u32>
+@internal(intrinsic_load_storage_vec2_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_4(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> vec2<u32>
 
-[[internal(intrinsic_load_storage_vec2_f32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_5([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> vec2<f32>
+@internal(intrinsic_load_storage_vec2_f32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_5(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> vec2<f32>
 
-[[internal(intrinsic_load_storage_vec3_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_6([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> vec3<i32>
+@internal(intrinsic_load_storage_vec3_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_6(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> vec3<i32>
 
-[[internal(intrinsic_load_storage_vec3_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_7([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> vec3<u32>
+@internal(intrinsic_load_storage_vec3_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_7(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> vec3<u32>
 
-[[internal(intrinsic_load_storage_vec3_f32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_8([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> vec3<f32>
+@internal(intrinsic_load_storage_vec3_f32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_8(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> vec3<f32>
 
-[[internal(intrinsic_load_storage_vec4_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_9([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> vec4<i32>
+@internal(intrinsic_load_storage_vec4_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_9(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> vec4<i32>
 
-[[internal(intrinsic_load_storage_vec4_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_10([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> vec4<u32>
+@internal(intrinsic_load_storage_vec4_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_10(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> vec4<u32>
 
-[[internal(intrinsic_load_storage_vec4_f32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_11([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> vec4<f32>
+@internal(intrinsic_load_storage_vec4_f32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_11(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> vec4<f32>
 
-fn tint_symbol_12([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> mat2x2<f32> {
+fn tint_symbol_12(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> mat2x2<f32> {
   return mat2x2<f32>(tint_symbol_5(buffer, (offset + 0u)), tint_symbol_5(buffer, (offset + 8u)));
 }
 
-fn tint_symbol_13([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> mat2x3<f32> {
+fn tint_symbol_13(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> mat2x3<f32> {
   return mat2x3<f32>(tint_symbol_8(buffer, (offset + 0u)), tint_symbol_8(buffer, (offset + 16u)));
 }
 
-fn tint_symbol_14([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> mat2x4<f32> {
+fn tint_symbol_14(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> mat2x4<f32> {
   return mat2x4<f32>(tint_symbol_11(buffer, (offset + 0u)), tint_symbol_11(buffer, (offset + 16u)));
 }
 
-fn tint_symbol_15([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> mat3x2<f32> {
+fn tint_symbol_15(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> mat3x2<f32> {
   return mat3x2<f32>(tint_symbol_5(buffer, (offset + 0u)), tint_symbol_5(buffer, (offset + 8u)), tint_symbol_5(buffer, (offset + 16u)));
 }
 
-fn tint_symbol_16([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> mat3x3<f32> {
+fn tint_symbol_16(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> mat3x3<f32> {
   return mat3x3<f32>(tint_symbol_8(buffer, (offset + 0u)), tint_symbol_8(buffer, (offset + 16u)), tint_symbol_8(buffer, (offset + 32u)));
 }
 
-fn tint_symbol_17([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> mat3x4<f32> {
+fn tint_symbol_17(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> mat3x4<f32> {
   return mat3x4<f32>(tint_symbol_11(buffer, (offset + 0u)), tint_symbol_11(buffer, (offset + 16u)), tint_symbol_11(buffer, (offset + 32u)));
 }
 
-fn tint_symbol_18([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> mat4x2<f32> {
+fn tint_symbol_18(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> mat4x2<f32> {
   return mat4x2<f32>(tint_symbol_5(buffer, (offset + 0u)), tint_symbol_5(buffer, (offset + 8u)), tint_symbol_5(buffer, (offset + 16u)), tint_symbol_5(buffer, (offset + 24u)));
 }
 
-fn tint_symbol_19([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> mat4x3<f32> {
+fn tint_symbol_19(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> mat4x3<f32> {
   return mat4x3<f32>(tint_symbol_8(buffer, (offset + 0u)), tint_symbol_8(buffer, (offset + 16u)), tint_symbol_8(buffer, (offset + 32u)), tint_symbol_8(buffer, (offset + 48u)));
 }
 
-fn tint_symbol_20([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> mat4x4<f32> {
+fn tint_symbol_20(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> mat4x4<f32> {
   return mat4x4<f32>(tint_symbol_11(buffer, (offset + 0u)), tint_symbol_11(buffer, (offset + 16u)), tint_symbol_11(buffer, (offset + 32u)), tint_symbol_11(buffer, (offset + 48u)));
 }
 
-fn tint_symbol_21([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> array<vec3<f32>, 2u> {
+fn tint_symbol_21(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> array<vec3<f32>, 2u> {
   var arr : array<vec3<f32>, 2u>;
   for(var i_1 = 0u; (i_1 < 2u); i_1 = (i_1 + 1u)) {
     arr[i_1] = tint_symbol_8(buffer, (offset + (i_1 * 16u)));
@@ -186,7 +186,7 @@
   return arr;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var a : i32 = tint_symbol(sb, 0u);
   var b : u32 = tint_symbol_1(sb, 4u);
@@ -245,9 +245,9 @@
   v : array<vec3<f32>, 2>;
 };
 
-[[group(0), binding(0)]] var<uniform> ub : UB;
+@group(0) @binding(0) var<uniform> ub : UB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var a : i32 = ub.a;
   var b : u32 = ub.b;
@@ -300,81 +300,81 @@
   v : array<vec3<f32>, 2>;
 }
 
-[[group(0), binding(0)]] var<uniform> ub : UB;
+@group(0) @binding(0) var<uniform> ub : UB;
 
-[[internal(intrinsic_load_uniform_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> i32
+@internal(intrinsic_load_uniform_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : UB, offset : u32) -> i32
 
-[[internal(intrinsic_load_uniform_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_1([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> u32
+@internal(intrinsic_load_uniform_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_1(@internal(disable_validation__ignore_constructible_function_parameter) buffer : UB, offset : u32) -> u32
 
-[[internal(intrinsic_load_uniform_f32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_2([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> f32
+@internal(intrinsic_load_uniform_f32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_2(@internal(disable_validation__ignore_constructible_function_parameter) buffer : UB, offset : u32) -> f32
 
-[[internal(intrinsic_load_uniform_vec2_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_3([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> vec2<i32>
+@internal(intrinsic_load_uniform_vec2_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_3(@internal(disable_validation__ignore_constructible_function_parameter) buffer : UB, offset : u32) -> vec2<i32>
 
-[[internal(intrinsic_load_uniform_vec2_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_4([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> vec2<u32>
+@internal(intrinsic_load_uniform_vec2_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_4(@internal(disable_validation__ignore_constructible_function_parameter) buffer : UB, offset : u32) -> vec2<u32>
 
-[[internal(intrinsic_load_uniform_vec2_f32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_5([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> vec2<f32>
+@internal(intrinsic_load_uniform_vec2_f32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_5(@internal(disable_validation__ignore_constructible_function_parameter) buffer : UB, offset : u32) -> vec2<f32>
 
-[[internal(intrinsic_load_uniform_vec3_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_6([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> vec3<i32>
+@internal(intrinsic_load_uniform_vec3_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_6(@internal(disable_validation__ignore_constructible_function_parameter) buffer : UB, offset : u32) -> vec3<i32>
 
-[[internal(intrinsic_load_uniform_vec3_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_7([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> vec3<u32>
+@internal(intrinsic_load_uniform_vec3_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_7(@internal(disable_validation__ignore_constructible_function_parameter) buffer : UB, offset : u32) -> vec3<u32>
 
-[[internal(intrinsic_load_uniform_vec3_f32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_8([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> vec3<f32>
+@internal(intrinsic_load_uniform_vec3_f32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_8(@internal(disable_validation__ignore_constructible_function_parameter) buffer : UB, offset : u32) -> vec3<f32>
 
-[[internal(intrinsic_load_uniform_vec4_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_9([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> vec4<i32>
+@internal(intrinsic_load_uniform_vec4_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_9(@internal(disable_validation__ignore_constructible_function_parameter) buffer : UB, offset : u32) -> vec4<i32>
 
-[[internal(intrinsic_load_uniform_vec4_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_10([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> vec4<u32>
+@internal(intrinsic_load_uniform_vec4_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_10(@internal(disable_validation__ignore_constructible_function_parameter) buffer : UB, offset : u32) -> vec4<u32>
 
-[[internal(intrinsic_load_uniform_vec4_f32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_11([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> vec4<f32>
+@internal(intrinsic_load_uniform_vec4_f32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_11(@internal(disable_validation__ignore_constructible_function_parameter) buffer : UB, offset : u32) -> vec4<f32>
 
-fn tint_symbol_12([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> mat2x2<f32> {
+fn tint_symbol_12(@internal(disable_validation__ignore_constructible_function_parameter) buffer : UB, offset : u32) -> mat2x2<f32> {
   return mat2x2<f32>(tint_symbol_5(buffer, (offset + 0u)), tint_symbol_5(buffer, (offset + 8u)));
 }
 
-fn tint_symbol_13([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> mat2x3<f32> {
+fn tint_symbol_13(@internal(disable_validation__ignore_constructible_function_parameter) buffer : UB, offset : u32) -> mat2x3<f32> {
   return mat2x3<f32>(tint_symbol_8(buffer, (offset + 0u)), tint_symbol_8(buffer, (offset + 16u)));
 }
 
-fn tint_symbol_14([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> mat2x4<f32> {
+fn tint_symbol_14(@internal(disable_validation__ignore_constructible_function_parameter) buffer : UB, offset : u32) -> mat2x4<f32> {
   return mat2x4<f32>(tint_symbol_11(buffer, (offset + 0u)), tint_symbol_11(buffer, (offset + 16u)));
 }
 
-fn tint_symbol_15([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> mat3x2<f32> {
+fn tint_symbol_15(@internal(disable_validation__ignore_constructible_function_parameter) buffer : UB, offset : u32) -> mat3x2<f32> {
   return mat3x2<f32>(tint_symbol_5(buffer, (offset + 0u)), tint_symbol_5(buffer, (offset + 8u)), tint_symbol_5(buffer, (offset + 16u)));
 }
 
-fn tint_symbol_16([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> mat3x3<f32> {
+fn tint_symbol_16(@internal(disable_validation__ignore_constructible_function_parameter) buffer : UB, offset : u32) -> mat3x3<f32> {
   return mat3x3<f32>(tint_symbol_8(buffer, (offset + 0u)), tint_symbol_8(buffer, (offset + 16u)), tint_symbol_8(buffer, (offset + 32u)));
 }
 
-fn tint_symbol_17([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> mat3x4<f32> {
+fn tint_symbol_17(@internal(disable_validation__ignore_constructible_function_parameter) buffer : UB, offset : u32) -> mat3x4<f32> {
   return mat3x4<f32>(tint_symbol_11(buffer, (offset + 0u)), tint_symbol_11(buffer, (offset + 16u)), tint_symbol_11(buffer, (offset + 32u)));
 }
 
-fn tint_symbol_18([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> mat4x2<f32> {
+fn tint_symbol_18(@internal(disable_validation__ignore_constructible_function_parameter) buffer : UB, offset : u32) -> mat4x2<f32> {
   return mat4x2<f32>(tint_symbol_5(buffer, (offset + 0u)), tint_symbol_5(buffer, (offset + 8u)), tint_symbol_5(buffer, (offset + 16u)), tint_symbol_5(buffer, (offset + 24u)));
 }
 
-fn tint_symbol_19([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> mat4x3<f32> {
+fn tint_symbol_19(@internal(disable_validation__ignore_constructible_function_parameter) buffer : UB, offset : u32) -> mat4x3<f32> {
   return mat4x3<f32>(tint_symbol_8(buffer, (offset + 0u)), tint_symbol_8(buffer, (offset + 16u)), tint_symbol_8(buffer, (offset + 32u)), tint_symbol_8(buffer, (offset + 48u)));
 }
 
-fn tint_symbol_20([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> mat4x4<f32> {
+fn tint_symbol_20(@internal(disable_validation__ignore_constructible_function_parameter) buffer : UB, offset : u32) -> mat4x4<f32> {
   return mat4x4<f32>(tint_symbol_11(buffer, (offset + 0u)), tint_symbol_11(buffer, (offset + 16u)), tint_symbol_11(buffer, (offset + 32u)), tint_symbol_11(buffer, (offset + 48u)));
 }
 
-fn tint_symbol_21([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> array<vec3<f32>, 2u> {
+fn tint_symbol_21(@internal(disable_validation__ignore_constructible_function_parameter) buffer : UB, offset : u32) -> array<vec3<f32>, 2u> {
   var arr : array<vec3<f32>, 2u>;
   for(var i_1 = 0u; (i_1 < 2u); i_1 = (i_1 + 1u)) {
     arr[i_1] = tint_symbol_8(buffer, (offset + (i_1 * 16u)));
@@ -382,7 +382,7 @@
   return arr;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var a : i32 = tint_symbol(ub, 0u);
   var b : u32 = tint_symbol_1(ub, 4u);
@@ -441,9 +441,9 @@
   v : array<vec3<f32>, 2>;
 };
 
-[[group(0), binding(0)]] var<storage, read_write> sb : SB;
+@group(0) @binding(0) var<storage, read_write> sb : SB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   sb.a = i32();
   sb.b = u32();
@@ -496,106 +496,106 @@
   v : array<vec3<f32>, 2>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb : SB;
+@group(0) @binding(0) var<storage, read_write> sb : SB;
 
-[[internal(intrinsic_store_storage_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : i32)
+@internal(intrinsic_store_storage_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : i32)
 
-[[internal(intrinsic_store_storage_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_1([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : u32)
+@internal(intrinsic_store_storage_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_1(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : u32)
 
-[[internal(intrinsic_store_storage_f32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_2([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : f32)
+@internal(intrinsic_store_storage_f32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_2(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : f32)
 
-[[internal(intrinsic_store_storage_vec2_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_3([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : vec2<i32>)
+@internal(intrinsic_store_storage_vec2_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_3(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : vec2<i32>)
 
-[[internal(intrinsic_store_storage_vec2_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_4([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : vec2<u32>)
+@internal(intrinsic_store_storage_vec2_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_4(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : vec2<u32>)
 
-[[internal(intrinsic_store_storage_vec2_f32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_5([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : vec2<f32>)
+@internal(intrinsic_store_storage_vec2_f32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_5(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : vec2<f32>)
 
-[[internal(intrinsic_store_storage_vec3_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_6([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : vec3<i32>)
+@internal(intrinsic_store_storage_vec3_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_6(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : vec3<i32>)
 
-[[internal(intrinsic_store_storage_vec3_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_7([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : vec3<u32>)
+@internal(intrinsic_store_storage_vec3_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_7(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : vec3<u32>)
 
-[[internal(intrinsic_store_storage_vec3_f32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_8([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : vec3<f32>)
+@internal(intrinsic_store_storage_vec3_f32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_8(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : vec3<f32>)
 
-[[internal(intrinsic_store_storage_vec4_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_9([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : vec4<i32>)
+@internal(intrinsic_store_storage_vec4_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_9(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : vec4<i32>)
 
-[[internal(intrinsic_store_storage_vec4_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_10([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : vec4<u32>)
+@internal(intrinsic_store_storage_vec4_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_10(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : vec4<u32>)
 
-[[internal(intrinsic_store_storage_vec4_f32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_11([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : vec4<f32>)
+@internal(intrinsic_store_storage_vec4_f32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_11(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : vec4<f32>)
 
-fn tint_symbol_12([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : mat2x2<f32>) {
+fn tint_symbol_12(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : mat2x2<f32>) {
   tint_symbol_5(buffer, (offset + 0u), value[0u]);
   tint_symbol_5(buffer, (offset + 8u), value[1u]);
 }
 
-fn tint_symbol_13([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : mat2x3<f32>) {
+fn tint_symbol_13(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : mat2x3<f32>) {
   tint_symbol_8(buffer, (offset + 0u), value[0u]);
   tint_symbol_8(buffer, (offset + 16u), value[1u]);
 }
 
-fn tint_symbol_14([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : mat2x4<f32>) {
+fn tint_symbol_14(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : mat2x4<f32>) {
   tint_symbol_11(buffer, (offset + 0u), value[0u]);
   tint_symbol_11(buffer, (offset + 16u), value[1u]);
 }
 
-fn tint_symbol_15([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : mat3x2<f32>) {
+fn tint_symbol_15(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : mat3x2<f32>) {
   tint_symbol_5(buffer, (offset + 0u), value[0u]);
   tint_symbol_5(buffer, (offset + 8u), value[1u]);
   tint_symbol_5(buffer, (offset + 16u), value[2u]);
 }
 
-fn tint_symbol_16([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : mat3x3<f32>) {
+fn tint_symbol_16(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : mat3x3<f32>) {
   tint_symbol_8(buffer, (offset + 0u), value[0u]);
   tint_symbol_8(buffer, (offset + 16u), value[1u]);
   tint_symbol_8(buffer, (offset + 32u), value[2u]);
 }
 
-fn tint_symbol_17([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : mat3x4<f32>) {
+fn tint_symbol_17(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : mat3x4<f32>) {
   tint_symbol_11(buffer, (offset + 0u), value[0u]);
   tint_symbol_11(buffer, (offset + 16u), value[1u]);
   tint_symbol_11(buffer, (offset + 32u), value[2u]);
 }
 
-fn tint_symbol_18([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : mat4x2<f32>) {
+fn tint_symbol_18(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : mat4x2<f32>) {
   tint_symbol_5(buffer, (offset + 0u), value[0u]);
   tint_symbol_5(buffer, (offset + 8u), value[1u]);
   tint_symbol_5(buffer, (offset + 16u), value[2u]);
   tint_symbol_5(buffer, (offset + 24u), value[3u]);
 }
 
-fn tint_symbol_19([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : mat4x3<f32>) {
+fn tint_symbol_19(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : mat4x3<f32>) {
   tint_symbol_8(buffer, (offset + 0u), value[0u]);
   tint_symbol_8(buffer, (offset + 16u), value[1u]);
   tint_symbol_8(buffer, (offset + 32u), value[2u]);
   tint_symbol_8(buffer, (offset + 48u), value[3u]);
 }
 
-fn tint_symbol_20([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : mat4x4<f32>) {
+fn tint_symbol_20(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : mat4x4<f32>) {
   tint_symbol_11(buffer, (offset + 0u), value[0u]);
   tint_symbol_11(buffer, (offset + 16u), value[1u]);
   tint_symbol_11(buffer, (offset + 32u), value[2u]);
   tint_symbol_11(buffer, (offset + 48u), value[3u]);
 }
 
-fn tint_symbol_21([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : array<vec3<f32>, 2u>) {
+fn tint_symbol_21(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : array<vec3<f32>, 2u>) {
   var array = value;
   for(var i_1 = 0u; (i_1 < 2u); i_1 = (i_1 + 1u)) {
     tint_symbol_8(buffer, (offset + (i_1 * 16u)), array[i_1]);
   }
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   tint_symbol(sb, 0u, i32());
   tint_symbol_1(sb, 4u, u32());
@@ -654,9 +654,9 @@
   v : array<vec3<f32>, 2>;
 };
 
-[[group(0), binding(0)]] var<storage, read_write> sb : SB;
+@group(0) @binding(0) var<storage, read_write> sb : SB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var x : SB = sb;
 }
@@ -688,81 +688,81 @@
   v : array<vec3<f32>, 2>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb : SB;
+@group(0) @binding(0) var<storage, read_write> sb : SB;
 
-[[internal(intrinsic_load_storage_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_1([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> i32
+@internal(intrinsic_load_storage_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_1(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> i32
 
-[[internal(intrinsic_load_storage_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_2([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> u32
+@internal(intrinsic_load_storage_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_2(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> u32
 
-[[internal(intrinsic_load_storage_f32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_3([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> f32
+@internal(intrinsic_load_storage_f32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_3(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> f32
 
-[[internal(intrinsic_load_storage_vec2_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_4([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> vec2<i32>
+@internal(intrinsic_load_storage_vec2_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_4(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> vec2<i32>
 
-[[internal(intrinsic_load_storage_vec2_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_5([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> vec2<u32>
+@internal(intrinsic_load_storage_vec2_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_5(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> vec2<u32>
 
-[[internal(intrinsic_load_storage_vec2_f32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_6([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> vec2<f32>
+@internal(intrinsic_load_storage_vec2_f32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_6(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> vec2<f32>
 
-[[internal(intrinsic_load_storage_vec3_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_7([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> vec3<i32>
+@internal(intrinsic_load_storage_vec3_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_7(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> vec3<i32>
 
-[[internal(intrinsic_load_storage_vec3_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_8([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> vec3<u32>
+@internal(intrinsic_load_storage_vec3_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_8(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> vec3<u32>
 
-[[internal(intrinsic_load_storage_vec3_f32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_9([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> vec3<f32>
+@internal(intrinsic_load_storage_vec3_f32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_9(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> vec3<f32>
 
-[[internal(intrinsic_load_storage_vec4_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_10([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> vec4<i32>
+@internal(intrinsic_load_storage_vec4_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_10(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> vec4<i32>
 
-[[internal(intrinsic_load_storage_vec4_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_11([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> vec4<u32>
+@internal(intrinsic_load_storage_vec4_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_11(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> vec4<u32>
 
-[[internal(intrinsic_load_storage_vec4_f32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_12([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> vec4<f32>
+@internal(intrinsic_load_storage_vec4_f32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_12(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> vec4<f32>
 
-fn tint_symbol_13([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> mat2x2<f32> {
+fn tint_symbol_13(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> mat2x2<f32> {
   return mat2x2<f32>(tint_symbol_6(buffer, (offset + 0u)), tint_symbol_6(buffer, (offset + 8u)));
 }
 
-fn tint_symbol_14([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> mat2x3<f32> {
+fn tint_symbol_14(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> mat2x3<f32> {
   return mat2x3<f32>(tint_symbol_9(buffer, (offset + 0u)), tint_symbol_9(buffer, (offset + 16u)));
 }
 
-fn tint_symbol_15([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> mat2x4<f32> {
+fn tint_symbol_15(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> mat2x4<f32> {
   return mat2x4<f32>(tint_symbol_12(buffer, (offset + 0u)), tint_symbol_12(buffer, (offset + 16u)));
 }
 
-fn tint_symbol_16([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> mat3x2<f32> {
+fn tint_symbol_16(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> mat3x2<f32> {
   return mat3x2<f32>(tint_symbol_6(buffer, (offset + 0u)), tint_symbol_6(buffer, (offset + 8u)), tint_symbol_6(buffer, (offset + 16u)));
 }
 
-fn tint_symbol_17([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> mat3x3<f32> {
+fn tint_symbol_17(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> mat3x3<f32> {
   return mat3x3<f32>(tint_symbol_9(buffer, (offset + 0u)), tint_symbol_9(buffer, (offset + 16u)), tint_symbol_9(buffer, (offset + 32u)));
 }
 
-fn tint_symbol_18([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> mat3x4<f32> {
+fn tint_symbol_18(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> mat3x4<f32> {
   return mat3x4<f32>(tint_symbol_12(buffer, (offset + 0u)), tint_symbol_12(buffer, (offset + 16u)), tint_symbol_12(buffer, (offset + 32u)));
 }
 
-fn tint_symbol_19([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> mat4x2<f32> {
+fn tint_symbol_19(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> mat4x2<f32> {
   return mat4x2<f32>(tint_symbol_6(buffer, (offset + 0u)), tint_symbol_6(buffer, (offset + 8u)), tint_symbol_6(buffer, (offset + 16u)), tint_symbol_6(buffer, (offset + 24u)));
 }
 
-fn tint_symbol_20([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> mat4x3<f32> {
+fn tint_symbol_20(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> mat4x3<f32> {
   return mat4x3<f32>(tint_symbol_9(buffer, (offset + 0u)), tint_symbol_9(buffer, (offset + 16u)), tint_symbol_9(buffer, (offset + 32u)), tint_symbol_9(buffer, (offset + 48u)));
 }
 
-fn tint_symbol_21([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> mat4x4<f32> {
+fn tint_symbol_21(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> mat4x4<f32> {
   return mat4x4<f32>(tint_symbol_12(buffer, (offset + 0u)), tint_symbol_12(buffer, (offset + 16u)), tint_symbol_12(buffer, (offset + 32u)), tint_symbol_12(buffer, (offset + 48u)));
 }
 
-fn tint_symbol_22([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> array<vec3<f32>, 2u> {
+fn tint_symbol_22(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> array<vec3<f32>, 2u> {
   var arr : array<vec3<f32>, 2u>;
   for(var i_1 = 0u; (i_1 < 2u); i_1 = (i_1 + 1u)) {
     arr[i_1] = tint_symbol_9(buffer, (offset + (i_1 * 16u)));
@@ -770,11 +770,11 @@
   return arr;
 }
 
-fn tint_symbol([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> SB {
+fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> SB {
   return SB(tint_symbol_1(buffer, (offset + 0u)), tint_symbol_2(buffer, (offset + 4u)), tint_symbol_3(buffer, (offset + 8u)), tint_symbol_4(buffer, (offset + 16u)), tint_symbol_5(buffer, (offset + 24u)), tint_symbol_6(buffer, (offset + 32u)), tint_symbol_7(buffer, (offset + 48u)), tint_symbol_8(buffer, (offset + 64u)), tint_symbol_9(buffer, (offset + 80u)), tint_symbol_10(buffer, (offset + 96u)), tint_symbol_11(buffer, (offset + 112u)), tint_symbol_12(buffer, (offset + 128u)), tint_symbol_13(buffer, (offset + 144u)), tint_symbol_14(buffer, (offset + 160u)), tint_symbol_15(buffer, (offset + 192u)), tint_symbol_16(buffer, (offset + 224u)), tint_symbol_17(buffer, (offset + 256u)), tint_symbol_18(buffer, (offset + 304u)), tint_symbol_19(buffer, (offset + 352u)), tint_symbol_20(buffer, (offset + 384u)), tint_symbol_21(buffer, (offset + 448u)), tint_symbol_22(buffer, (offset + 512u)));
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var x : SB = tint_symbol(sb, 0u);
 }
@@ -812,9 +812,9 @@
   v : array<vec3<f32>, 2>;
 };
 
-[[group(0), binding(0)]] var<storage, read_write> sb : SB;
+@group(0) @binding(0) var<storage, read_write> sb : SB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   sb = SB();
 }
@@ -846,106 +846,106 @@
   v : array<vec3<f32>, 2>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb : SB;
+@group(0) @binding(0) var<storage, read_write> sb : SB;
 
-[[internal(intrinsic_store_storage_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_1([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : i32)
+@internal(intrinsic_store_storage_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_1(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : i32)
 
-[[internal(intrinsic_store_storage_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_2([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : u32)
+@internal(intrinsic_store_storage_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_2(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : u32)
 
-[[internal(intrinsic_store_storage_f32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_3([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : f32)
+@internal(intrinsic_store_storage_f32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_3(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : f32)
 
-[[internal(intrinsic_store_storage_vec2_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_4([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : vec2<i32>)
+@internal(intrinsic_store_storage_vec2_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_4(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : vec2<i32>)
 
-[[internal(intrinsic_store_storage_vec2_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_5([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : vec2<u32>)
+@internal(intrinsic_store_storage_vec2_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_5(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : vec2<u32>)
 
-[[internal(intrinsic_store_storage_vec2_f32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_6([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : vec2<f32>)
+@internal(intrinsic_store_storage_vec2_f32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_6(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : vec2<f32>)
 
-[[internal(intrinsic_store_storage_vec3_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_7([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : vec3<i32>)
+@internal(intrinsic_store_storage_vec3_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_7(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : vec3<i32>)
 
-[[internal(intrinsic_store_storage_vec3_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_8([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : vec3<u32>)
+@internal(intrinsic_store_storage_vec3_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_8(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : vec3<u32>)
 
-[[internal(intrinsic_store_storage_vec3_f32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_9([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : vec3<f32>)
+@internal(intrinsic_store_storage_vec3_f32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_9(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : vec3<f32>)
 
-[[internal(intrinsic_store_storage_vec4_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_10([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : vec4<i32>)
+@internal(intrinsic_store_storage_vec4_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_10(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : vec4<i32>)
 
-[[internal(intrinsic_store_storage_vec4_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_11([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : vec4<u32>)
+@internal(intrinsic_store_storage_vec4_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_11(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : vec4<u32>)
 
-[[internal(intrinsic_store_storage_vec4_f32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_12([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : vec4<f32>)
+@internal(intrinsic_store_storage_vec4_f32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_12(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : vec4<f32>)
 
-fn tint_symbol_13([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : mat2x2<f32>) {
+fn tint_symbol_13(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : mat2x2<f32>) {
   tint_symbol_6(buffer, (offset + 0u), value[0u]);
   tint_symbol_6(buffer, (offset + 8u), value[1u]);
 }
 
-fn tint_symbol_14([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : mat2x3<f32>) {
+fn tint_symbol_14(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : mat2x3<f32>) {
   tint_symbol_9(buffer, (offset + 0u), value[0u]);
   tint_symbol_9(buffer, (offset + 16u), value[1u]);
 }
 
-fn tint_symbol_15([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : mat2x4<f32>) {
+fn tint_symbol_15(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : mat2x4<f32>) {
   tint_symbol_12(buffer, (offset + 0u), value[0u]);
   tint_symbol_12(buffer, (offset + 16u), value[1u]);
 }
 
-fn tint_symbol_16([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : mat3x2<f32>) {
+fn tint_symbol_16(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : mat3x2<f32>) {
   tint_symbol_6(buffer, (offset + 0u), value[0u]);
   tint_symbol_6(buffer, (offset + 8u), value[1u]);
   tint_symbol_6(buffer, (offset + 16u), value[2u]);
 }
 
-fn tint_symbol_17([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : mat3x3<f32>) {
+fn tint_symbol_17(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : mat3x3<f32>) {
   tint_symbol_9(buffer, (offset + 0u), value[0u]);
   tint_symbol_9(buffer, (offset + 16u), value[1u]);
   tint_symbol_9(buffer, (offset + 32u), value[2u]);
 }
 
-fn tint_symbol_18([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : mat3x4<f32>) {
+fn tint_symbol_18(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : mat3x4<f32>) {
   tint_symbol_12(buffer, (offset + 0u), value[0u]);
   tint_symbol_12(buffer, (offset + 16u), value[1u]);
   tint_symbol_12(buffer, (offset + 32u), value[2u]);
 }
 
-fn tint_symbol_19([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : mat4x2<f32>) {
+fn tint_symbol_19(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : mat4x2<f32>) {
   tint_symbol_6(buffer, (offset + 0u), value[0u]);
   tint_symbol_6(buffer, (offset + 8u), value[1u]);
   tint_symbol_6(buffer, (offset + 16u), value[2u]);
   tint_symbol_6(buffer, (offset + 24u), value[3u]);
 }
 
-fn tint_symbol_20([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : mat4x3<f32>) {
+fn tint_symbol_20(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : mat4x3<f32>) {
   tint_symbol_9(buffer, (offset + 0u), value[0u]);
   tint_symbol_9(buffer, (offset + 16u), value[1u]);
   tint_symbol_9(buffer, (offset + 32u), value[2u]);
   tint_symbol_9(buffer, (offset + 48u), value[3u]);
 }
 
-fn tint_symbol_21([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : mat4x4<f32>) {
+fn tint_symbol_21(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : mat4x4<f32>) {
   tint_symbol_12(buffer, (offset + 0u), value[0u]);
   tint_symbol_12(buffer, (offset + 16u), value[1u]);
   tint_symbol_12(buffer, (offset + 32u), value[2u]);
   tint_symbol_12(buffer, (offset + 48u), value[3u]);
 }
 
-fn tint_symbol_22([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : array<vec3<f32>, 2u>) {
+fn tint_symbol_22(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : array<vec3<f32>, 2u>) {
   var array = value;
   for(var i_1 = 0u; (i_1 < 2u); i_1 = (i_1 + 1u)) {
     tint_symbol_9(buffer, (offset + (i_1 * 16u)), array[i_1]);
   }
 }
 
-fn tint_symbol([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : SB) {
+fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, value : SB) {
   tint_symbol_1(buffer, (offset + 0u), value.a);
   tint_symbol_2(buffer, (offset + 4u), value.b);
   tint_symbol_3(buffer, (offset + 8u), value.c);
@@ -970,7 +970,7 @@
   tint_symbol_22(buffer, (offset + 512u), value.v);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   tint_symbol(sb, 0u, SB());
 }
@@ -991,19 +991,19 @@
 
 struct S2 {
   a : i32;
-  b : [[stride(32)]] array<S1, 3>;
+  b : @stride(32) array<S1, 3>;
   c : i32;
 };
 
 struct SB {
-  [[size(128)]]
+  @size(128)
   a : i32;
-  b : [[stride(256)]] array<S2>;
+  b : @stride(256) array<S2>;
 };
 
-[[group(0), binding(0)]] var<storage, read_write> sb : SB;
+@group(0) @binding(0) var<storage, read_write> sb : SB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var x : f32 = sb.b[4].b[1].b.z;
 }
@@ -1025,22 +1025,22 @@
 
 struct S2 {
   a : i32;
-  b : [[stride(32)]] array<S1, 3>;
+  b : @stride(32) array<S1, 3>;
   c : i32;
 }
 
 struct SB {
-  [[size(128)]]
+  @size(128)
   a : i32;
-  b : [[stride(256)]] array<S2>;
+  b : @stride(256) array<S2>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb : SB;
+@group(0) @binding(0) var<storage, read_write> sb : SB;
 
-[[internal(intrinsic_load_storage_f32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> f32
+@internal(intrinsic_load_storage_f32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> f32
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var x : f32 = tint_symbol(sb, 1224u);
 }
@@ -1061,19 +1061,19 @@
 
 struct S2 {
   a : i32;
-  b : [[stride(32)]] array<S1, 3>;
+  b : @stride(32) array<S1, 3>;
   c : i32;
 };
 
 struct SB {
-  [[size(128)]]
+  @size(128)
   a : i32;
-  b : [[stride(256)]] array<S2>;
+  b : @stride(256) array<S2>;
 };
 
-[[group(0), binding(0)]] var<storage, read_write> sb : SB;
+@group(0) @binding(0) var<storage, read_write> sb : SB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var i : i32 = 4;
   var j : u32 = 1u;
@@ -1091,22 +1091,22 @@
 
 struct S2 {
   a : i32;
-  b : [[stride(32)]] array<S1, 3>;
+  b : @stride(32) array<S1, 3>;
   c : i32;
 }
 
 struct SB {
-  [[size(128)]]
+  @size(128)
   a : i32;
-  b : [[stride(256)]] array<S2>;
+  b : @stride(256) array<S2>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb : SB;
+@group(0) @binding(0) var<storage, read_write> sb : SB;
 
-[[internal(intrinsic_load_storage_f32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> f32
+@internal(intrinsic_load_storage_f32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> f32
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var i : i32 = 4;
   var j : u32 = 1u;
@@ -1130,7 +1130,7 @@
 
 type A1 = S1;
 
-type A1_Array = [[stride(32)]] array<S1, 3>;
+type A1_Array = @stride(32) array<S1, 3>;
 
 struct S2 {
   a : i32;
@@ -1140,17 +1140,17 @@
 
 type A2 = S2;
 
-type A2_Array = [[stride(256)]] array<S2>;
+type A2_Array = @stride(256) array<S2>;
 
 struct SB {
-  [[size(128)]]
+  @size(128)
   a : i32;
   b : A2_Array;
 };
 
-[[group(0), binding(0)]] var<storage, read_write> sb : SB;
+@group(0) @binding(0) var<storage, read_write> sb : SB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var i : i32 = 4;
   var j : u32 = 1u;
@@ -1168,7 +1168,7 @@
 
 type A1 = S1;
 
-type A1_Array = [[stride(32)]] array<S1, 3>;
+type A1_Array = @stride(32) array<S1, 3>;
 
 struct S2 {
   a : i32;
@@ -1178,20 +1178,20 @@
 
 type A2 = S2;
 
-type A2_Array = [[stride(256)]] array<S2>;
+type A2_Array = @stride(256) array<S2>;
 
 struct SB {
-  [[size(128)]]
+  @size(128)
   a : i32;
   b : A2_Array;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb : SB;
+@group(0) @binding(0) var<storage, read_write> sb : SB;
 
-[[internal(intrinsic_load_storage_f32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> f32
+@internal(intrinsic_load_storage_f32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> f32
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var i : i32 = 4;
   var j : u32 = 1u;
@@ -1213,9 +1213,9 @@
   b : atomic<u32>;
 };
 
-[[group(0), binding(0)]] var<storage, read_write> sb : SB;
+@group(0) @binding(0) var<storage, read_write> sb : SB;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   atomicStore(&sb.a, 123);
   atomicLoad(&sb.a);
@@ -1250,75 +1250,75 @@
   b : atomic<u32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb : SB;
+@group(0) @binding(0) var<storage, read_write> sb : SB;
 
-[[internal(intrinsic_atomic_store_storage_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, param_1 : i32)
+@internal(intrinsic_atomic_store_storage_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, param_1 : i32)
 
-[[internal(intrinsic_atomic_load_storage_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_1([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> i32
+@internal(intrinsic_atomic_load_storage_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_1(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> i32
 
-[[internal(intrinsic_atomic_add_storage_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_2([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, param_1 : i32) -> i32
+@internal(intrinsic_atomic_add_storage_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_2(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, param_1 : i32) -> i32
 
-[[internal(intrinsic_atomic_sub_storage_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_3([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, param_1 : i32) -> i32
+@internal(intrinsic_atomic_sub_storage_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_3(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, param_1 : i32) -> i32
 
-[[internal(intrinsic_atomic_max_storage_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_4([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, param_1 : i32) -> i32
+@internal(intrinsic_atomic_max_storage_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_4(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, param_1 : i32) -> i32
 
-[[internal(intrinsic_atomic_min_storage_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_5([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, param_1 : i32) -> i32
+@internal(intrinsic_atomic_min_storage_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_5(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, param_1 : i32) -> i32
 
-[[internal(intrinsic_atomic_and_storage_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_6([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, param_1 : i32) -> i32
+@internal(intrinsic_atomic_and_storage_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_6(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, param_1 : i32) -> i32
 
-[[internal(intrinsic_atomic_or_storage_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_7([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, param_1 : i32) -> i32
+@internal(intrinsic_atomic_or_storage_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_7(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, param_1 : i32) -> i32
 
-[[internal(intrinsic_atomic_xor_storage_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_8([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, param_1 : i32) -> i32
+@internal(intrinsic_atomic_xor_storage_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_8(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, param_1 : i32) -> i32
 
-[[internal(intrinsic_atomic_exchange_storage_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_9([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, param_1 : i32) -> i32
+@internal(intrinsic_atomic_exchange_storage_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_9(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, param_1 : i32) -> i32
 
-[[internal(intrinsic_atomic_compare_exchange_weak_storage_i32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_10([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, param_1 : i32, param_2 : i32) -> vec2<i32>
+@internal(intrinsic_atomic_compare_exchange_weak_storage_i32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_10(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, param_1 : i32, param_2 : i32) -> vec2<i32>
 
-[[internal(intrinsic_atomic_store_storage_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_11([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, param_1 : u32)
+@internal(intrinsic_atomic_store_storage_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_11(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, param_1 : u32)
 
-[[internal(intrinsic_atomic_load_storage_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_12([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> u32
+@internal(intrinsic_atomic_load_storage_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_12(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32) -> u32
 
-[[internal(intrinsic_atomic_add_storage_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_13([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, param_1 : u32) -> u32
+@internal(intrinsic_atomic_add_storage_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_13(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, param_1 : u32) -> u32
 
-[[internal(intrinsic_atomic_sub_storage_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_14([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, param_1 : u32) -> u32
+@internal(intrinsic_atomic_sub_storage_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_14(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, param_1 : u32) -> u32
 
-[[internal(intrinsic_atomic_max_storage_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_15([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, param_1 : u32) -> u32
+@internal(intrinsic_atomic_max_storage_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_15(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, param_1 : u32) -> u32
 
-[[internal(intrinsic_atomic_min_storage_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_16([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, param_1 : u32) -> u32
+@internal(intrinsic_atomic_min_storage_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_16(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, param_1 : u32) -> u32
 
-[[internal(intrinsic_atomic_and_storage_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_17([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, param_1 : u32) -> u32
+@internal(intrinsic_atomic_and_storage_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_17(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, param_1 : u32) -> u32
 
-[[internal(intrinsic_atomic_or_storage_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_18([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, param_1 : u32) -> u32
+@internal(intrinsic_atomic_or_storage_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_18(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, param_1 : u32) -> u32
 
-[[internal(intrinsic_atomic_xor_storage_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_19([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, param_1 : u32) -> u32
+@internal(intrinsic_atomic_xor_storage_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_19(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, param_1 : u32) -> u32
 
-[[internal(intrinsic_atomic_exchange_storage_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_20([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, param_1 : u32) -> u32
+@internal(intrinsic_atomic_exchange_storage_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_20(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, param_1 : u32) -> u32
 
-[[internal(intrinsic_atomic_compare_exchange_weak_storage_u32), internal(disable_validation__function_has_no_body)]]
-fn tint_symbol_21([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, param_1 : u32, param_2 : u32) -> vec2<u32>
+@internal(intrinsic_atomic_compare_exchange_weak_storage_u32) @internal(disable_validation__function_has_no_body)
+fn tint_symbol_21(@internal(disable_validation__ignore_constructible_function_parameter) buffer : SB, offset : u32, param_1 : u32, param_2 : u32) -> vec2<u32>
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   tint_symbol(sb, 16u, 123);
   tint_symbol_1(sb, 16u);
@@ -1360,7 +1360,7 @@
 
 var<workgroup> w : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   atomicStore(&(w.a), 123);
   atomicLoad(&(w.a));
diff --git a/src/transform/decompose_strided_matrix_test.cc b/src/transform/decompose_strided_matrix_test.cc
index db31c62..8561ccf 100644
--- a/src/transform/decompose_strided_matrix_test.cc
+++ b/src/transform/decompose_strided_matrix_test.cc
@@ -52,13 +52,13 @@
 
 TEST_F(DecomposeStridedMatrixTest, ReadUniformMatrix) {
   // struct S {
-  //   [[offset(16), stride(32)]]
-  //   [[internal(ignore_stride_decoration)]]
+  //   @offset(16) @stride(32)
+  //   @internal(ignore_stride_decoration)
   //   m : mat2x2<f32>;
   // };
-  // [[group(0), binding(0)]] var<uniform> s : S;
+  // @group(0) @binding(0) var<uniform> s : S;
   //
-  // [[stage(compute), workgroup_size(1)]]
+  // @stage(compute) @workgroup_size(1)
   // fn f() {
   //   let x : mat2x2<f32> = s.m;
   // }
@@ -88,18 +88,18 @@
 
   auto* expect = R"(
 struct S {
-  [[size(16)]]
+  @size(16)
   padding : u32;
-  m : [[stride(32)]] array<vec2<f32>, 2u>;
+  m : @stride(32) array<vec2<f32>, 2u>;
 }
 
-[[group(0), binding(0)]] var<uniform> s : S;
+@group(0) @binding(0) var<uniform> s : S;
 
-fn arr_to_mat2x2_stride_32(arr : [[stride(32)]] array<vec2<f32>, 2u>) -> mat2x2<f32> {
+fn arr_to_mat2x2_stride_32(arr : @stride(32) array<vec2<f32>, 2u>) -> mat2x2<f32> {
   return mat2x2<f32>(arr[0u], arr[1u]);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let x : mat2x2<f32> = arr_to_mat2x2_stride_32(s.m);
 }
@@ -113,13 +113,13 @@
 
 TEST_F(DecomposeStridedMatrixTest, ReadUniformColumn) {
   // struct S {
-  //   [[offset(16), stride(32)]]
-  //   [[internal(ignore_stride_decoration)]]
+  //   @offset(16) @stride(32)
+  //   @internal(ignore_stride_decoration)
   //   m : mat2x2<f32>;
   // };
-  // [[group(0), binding(0)]] var<uniform> s : S;
+  // @group(0) @binding(0) var<uniform> s : S;
   //
-  // [[stage(compute), workgroup_size(1)]]
+  // @stage(compute) @workgroup_size(1)
   // fn f() {
   //   let x : vec2<f32> = s.m[1];
   // }
@@ -149,14 +149,14 @@
 
   auto* expect = R"(
 struct S {
-  [[size(16)]]
+  @size(16)
   padding : u32;
-  m : [[stride(32)]] array<vec2<f32>, 2u>;
+  m : @stride(32) array<vec2<f32>, 2u>;
 }
 
-[[group(0), binding(0)]] var<uniform> s : S;
+@group(0) @binding(0) var<uniform> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let x : vec2<f32> = s.m[1];
 }
@@ -170,13 +170,13 @@
 
 TEST_F(DecomposeStridedMatrixTest, ReadUniformMatrix_DefaultStride) {
   // struct S {
-  //   [[offset(16), stride(8)]]
-  //   [[internal(ignore_stride_decoration)]]
+  //   @offset(16) @stride(8)
+  //   @internal(ignore_stride_decoration)
   //   m : mat2x2<f32>;
   // };
-  // [[group(0), binding(0)]] var<uniform> s : S;
+  // @group(0) @binding(0) var<uniform> s : S;
   //
-  // [[stage(compute), workgroup_size(1)]]
+  // @stage(compute) @workgroup_size(1)
   // fn f() {
   //   let x : mat2x2<f32> = s.m;
   // }
@@ -206,15 +206,15 @@
 
   auto* expect = R"(
 struct S {
-  [[size(16)]]
+  @size(16)
   padding : u32;
-  [[stride(8), internal(disable_validation__ignore_stride)]]
+  @stride(8) @internal(disable_validation__ignore_stride)
   m : mat2x2<f32>;
 }
 
-[[group(0), binding(0)]] var<uniform> s : S;
+@group(0) @binding(0) var<uniform> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let x : mat2x2<f32> = s.m;
 }
@@ -228,13 +228,13 @@
 
 TEST_F(DecomposeStridedMatrixTest, ReadStorageMatrix) {
   // struct S {
-  //   [[offset(8), stride(32)]]
-  //   [[internal(ignore_stride_decoration)]]
+  //   @offset(8) @stride(32)
+  //   @internal(ignore_stride_decoration)
   //   m : mat2x2<f32>;
   // };
-  // [[group(0), binding(0)]] var<storage, read_write> s : S;
+  // @group(0) @binding(0) var<storage, read_write> s : S;
   //
-  // [[stage(compute), workgroup_size(1)]]
+  // @stage(compute) @workgroup_size(1)
   // fn f() {
   //   let x : mat2x2<f32> = s.m;
   // }
@@ -264,18 +264,18 @@
 
   auto* expect = R"(
 struct S {
-  [[size(8)]]
+  @size(8)
   padding : u32;
-  m : [[stride(32)]] array<vec2<f32>, 2u>;
+  m : @stride(32) array<vec2<f32>, 2u>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> s : S;
+@group(0) @binding(0) var<storage, read_write> s : S;
 
-fn arr_to_mat2x2_stride_32(arr : [[stride(32)]] array<vec2<f32>, 2u>) -> mat2x2<f32> {
+fn arr_to_mat2x2_stride_32(arr : @stride(32) array<vec2<f32>, 2u>) -> mat2x2<f32> {
   return mat2x2<f32>(arr[0u], arr[1u]);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let x : mat2x2<f32> = arr_to_mat2x2_stride_32(s.m);
 }
@@ -289,13 +289,13 @@
 
 TEST_F(DecomposeStridedMatrixTest, ReadStorageColumn) {
   // struct S {
-  //   [[offset(16), stride(32)]]
-  //   [[internal(ignore_stride_decoration)]]
+  //   @offset(16) @stride(32)
+  //   @internal(ignore_stride_decoration)
   //   m : mat2x2<f32>;
   // };
-  // [[group(0), binding(0)]] var<storage, read_write> s : S;
+  // @group(0) @binding(0) var<storage, read_write> s : S;
   //
-  // [[stage(compute), workgroup_size(1)]]
+  // @stage(compute) @workgroup_size(1)
   // fn f() {
   //   let x : vec2<f32> = s.m[1];
   // }
@@ -325,14 +325,14 @@
 
   auto* expect = R"(
 struct S {
-  [[size(16)]]
+  @size(16)
   padding : u32;
-  m : [[stride(32)]] array<vec2<f32>, 2u>;
+  m : @stride(32) array<vec2<f32>, 2u>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> s : S;
+@group(0) @binding(0) var<storage, read_write> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let x : vec2<f32> = s.m[1];
 }
@@ -346,13 +346,13 @@
 
 TEST_F(DecomposeStridedMatrixTest, WriteStorageMatrix) {
   // struct S {
-  //   [[offset(8), stride(32)]]
-  //   [[internal(ignore_stride_decoration)]]
+  //   @offset(8) @stride(32)
+  //   @internal(ignore_stride_decoration)
   //   m : mat2x2<f32>;
   // };
-  // [[group(0), binding(0)]] var<storage, read_write> s : S;
+  // @group(0) @binding(0) var<storage, read_write> s : S;
   //
-  // [[stage(compute), workgroup_size(1)]]
+  // @stage(compute) @workgroup_size(1)
   // fn f() {
   //   s.m = mat2x2<f32>(vec2<f32>(1.0, 2.0), vec2<f32>(3.0, 4.0));
   // }
@@ -383,18 +383,18 @@
 
   auto* expect = R"(
 struct S {
-  [[size(8)]]
+  @size(8)
   padding : u32;
-  m : [[stride(32)]] array<vec2<f32>, 2u>;
+  m : @stride(32) array<vec2<f32>, 2u>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> s : S;
+@group(0) @binding(0) var<storage, read_write> s : S;
 
-fn mat2x2_stride_32_to_arr(mat : mat2x2<f32>) -> [[stride(32)]] array<vec2<f32>, 2u> {
-  return [[stride(32)]] array<vec2<f32>, 2u>(mat[0u], mat[1u]);
+fn mat2x2_stride_32_to_arr(mat : mat2x2<f32>) -> @stride(32) array<vec2<f32>, 2u> {
+  return @stride(32) array<vec2<f32>, 2u>(mat[0u], mat[1u]);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   s.m = mat2x2_stride_32_to_arr(mat2x2<f32>(vec2<f32>(1.0, 2.0), vec2<f32>(3.0, 4.0)));
 }
@@ -408,13 +408,13 @@
 
 TEST_F(DecomposeStridedMatrixTest, WriteStorageColumn) {
   // struct S {
-  //   [[offset(8), stride(32)]]
-  //   [[internal(ignore_stride_decoration)]]
+  //   @offset(8) @stride(32)
+  //   @internal(ignore_stride_decoration)
   //   m : mat2x2<f32>;
   // };
-  // [[group(0), binding(0)]] var<storage, read_write> s : S;
+  // @group(0) @binding(0) var<storage, read_write> s : S;
   //
-  // [[stage(compute), workgroup_size(1)]]
+  // @stage(compute) @workgroup_size(1)
   // fn f() {
   //   s.m[1] = vec2<f32>(1.0, 2.0);
   // }
@@ -444,14 +444,14 @@
 
   auto* expect = R"(
 struct S {
-  [[size(8)]]
+  @size(8)
   padding : u32;
-  m : [[stride(32)]] array<vec2<f32>, 2u>;
+  m : @stride(32) array<vec2<f32>, 2u>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> s : S;
+@group(0) @binding(0) var<storage, read_write> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   s.m[1] = vec2<f32>(1.0, 2.0);
 }
@@ -465,13 +465,13 @@
 
 TEST_F(DecomposeStridedMatrixTest, ReadWriteViaPointerLets) {
   // struct S {
-  //   [[offset(8), stride(32)]]
-  //   [[internal(ignore_stride_decoration)]]
+  //   @offset(8) @stride(32)
+  //   @internal(ignore_stride_decoration)
   //   m : mat2x2<f32>;
   // };
-  // [[group(0), binding(0)]] var<storage, read_write> s : S;
+  // @group(0) @binding(0) var<storage, read_write> s : S;
   //
-  // [[stage(compute), workgroup_size(1)]]
+  // @stage(compute) @workgroup_size(1)
   // fn f() {
   //   let a = &s.m;
   //   let b = &*&*(a);
@@ -516,22 +516,22 @@
 
   auto* expect = R"(
 struct S {
-  [[size(8)]]
+  @size(8)
   padding : u32;
-  m : [[stride(32)]] array<vec2<f32>, 2u>;
+  m : @stride(32) array<vec2<f32>, 2u>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> s : S;
+@group(0) @binding(0) var<storage, read_write> s : S;
 
-fn arr_to_mat2x2_stride_32(arr : [[stride(32)]] array<vec2<f32>, 2u>) -> mat2x2<f32> {
+fn arr_to_mat2x2_stride_32(arr : @stride(32) array<vec2<f32>, 2u>) -> mat2x2<f32> {
   return mat2x2<f32>(arr[0u], arr[1u]);
 }
 
-fn mat2x2_stride_32_to_arr(mat : mat2x2<f32>) -> [[stride(32)]] array<vec2<f32>, 2u> {
-  return [[stride(32)]] array<vec2<f32>, 2u>(mat[0u], mat[1u]);
+fn mat2x2_stride_32_to_arr(mat : mat2x2<f32>) -> @stride(32) array<vec2<f32>, 2u> {
+  return @stride(32) array<vec2<f32>, 2u>(mat[0u], mat[1u]);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let x = arr_to_mat2x2_stride_32(s.m);
   let y = s.m[1];
@@ -549,13 +549,13 @@
 
 TEST_F(DecomposeStridedMatrixTest, ReadPrivateMatrix) {
   // struct S {
-  //   [[offset(8), stride(32)]]
-  //   [[internal(ignore_stride_decoration)]]
+  //   @offset(8) @stride(32)
+  //   @internal(ignore_stride_decoration)
   //   m : mat2x2<f32>;
   // };
   // var<private> s : S;
   //
-  // [[stage(compute), workgroup_size(1)]]
+  // @stage(compute) @workgroup_size(1)
   // fn f() {
   //   let x : mat2x2<f32> = s.m;
   // }
@@ -584,15 +584,15 @@
 
   auto* expect = R"(
 struct S {
-  [[size(8)]]
+  @size(8)
   padding : u32;
-  [[stride(32), internal(disable_validation__ignore_stride)]]
+  @stride(32) @internal(disable_validation__ignore_stride)
   m : mat2x2<f32>;
 }
 
 var<private> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let x : mat2x2<f32> = s.m;
 }
@@ -606,13 +606,13 @@
 
 TEST_F(DecomposeStridedMatrixTest, WritePrivateMatrix) {
   // struct S {
-  //   [[offset(8), stride(32)]]
-  //   [[internal(ignore_stride_decoration)]]
+  //   @offset(8) @stride(32)
+  //   @internal(ignore_stride_decoration)
   //   m : mat2x2<f32>;
   // };
   // var<private> s : S;
   //
-  // [[stage(compute), workgroup_size(1)]]
+  // @stage(compute) @workgroup_size(1)
   // fn f() {
   //   s.m = mat2x2<f32>(vec2<f32>(1.0, 2.0), vec2<f32>(3.0, 4.0));
   // }
@@ -642,15 +642,15 @@
 
   auto* expect = R"(
 struct S {
-  [[size(8)]]
+  @size(8)
   padding : u32;
-  [[stride(32), internal(disable_validation__ignore_stride)]]
+  @stride(32) @internal(disable_validation__ignore_stride)
   m : mat2x2<f32>;
 }
 
 var<private> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   s.m = mat2x2<f32>(vec2<f32>(1.0, 2.0), vec2<f32>(3.0, 4.0));
 }
diff --git a/src/transform/external_texture_transform_test.cc b/src/transform/external_texture_transform_test.cc
index d9fef8f..28baadf 100644
--- a/src/transform/external_texture_transform_test.cc
+++ b/src/transform/external_texture_transform_test.cc
@@ -24,23 +24,23 @@
 
 TEST_F(ExternalTextureTransformTest, SampleLevelSinglePlane) {
   auto* src = R"(
-[[group(0), binding(0)]] var s : sampler;
+@group(0) @binding(0) var s : sampler;
 
-[[group(0), binding(1)]] var t : texture_external;
+@group(0) @binding(1) var t : texture_external;
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] coord : vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
   return textureSampleLevel(t, s, (coord.xy / vec2<f32>(4.0, 4.0)));
 }
 )";
 
   auto* expect = R"(
-[[group(0), binding(0)]] var s : sampler;
+@group(0) @binding(0) var s : sampler;
 
-[[group(0), binding(1)]] var t : texture_2d<f32>;
+@group(0) @binding(1) var t : texture_2d<f32>;
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] coord : vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
   return textureSampleLevel(t, s, (coord.xy / vec2<f32>(4.0, 4.0)), 0.0);
 }
 )";
@@ -52,19 +52,19 @@
 
 TEST_F(ExternalTextureTransformTest, LoadSinglePlane) {
   auto* src = R"(
-[[group(0), binding(0)]] var t : texture_external;
+@group(0) @binding(0) var t : texture_external;
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] coord : vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
   return textureLoad(t, vec2<i32>(1, 1));
 }
 )";
 
   auto* expect = R"(
-[[group(0), binding(0)]] var t : texture_2d<f32>;
+@group(0) @binding(0) var t : texture_2d<f32>;
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] coord : vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
   return textureLoad(t, vec2<i32>(1, 1), 0);
 }
 )";
@@ -76,10 +76,10 @@
 
 TEST_F(ExternalTextureTransformTest, DimensionsSinglePlane) {
   auto* src = R"(
-[[group(0), binding(0)]] var t : texture_external;
+@group(0) @binding(0) var t : texture_external;
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] coord : vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
   var dim : vec2<i32>;
   dim = textureDimensions(t);
   return vec4<f32>(0.0, 0.0, 0.0, 0.0);
@@ -87,10 +87,10 @@
 )";
 
   auto* expect = R"(
-[[group(0), binding(0)]] var t : texture_2d<f32>;
+@group(0) @binding(0) var t : texture_2d<f32>;
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] coord : vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
   var dim : vec2<i32>;
   dim = textureDimensions(t);
   return vec4<f32>(0.0, 0.0, 0.0, 0.0);
diff --git a/src/transform/first_index_offset.h b/src/transform/first_index_offset.h
index ffbb138..a885581 100644
--- a/src/transform/first_index_offset.h
+++ b/src/transform/first_index_offset.h
@@ -35,24 +35,28 @@
 /// Therefore, these values must by passed to the shader.
 ///
 /// Before:
-///   [[builtin(vertex_index)]] var<in> vert_idx : u32;
+/// ```
+///   @builtin(vertex_index) var<in> vert_idx : u32;
 ///   fn func() -> u32 {
 ///     return vert_idx;
 ///   }
+/// ```
 ///
 /// After:
+/// ```
 ///   struct TintFirstIndexOffsetData {
 ///     tint_first_vertex_index : u32;
 ///     tint_first_instance_index : u32;
 ///   };
-///   [[builtin(vertex_index)]] var<in> tint_first_index_offset_vert_idx : u32;
-///   [[binding(N), group(M)]] var<uniform> tint_first_index_data :
+///   @builtin(vertex_index) var<in> tint_first_index_offset_vert_idx : u32;
+///   @binding(N) @group(M) var<uniform> tint_first_index_data :
 ///                                                    TintFirstIndexOffsetData;
 ///   fn func() -> u32 {
 ///     const vert_idx = (tint_first_index_offset_vert_idx +
 ///                       tint_first_index_data.tint_first_vertex_index);
 ///     return vert_idx;
 ///   }
+/// ```
 ///
 class FirstIndexOffset : public Castable<FirstIndexOffset, Transform> {
  public:
@@ -71,9 +75,9 @@
     /// Destructor
     ~BindingPoint() override;
 
-    /// [[binding()]] for the first vertex / first instance uniform buffer
+    /// `@binding()` for the first vertex / first instance uniform buffer
     uint32_t binding = 0;
-    /// [[group()]] for the first vertex / first instance uniform buffer
+    /// `@group()` for the first vertex / first instance uniform buffer
     uint32_t group = 0;
   };
 
diff --git a/src/transform/first_index_offset_test.cc b/src/transform/first_index_offset_test.cc
index 6368d29..c0c95f6 100644
--- a/src/transform/first_index_offset_test.cc
+++ b/src/transform/first_index_offset_test.cc
@@ -51,8 +51,8 @@
   return vert_idx;
 }
 
-[[stage(vertex)]]
-fn entry([[builtin(vertex_index)]] vert_idx : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn entry(@builtin(vertex_index) vert_idx : u32) -> @builtin(position) vec4<f32> {
   test(vert_idx);
   return vec4<f32>();
 }
@@ -63,14 +63,14 @@
   first_vertex_index : u32;
 }
 
-[[binding(1), group(2)]] var<uniform> tint_symbol_1 : tint_symbol;
+@binding(1) @group(2) var<uniform> tint_symbol_1 : tint_symbol;
 
 fn test(vert_idx : u32) -> u32 {
   return vert_idx;
 }
 
-[[stage(vertex)]]
-fn entry([[builtin(vertex_index)]] vert_idx : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn entry(@builtin(vertex_index) vert_idx : u32) -> @builtin(position) vec4<f32> {
   test((vert_idx + tint_symbol_1.first_vertex_index));
   return vec4<f32>();
 }
@@ -97,8 +97,8 @@
   return inst_idx;
 }
 
-[[stage(vertex)]]
-fn entry([[builtin(instance_index)]] inst_idx : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn entry(@builtin(instance_index) inst_idx : u32) -> @builtin(position) vec4<f32> {
   test(inst_idx);
   return vec4<f32>();
 }
@@ -109,14 +109,14 @@
   first_instance_index : u32;
 }
 
-[[binding(1), group(7)]] var<uniform> tint_symbol_1 : tint_symbol;
+@binding(1) @group(7) var<uniform> tint_symbol_1 : tint_symbol;
 
 fn test(inst_idx : u32) -> u32 {
   return inst_idx;
 }
 
-[[stage(vertex)]]
-fn entry([[builtin(instance_index)]] inst_idx : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn entry(@builtin(instance_index) inst_idx : u32) -> @builtin(position) vec4<f32> {
   test((inst_idx + tint_symbol_1.first_instance_index));
   return vec4<f32>();
 }
@@ -144,12 +144,12 @@
 }
 
 struct Inputs {
-  [[builtin(instance_index)]] instance_idx : u32;
-  [[builtin(vertex_index)]] vert_idx : u32;
+  @builtin(instance_index) instance_idx : u32;
+  @builtin(vertex_index) vert_idx : u32;
 };
 
-[[stage(vertex)]]
-fn entry(inputs : Inputs) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn entry(inputs : Inputs) -> @builtin(position) vec4<f32> {
   test(inputs.instance_idx, inputs.vert_idx);
   return vec4<f32>();
 }
@@ -161,21 +161,21 @@
   first_instance_index : u32;
 }
 
-[[binding(1), group(2)]] var<uniform> tint_symbol_1 : tint_symbol;
+@binding(1) @group(2) var<uniform> tint_symbol_1 : tint_symbol;
 
 fn test(instance_idx : u32, vert_idx : u32) -> u32 {
   return (instance_idx + vert_idx);
 }
 
 struct Inputs {
-  [[builtin(instance_index)]]
+  @builtin(instance_index)
   instance_idx : u32;
-  [[builtin(vertex_index)]]
+  @builtin(vertex_index)
   vert_idx : u32;
 }
 
-[[stage(vertex)]]
-fn entry(inputs : Inputs) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn entry(inputs : Inputs) -> @builtin(position) vec4<f32> {
   test((inputs.instance_idx + tint_symbol_1.first_instance_index), (inputs.vert_idx + tint_symbol_1.first_vertex_index));
   return vec4<f32>();
 }
@@ -206,8 +206,8 @@
   return func1(vert_idx);
 }
 
-[[stage(vertex)]]
-fn entry([[builtin(vertex_index)]] vert_idx : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn entry(@builtin(vertex_index) vert_idx : u32) -> @builtin(position) vec4<f32> {
   func2(vert_idx);
   return vec4<f32>();
 }
@@ -218,7 +218,7 @@
   first_vertex_index : u32;
 }
 
-[[binding(1), group(2)]] var<uniform> tint_symbol_1 : tint_symbol;
+@binding(1) @group(2) var<uniform> tint_symbol_1 : tint_symbol;
 
 fn func1(vert_idx : u32) -> u32 {
   return vert_idx;
@@ -228,8 +228,8 @@
   return func1(vert_idx);
 }
 
-[[stage(vertex)]]
-fn entry([[builtin(vertex_index)]] vert_idx : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn entry(@builtin(vertex_index) vert_idx : u32) -> @builtin(position) vec4<f32> {
   func2((vert_idx + tint_symbol_1.first_vertex_index));
   return vec4<f32>();
 }
@@ -256,20 +256,20 @@
   return i;
 }
 
-[[stage(vertex)]]
-fn entry_a([[builtin(vertex_index)]] vert_idx : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn entry_a(@builtin(vertex_index) vert_idx : u32) -> @builtin(position) vec4<f32> {
   func(vert_idx);
   return vec4<f32>();
 }
 
-[[stage(vertex)]]
-fn entry_b([[builtin(vertex_index)]] vert_idx : u32, [[builtin(instance_index)]] inst_idx : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn entry_b(@builtin(vertex_index) vert_idx : u32, @builtin(instance_index) inst_idx : u32) -> @builtin(position) vec4<f32> {
   func(vert_idx + inst_idx);
   return vec4<f32>();
 }
 
-[[stage(vertex)]]
-fn entry_c([[builtin(instance_index)]] inst_idx : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn entry_c(@builtin(instance_index) inst_idx : u32) -> @builtin(position) vec4<f32> {
   func(inst_idx);
   return vec4<f32>();
 }
@@ -281,26 +281,26 @@
   first_instance_index : u32;
 }
 
-[[binding(1), group(2)]] var<uniform> tint_symbol_1 : tint_symbol;
+@binding(1) @group(2) var<uniform> tint_symbol_1 : tint_symbol;
 
 fn func(i : u32) -> u32 {
   return i;
 }
 
-[[stage(vertex)]]
-fn entry_a([[builtin(vertex_index)]] vert_idx : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn entry_a(@builtin(vertex_index) vert_idx : u32) -> @builtin(position) vec4<f32> {
   func((vert_idx + tint_symbol_1.first_vertex_index));
   return vec4<f32>();
 }
 
-[[stage(vertex)]]
-fn entry_b([[builtin(vertex_index)]] vert_idx : u32, [[builtin(instance_index)]] inst_idx : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn entry_b(@builtin(vertex_index) vert_idx : u32, @builtin(instance_index) inst_idx : u32) -> @builtin(position) vec4<f32> {
   func(((vert_idx + tint_symbol_1.first_vertex_index) + (inst_idx + tint_symbol_1.first_instance_index)));
   return vec4<f32>();
 }
 
-[[stage(vertex)]]
-fn entry_c([[builtin(instance_index)]] inst_idx : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn entry_c(@builtin(instance_index) inst_idx : u32) -> @builtin(position) vec4<f32> {
   func((inst_idx + tint_symbol_1.first_instance_index));
   return vec4<f32>();
 }
diff --git a/src/transform/glsl_test.cc b/src/transform/glsl_test.cc
index b280e33..49b0dfd 100644
--- a/src/transform/glsl_test.cc
+++ b/src/transform/glsl_test.cc
@@ -26,7 +26,7 @@
   auto* src = R"()";
 
   auto* expect = R"(
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn unused_entry_point() {
 }
 )";
diff --git a/src/transform/localize_struct_array_assignment_test.cc b/src/transform/localize_struct_array_assignment_test.cc
index 2b3b0c9..878a89c 100644
--- a/src/transform/localize_struct_array_assignment_test.cc
+++ b/src/transform/localize_struct_array_assignment_test.cc
@@ -44,7 +44,7 @@
 
 TEST_F(LocalizeStructArrayAssignmentTest, StructArray) {
   auto* src = R"(
-[[block]] struct Uniforms {
+@block struct Uniforms {
   i : u32;
 };
 
@@ -56,9 +56,9 @@
   a1 : array<InnerS, 8>;
 };
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s1 : OuterS;
@@ -67,7 +67,7 @@
 )";
 
   auto* expect = R"(
-[[block]]
+@block
 struct Uniforms {
   i : u32;
 }
@@ -80,9 +80,9 @@
   a1 : array<InnerS, 8>;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s1 : OuterS;
@@ -102,7 +102,7 @@
 
 TEST_F(LocalizeStructArrayAssignmentTest, StructStructArray) {
   auto* src = R"(
-[[block]] struct Uniforms {
+@block struct Uniforms {
   i : u32;
 };
 
@@ -118,9 +118,9 @@
   s2 : S1;
 };
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s1 : OuterS;
@@ -129,7 +129,7 @@
 )";
 
   auto* expect = R"(
-[[block]]
+@block
 struct Uniforms {
   i : u32;
 }
@@ -146,9 +146,9 @@
   s2 : S1;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s1 : OuterS;
@@ -168,7 +168,7 @@
 
 TEST_F(LocalizeStructArrayAssignmentTest, StructArrayArray) {
   auto* src = R"(
-[[block]] struct Uniforms {
+@block struct Uniforms {
   i : u32;
   j : u32;
 };
@@ -181,9 +181,9 @@
   a1 : array<array<InnerS, 8>, 8>;
 };
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s1 : OuterS;
@@ -192,7 +192,7 @@
 )";
 
   auto* expect = R"(
-[[block]]
+@block
 struct Uniforms {
   i : u32;
   j : u32;
@@ -206,9 +206,9 @@
   a1 : array<array<InnerS, 8>, 8>;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s1 : OuterS;
@@ -228,7 +228,7 @@
 
 TEST_F(LocalizeStructArrayAssignmentTest, StructArrayStruct) {
   auto* src = R"(
-[[block]] struct Uniforms {
+@block struct Uniforms {
   i : u32;
 };
 
@@ -244,9 +244,9 @@
   a1 : array<S1, 8>;
 };
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s1 : OuterS;
@@ -255,7 +255,7 @@
 )";
 
   auto* expect = R"(
-[[block]]
+@block
 struct Uniforms {
   i : u32;
 }
@@ -272,9 +272,9 @@
   a1 : array<S1, 8>;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s1 : OuterS;
@@ -294,7 +294,7 @@
 
 TEST_F(LocalizeStructArrayAssignmentTest, StructArrayStructArray) {
   auto* src = R"(
-[[block]] struct Uniforms {
+@block struct Uniforms {
   i : u32;
   j : u32;
 };
@@ -311,9 +311,9 @@
   a1 : array<S1, 8>;
 };
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s : OuterS;
@@ -322,7 +322,7 @@
 )";
 
   auto* expect = R"(
-[[block]]
+@block
 struct Uniforms {
   i : u32;
   j : u32;
@@ -340,9 +340,9 @@
   a1 : array<S1, 8>;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s : OuterS;
@@ -365,7 +365,7 @@
 
 TEST_F(LocalizeStructArrayAssignmentTest, IndexingWithSideEffectFunc) {
   auto* src = R"(
-[[block]] struct Uniforms {
+@block struct Uniforms {
   i : u32;
   j : u32;
 };
@@ -388,9 +388,9 @@
   return nextIndex;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s : OuterS;
@@ -399,7 +399,7 @@
 )";
 
   auto* expect = R"(
-[[block]]
+@block
 struct Uniforms {
   i : u32;
   j : u32;
@@ -424,9 +424,9 @@
   return nextIndex;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s : OuterS;
@@ -449,7 +449,7 @@
 
 TEST_F(LocalizeStructArrayAssignmentTest, ViaPointerArg) {
   auto* src = R"(
-[[block]] struct Uniforms {
+@block struct Uniforms {
   i : u32;
 };
 struct InnerS {
@@ -458,14 +458,14 @@
 struct OuterS {
   a1 : array<InnerS, 8>;
 };
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
 fn f(p : ptr<function, OuterS>) {
   var v : InnerS;
   (*p).a1[uniforms.i] = v;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var s1 : OuterS;
   f(&s1);
@@ -473,7 +473,7 @@
 )";
 
   auto* expect = R"(
-[[block]]
+@block
 struct Uniforms {
   i : u32;
 }
@@ -486,7 +486,7 @@
   a1 : array<InnerS, 8>;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
 fn f(p : ptr<function, OuterS>) {
   var v : InnerS;
@@ -498,7 +498,7 @@
   }
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var s1 : OuterS;
   f(&(s1));
@@ -512,7 +512,7 @@
 
 TEST_F(LocalizeStructArrayAssignmentTest, ViaPointerVar) {
   auto* src = R"(
-[[block]]
+@block
 struct Uniforms {
   i : u32;
 };
@@ -525,13 +525,13 @@
   a1 : array<InnerS, 8>;
 };
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
 fn f(p : ptr<function, InnerS>, v : InnerS) {
   *(p) = v;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s1 : OuterS;
@@ -541,7 +541,7 @@
 )";
 
   auto* expect = R"(
-[[block]]
+@block
 struct Uniforms {
   i : u32;
 }
@@ -554,13 +554,13 @@
   a1 : array<InnerS, 8>;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
 fn f(p : ptr<function, InnerS>, v : InnerS) {
   *(p) = v;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s1 : OuterS;
@@ -581,23 +581,23 @@
 
 TEST_F(LocalizeStructArrayAssignmentTest, VectorAssignment) {
   auto* src = R"(
-[[block]]
+@block
 struct Uniforms {
   i : u32;
 }
 
-[[block]]
+@block
 struct OuterS {
   a1 : array<u32, 8>;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
 fn f(i : u32) -> u32 {
   return (i + 1u);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var s1 : OuterS;
   var v : vec3<f32>;
diff --git a/src/transform/module_scope_var_to_entry_point_param.h b/src/transform/module_scope_var_to_entry_point_param.h
index 34db3e6..29132c8 100644
--- a/src/transform/module_scope_var_to_entry_point_param.h
+++ b/src/transform/module_scope_var_to_entry_point_param.h
@@ -36,7 +36,7 @@
 /// struct S {
 ///   f : f32;
 /// };
-/// [[binding(0), group(0)]]
+/// @binding(0) @group(0)
 /// var<storage, read> s : S;
 /// var<private> p : f32 = 2.0;
 ///
@@ -44,7 +44,7 @@
 ///   p = p + f;
 /// }
 ///
-/// [[stage(compute), workgroup_size(1)]]
+/// @stage(compute) @workgroup_size(1)
 /// fn main() {
 ///   foo();
 /// }
@@ -56,7 +56,7 @@
 ///   *p = *p + (*sptr).f;
 /// }
 ///
-/// [[stage(compute), workgroup_size(1)]]
+/// @stage(compute) @workgroup_size(1)
 /// fn main(sptr : ptr<storage, S, read>) {
 ///   var<private> p : f32 = 2.0;
 ///   foo(&p, sptr);
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 ffbd635..d8b0f63 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
@@ -29,17 +29,17 @@
 var<private> p : f32;
 var<workgroup> w : f32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   w = p;
 }
 )";
 
   auto* expect = R"(
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
-  [[internal(disable_validation__ignore_storage_class)]] var<workgroup> tint_symbol : f32;
-  [[internal(disable_validation__ignore_storage_class)]] var<private> tint_symbol_1 : f32;
+  @internal(disable_validation__ignore_storage_class) var<workgroup> tint_symbol : f32;
+  @internal(disable_validation__ignore_storage_class) var<private> tint_symbol_1 : f32;
   tint_symbol = tint_symbol_1;
 }
 )";
@@ -68,7 +68,7 @@
   no_uses();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   foo(1.0);
 }
@@ -78,21 +78,21 @@
 fn no_uses() {
 }
 
-fn bar(a : f32, b : f32, [[internal(disable_validation__ignore_storage_class), internal(disable_validation__ignore_invalid_pointer_argument)]] tint_symbol : ptr<private, f32>, [[internal(disable_validation__ignore_storage_class), internal(disable_validation__ignore_invalid_pointer_argument)]] tint_symbol_1 : ptr<workgroup, f32>) {
+fn bar(a : f32, b : f32, @internal(disable_validation__ignore_storage_class) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol : ptr<private, f32>, @internal(disable_validation__ignore_storage_class) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol_1 : ptr<workgroup, f32>) {
   *(tint_symbol) = a;
   *(tint_symbol_1) = b;
 }
 
-fn foo(a : f32, [[internal(disable_validation__ignore_storage_class), internal(disable_validation__ignore_invalid_pointer_argument)]] tint_symbol_2 : ptr<private, f32>, [[internal(disable_validation__ignore_storage_class), internal(disable_validation__ignore_invalid_pointer_argument)]] tint_symbol_3 : ptr<workgroup, f32>) {
+fn foo(a : f32, @internal(disable_validation__ignore_storage_class) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol_2 : ptr<private, f32>, @internal(disable_validation__ignore_storage_class) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol_3 : ptr<workgroup, f32>) {
   let b : f32 = 2.0;
   bar(a, b, tint_symbol_2, tint_symbol_3);
   no_uses();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
-  [[internal(disable_validation__ignore_storage_class)]] var<private> tint_symbol_4 : f32;
-  [[internal(disable_validation__ignore_storage_class)]] var<workgroup> tint_symbol_5 : f32;
+  @internal(disable_validation__ignore_storage_class) var<private> tint_symbol_4 : f32;
+  @internal(disable_validation__ignore_storage_class) var<workgroup> tint_symbol_5 : f32;
   foo(1.0, &(tint_symbol_4), &(tint_symbol_5));
 }
 )";
@@ -107,17 +107,17 @@
 var<private> a : f32 = 1.0;
 var<private> b : f32 = f32();
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x : f32 = a + b;
 }
 )";
 
   auto* expect = R"(
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
-  [[internal(disable_validation__ignore_storage_class)]] var<private> tint_symbol : f32 = 1.0;
-  [[internal(disable_validation__ignore_storage_class)]] var<private> tint_symbol_1 : f32 = f32();
+  @internal(disable_validation__ignore_storage_class) var<private> tint_symbol : f32 = 1.0;
+  @internal(disable_validation__ignore_storage_class) var<private> tint_symbol_1 : f32 = f32();
   let x : f32 = (tint_symbol + tint_symbol_1);
 }
 )";
@@ -132,7 +132,7 @@
 var<private> p : f32;
 var<workgroup> w : f32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let p_ptr : ptr<private, f32> = &p;
   let w_ptr : ptr<workgroup, f32> = &w;
@@ -142,10 +142,10 @@
 )";
 
   auto* expect = R"(
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
-  [[internal(disable_validation__ignore_storage_class)]] var<private> tint_symbol : f32;
-  [[internal(disable_validation__ignore_storage_class)]] var<workgroup> tint_symbol_1 : f32;
+  @internal(disable_validation__ignore_storage_class) var<private> tint_symbol : f32;
+  @internal(disable_validation__ignore_storage_class) var<workgroup> tint_symbol_1 : f32;
   let p_ptr : ptr<private, f32> = &(tint_symbol);
   let w_ptr : ptr<workgroup, f32> = &(tint_symbol_1);
   let x : f32 = (*(p_ptr) + *(w_ptr));
@@ -170,7 +170,7 @@
   bar(&v);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   foo();
 }
@@ -181,13 +181,13 @@
   *(p) = 0.0;
 }
 
-fn foo([[internal(disable_validation__ignore_storage_class), internal(disable_validation__ignore_invalid_pointer_argument)]] tint_symbol : ptr<private, f32>) {
+fn foo(@internal(disable_validation__ignore_storage_class) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol : ptr<private, f32>) {
   bar(tint_symbol);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
-  [[internal(disable_validation__ignore_storage_class)]] var<private> tint_symbol_1 : f32;
+  @internal(disable_validation__ignore_storage_class) var<private> tint_symbol_1 : f32;
   foo(&(tint_symbol_1));
 }
 )";
@@ -203,12 +203,12 @@
   a : f32;
 };
 
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u : S;
-[[group(0), binding(1)]]
+@group(0) @binding(1)
 var<storage> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = u;
   _ = s;
@@ -220,8 +220,8 @@
   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>) {
+@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>) {
   _ = *(tint_symbol);
   _ = *(tint_symbol_1);
 }
@@ -234,10 +234,10 @@
 
 TEST_F(ModuleScopeVarToEntryPointParamTest, Buffer_RuntimeArray) {
   auto* src = R"(
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<storage> buffer : array<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = buffer[0];
 }
@@ -248,8 +248,8 @@
   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>) {
+@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>) {
   _ = (*(tint_symbol)).arr[0];
 }
 )";
@@ -261,14 +261,14 @@
 
 TEST_F(ModuleScopeVarToEntryPointParamTest, Buffer_RuntimeArrayInsideFunction) {
   auto* src = R"(
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<storage> buffer : array<f32>;
 
 fn foo() {
   _ = buffer[0];
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   foo();
 }
@@ -279,12 +279,12 @@
   arr : array<f32>;
 }
 
-fn foo([[internal(disable_validation__ignore_storage_class), internal(disable_validation__ignore_invalid_pointer_argument)]] tint_symbol : ptr<storage, array<f32>>) {
+fn foo(@internal(disable_validation__ignore_storage_class) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol : ptr<storage, array<f32>>) {
   _ = (*(tint_symbol))[0];
 }
 
-[[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_1 : ptr<storage, tint_symbol_2>) {
+@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_1 : ptr<storage, tint_symbol_2>) {
   foo(&((*(tint_symbol_1)).arr));
 }
 )";
@@ -298,10 +298,10 @@
   auto* src = R"(
 type myarray = array<f32>;
 
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<storage> buffer : myarray;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = buffer[0];
 }
@@ -314,8 +314,8 @@
 
 type myarray = 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>) {
+@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>) {
   _ = (*(tint_symbol)).arr[0];
 }
 )";
@@ -331,10 +331,10 @@
   f : f32;
 };
 
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<storage> buffer : array<S>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = buffer[0];
 }
@@ -349,8 +349,8 @@
   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>) {
+@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>) {
   _ = (*(tint_symbol)).arr[0];
 }
 )";
@@ -366,9 +366,9 @@
   a : f32;
 };
 
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u : S;
-[[group(0), binding(1)]]
+@group(0) @binding(1)
 var<storage> s : S;
 
 fn no_uses() {
@@ -386,7 +386,7 @@
   no_uses();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   foo(1.0);
 }
@@ -400,20 +400,20 @@
 fn no_uses() {
 }
 
-fn bar(a : f32, b : f32, [[internal(disable_validation__ignore_storage_class), internal(disable_validation__ignore_invalid_pointer_argument)]] tint_symbol : ptr<uniform, S>, [[internal(disable_validation__ignore_storage_class), internal(disable_validation__ignore_invalid_pointer_argument)]] tint_symbol_1 : ptr<storage, S>) {
+fn bar(a : f32, b : f32, @internal(disable_validation__ignore_storage_class) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol : ptr<uniform, S>, @internal(disable_validation__ignore_storage_class) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol_1 : ptr<storage, S>) {
   _ = *(tint_symbol);
   _ = *(tint_symbol_1);
 }
 
-fn foo(a : f32, [[internal(disable_validation__ignore_storage_class), internal(disable_validation__ignore_invalid_pointer_argument)]] tint_symbol_2 : ptr<uniform, S>, [[internal(disable_validation__ignore_storage_class), internal(disable_validation__ignore_invalid_pointer_argument)]] tint_symbol_3 : ptr<storage, S>) {
+fn foo(a : f32, @internal(disable_validation__ignore_storage_class) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol_2 : ptr<uniform, S>, @internal(disable_validation__ignore_storage_class) @internal(disable_validation__ignore_invalid_pointer_argument) tint_symbol_3 : ptr<storage, S>) {
   let b : f32 = 2.0;
   _ = *(tint_symbol_2);
   bar(a, b, tint_symbol_2, tint_symbol_3);
   no_uses();
 }
 
-[[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_4 : ptr<uniform, S>, [[group(0), binding(1), internal(disable_validation__entry_point_parameter), internal(disable_validation__ignore_storage_class)]] tint_symbol_5 : ptr<storage, 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_4 : ptr<uniform, S>, @group(0) @binding(1) @internal(disable_validation__entry_point_parameter) @internal(disable_validation__ignore_storage_class) tint_symbol_5 : ptr<storage, S>) {
   foo(1.0, tint_symbol_4, tint_symbol_5);
 }
 )";
@@ -425,10 +425,10 @@
 
 TEST_F(ModuleScopeVarToEntryPointParamTest, HandleTypes_Basic) {
   auto* src = R"(
-[[group(0), binding(0)]] var t : texture_2d<f32>;
-[[group(0), binding(1)]] var s : sampler;
+@group(0) @binding(0) var t : texture_2d<f32>;
+@group(0) @binding(1) var s : sampler;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t;
   _ = s;
@@ -436,8 +436,8 @@
 )";
 
   auto* expect = R"(
-[[stage(compute), workgroup_size(1)]]
-fn main([[group(0), binding(0), internal(disable_validation__entry_point_parameter)]] tint_symbol : texture_2d<f32>, [[group(0), binding(1), internal(disable_validation__entry_point_parameter)]] tint_symbol_1 : sampler) {
+@stage(compute) @workgroup_size(1)
+fn main(@group(0) @binding(0) @internal(disable_validation__entry_point_parameter) tint_symbol : texture_2d<f32>, @group(0) @binding(1) @internal(disable_validation__entry_point_parameter) tint_symbol_1 : sampler) {
   _ = tint_symbol;
   _ = tint_symbol_1;
 }
@@ -450,8 +450,8 @@
 
 TEST_F(ModuleScopeVarToEntryPointParamTest, HandleTypes_FunctionCalls) {
   auto* src = R"(
-[[group(0), binding(0)]] var t : texture_2d<f32>;
-[[group(0), binding(1)]] var s : sampler;
+@group(0) @binding(0) var t : texture_2d<f32>;
+@group(0) @binding(1) var s : sampler;
 
 fn no_uses() {
 }
@@ -468,7 +468,7 @@
   no_uses();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   foo(1.0);
 }
@@ -490,8 +490,8 @@
   no_uses();
 }
 
-[[stage(compute), workgroup_size(1)]]
-fn main([[group(0), binding(0), internal(disable_validation__entry_point_parameter)]] tint_symbol_4 : texture_2d<f32>, [[group(0), binding(1), internal(disable_validation__entry_point_parameter)]] tint_symbol_5 : sampler) {
+@stage(compute) @workgroup_size(1)
+fn main(@group(0) @binding(0) @internal(disable_validation__entry_point_parameter) tint_symbol_4 : texture_2d<f32>, @group(0) @binding(1) @internal(disable_validation__entry_point_parameter) tint_symbol_5 : sampler) {
   foo(1.0, tint_symbol_4, tint_symbol_5);
 }
 )";
@@ -505,7 +505,7 @@
   auto* src = R"(
 var<workgroup> m : mat2x2<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = m;
 }
@@ -516,8 +516,8 @@
   m : mat2x2<f32>;
 }
 
-[[stage(compute), workgroup_size(1)]]
-fn main([[internal(disable_validation__entry_point_parameter)]] tint_symbol_1 : ptr<workgroup, tint_symbol_2>) {
+@stage(compute) @workgroup_size(1)
+fn main(@internal(disable_validation__entry_point_parameter) tint_symbol_1 : ptr<workgroup, tint_symbol_2>) {
   let tint_symbol : ptr<workgroup, mat2x2<f32>> = &((*(tint_symbol_1)).m);
   let x = *(tint_symbol);
 }
@@ -538,7 +538,7 @@
 };
 var<workgroup> m : array<S2, 4>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = m;
 }
@@ -557,8 +557,8 @@
   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>) {
+@stage(compute) @workgroup_size(1)
+fn main(@internal(disable_validation__entry_point_parameter) tint_symbol_1 : ptr<workgroup, tint_symbol_2>) {
   let tint_symbol : ptr<workgroup, array<S2, 4u>> = &((*(tint_symbol_1)).m);
   let x = *(tint_symbol);
 }
@@ -581,7 +581,7 @@
 
 var<workgroup> b : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = a;
   let y = b;
@@ -598,8 +598,8 @@
   b : S;
 }
 
-[[stage(compute), workgroup_size(1)]]
-fn main([[internal(disable_validation__entry_point_parameter)]] tint_symbol_1 : ptr<workgroup, tint_symbol_3>) {
+@stage(compute) @workgroup_size(1)
+fn main(@internal(disable_validation__entry_point_parameter) tint_symbol_1 : ptr<workgroup, tint_symbol_3>) {
   let tint_symbol : ptr<workgroup, S> = &((*(tint_symbol_1)).a);
   let tint_symbol_2 : ptr<workgroup, S> = &((*(tint_symbol_1)).b);
   let x = *(tint_symbol);
@@ -621,15 +621,15 @@
 var<private> p : f32;
 var<workgroup> w : f32;
 
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> ub : S;
-[[group(0), binding(1)]]
+@group(0) @binding(1)
 var<storage> sb : S;
 
-[[group(0), binding(2)]] var t : texture_2d<f32>;
-[[group(0), binding(3)]] var s : sampler;
+@group(0) @binding(2) var t : texture_2d<f32>;
+@group(0) @binding(3) var s : sampler;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
 }
 )";
@@ -639,7 +639,7 @@
   a : f32;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@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 e4c1d55..be8137a 100644
--- a/src/transform/multiplanar_external_texture_test.cc
+++ b/src/transform/multiplanar_external_texture_test.cc
@@ -25,11 +25,11 @@
 // result in an error.
 TEST_F(MultiplanarExternalTextureTest, ErrorNoPassedData) {
   auto* src = R"(
-[[group(0), binding(0)]] var s : sampler;
-[[group(0), binding(1)]] var ext_tex : texture_external;
+@group(0) @binding(0) var s : sampler;
+@group(0) @binding(1) var ext_tex : texture_external;
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] coord : vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
   return textureSampleLevel(ext_tex, s, coord.xy);
 }
 )";
@@ -43,11 +43,11 @@
 // Running the transform with incorrect binding data should result in an error.
 TEST_F(MultiplanarExternalTextureTest, ErrorIncorrectBindingPont) {
   auto* src = R"(
-[[group(0), binding(0)]] var s : sampler;
-[[group(0), binding(1)]] var ext_tex : texture_external;
+@group(0) @binding(0) var s : sampler;
+@group(0) @binding(1) var ext_tex : texture_external;
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] coord : vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
   return textureSampleLevel(ext_tex, s, coord.xy);
 }
 )";
@@ -67,10 +67,10 @@
 // Tests that the transform works with a textureDimensions call.
 TEST_F(MultiplanarExternalTextureTest, Dimensions) {
   auto* src = R"(
-[[group(0), binding(0)]] var ext_tex : texture_external;
+@group(0) @binding(0) var ext_tex : texture_external;
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] coord : vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
   var dim : vec2<i32>;
   dim = textureDimensions(ext_tex);
   return vec4<f32>(0.0, 0.0, 0.0, 0.0);
@@ -86,14 +86,14 @@
   ub : f32;
 }
 
-[[group(0), binding(1)]] var ext_tex_plane_1 : texture_2d<f32>;
+@group(0) @binding(1) var ext_tex_plane_1 : texture_2d<f32>;
 
-[[group(0), binding(2)]] var<uniform> ext_tex_params : ExternalTextureParams;
+@group(0) @binding(2) var<uniform> ext_tex_params : ExternalTextureParams;
 
-[[group(0), binding(0)]] var ext_tex : texture_2d<f32>;
+@group(0) @binding(0) var ext_tex : texture_2d<f32>;
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] coord : vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
   var dim : vec2<i32>;
   dim = textureDimensions(ext_tex);
   return vec4<f32>(0.0, 0.0, 0.0, 0.0);
@@ -110,17 +110,17 @@
 // Test that the transform works with a textureSampleLevel call.
 TEST_F(MultiplanarExternalTextureTest, BasicTextureSampleLevel) {
   auto* src = R"(
-[[group(0), binding(0)]] var s : sampler;
-[[group(0), binding(1)]] var ext_tex : texture_external;
+@group(0) @binding(0) var s : sampler;
+@group(0) @binding(1) var ext_tex : texture_external;
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] coord : vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
   return textureSampleLevel(ext_tex, s, coord.xy);
 }
 )";
 
   auto* expect = R"(
-[[group(0), binding(0)]] var s : sampler;
+@group(0) @binding(0) var s : sampler;
 
 struct ExternalTextureParams {
   numPlanes : u32;
@@ -130,11 +130,11 @@
   ub : f32;
 }
 
-[[group(0), binding(2)]] var ext_tex_plane_1 : texture_2d<f32>;
+@group(0) @binding(2) var ext_tex_plane_1 : texture_2d<f32>;
 
-[[group(0), binding(3)]] var<uniform> ext_tex_params : ExternalTextureParams;
+@group(0) @binding(3) var<uniform> ext_tex_params : ExternalTextureParams;
 
-[[group(0), binding(1)]] var ext_tex : texture_2d<f32>;
+@group(0) @binding(1) var ext_tex : texture_2d<f32>;
 
 fn textureSampleExternal(plane0 : texture_2d<f32>, plane1 : texture_2d<f32>, smp : sampler, coord : vec2<f32>, params : ExternalTextureParams) -> vec4<f32> {
   if ((params.numPlanes == 1u)) {
@@ -150,8 +150,8 @@
   return vec4<f32>(r, g, b, 1.0);
 }
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] coord : vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
   return textureSampleExternal(ext_tex, ext_tex_plane_1, s, coord.xy, ext_tex_params);
 }
 )";
@@ -166,10 +166,10 @@
 // Tests that the transform works with a textureLoad call.
 TEST_F(MultiplanarExternalTextureTest, BasicTextureLoad) {
   auto* src = R"(
-[[group(0), binding(0)]] var ext_tex : texture_external;
+@group(0) @binding(0) var ext_tex : texture_external;
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] coord : vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
   return textureLoad(ext_tex, vec2<i32>(1, 1));
 }
 )";
@@ -183,11 +183,11 @@
   ub : f32;
 }
 
-[[group(0), binding(1)]] var ext_tex_plane_1 : texture_2d<f32>;
+@group(0) @binding(1) var ext_tex_plane_1 : texture_2d<f32>;
 
-[[group(0), binding(2)]] var<uniform> ext_tex_params : ExternalTextureParams;
+@group(0) @binding(2) var<uniform> ext_tex_params : ExternalTextureParams;
 
-[[group(0), binding(0)]] var ext_tex : texture_2d<f32>;
+@group(0) @binding(0) var ext_tex : texture_2d<f32>;
 
 fn textureLoadExternal(plane0 : texture_2d<f32>, plane1 : texture_2d<f32>, coord : vec2<i32>, params : ExternalTextureParams) -> vec4<f32> {
   if ((params.numPlanes == 1u)) {
@@ -203,8 +203,8 @@
   return vec4<f32>(r, g, b, 1.0);
 }
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] coord : vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
   return textureLoadExternal(ext_tex, ext_tex_plane_1, vec2<i32>(1, 1), ext_tex_params);
 }
 )";
@@ -220,17 +220,17 @@
 // call.
 TEST_F(MultiplanarExternalTextureTest, TextureSampleAndTextureLoad) {
   auto* src = R"(
-[[group(0), binding(0)]] var s : sampler;
-[[group(0), binding(1)]] var ext_tex : texture_external;
+@group(0) @binding(0) var s : sampler;
+@group(0) @binding(1) var ext_tex : texture_external;
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] coord : vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
   return textureSampleLevel(ext_tex, s, coord.xy) + textureLoad(ext_tex, vec2<i32>(1, 1));
 }
 )";
 
   auto* expect = R"(
-[[group(0), binding(0)]] var s : sampler;
+@group(0) @binding(0) var s : sampler;
 
 struct ExternalTextureParams {
   numPlanes : u32;
@@ -240,11 +240,11 @@
   ub : f32;
 }
 
-[[group(0), binding(2)]] var ext_tex_plane_1 : texture_2d<f32>;
+@group(0) @binding(2) var ext_tex_plane_1 : texture_2d<f32>;
 
-[[group(0), binding(3)]] var<uniform> ext_tex_params : ExternalTextureParams;
+@group(0) @binding(3) var<uniform> ext_tex_params : ExternalTextureParams;
 
-[[group(0), binding(1)]] var ext_tex : texture_2d<f32>;
+@group(0) @binding(1) var ext_tex : texture_2d<f32>;
 
 fn textureSampleExternal(plane0 : texture_2d<f32>, plane1 : texture_2d<f32>, smp : sampler, coord : vec2<f32>, params : ExternalTextureParams) -> vec4<f32> {
   if ((params.numPlanes == 1u)) {
@@ -274,8 +274,8 @@
   return vec4<f32>(r, g, b, 1.0);
 }
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] coord : vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
   return (textureSampleExternal(ext_tex, ext_tex_plane_1, s, coord.xy, ext_tex_params) + textureLoadExternal(ext_tex, ext_tex_plane_1, vec2<i32>(1, 1), ext_tex_params));
 }
 )";
@@ -290,20 +290,20 @@
 // Tests that the transform works with many instances of texture_external.
 TEST_F(MultiplanarExternalTextureTest, ManyTextureSampleLevel) {
   auto* src = R"(
-[[group(0), binding(0)]] var s : sampler;
-[[group(0), binding(1)]] var ext_tex : texture_external;
-[[group(0), binding(2)]] var ext_tex_1 : texture_external;
-[[group(0), binding(3)]] var ext_tex_2 : texture_external;
-[[group(1), binding(0)]] var ext_tex_3 : texture_external;
+@group(0) @binding(0) var s : sampler;
+@group(0) @binding(1) var ext_tex : texture_external;
+@group(0) @binding(2) var ext_tex_1 : texture_external;
+@group(0) @binding(3) var ext_tex_2 : texture_external;
+@group(1) @binding(0) var ext_tex_3 : texture_external;
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] coord : vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
   return textureSampleLevel(ext_tex, s, coord.xy) + textureSampleLevel(ext_tex_1, s, coord.xy) + textureSampleLevel(ext_tex_2, s, coord.xy) + textureSampleLevel(ext_tex_3, s, coord.xy);
 }
 )";
 
   auto* expect = R"(
-[[group(0), binding(0)]] var s : sampler;
+@group(0) @binding(0) var s : sampler;
 
 struct ExternalTextureParams {
   numPlanes : u32;
@@ -313,29 +313,29 @@
   ub : f32;
 }
 
-[[group(0), binding(4)]] var ext_tex_plane_1 : texture_2d<f32>;
+@group(0) @binding(4) var ext_tex_plane_1 : texture_2d<f32>;
 
-[[group(0), binding(5)]] var<uniform> ext_tex_params : ExternalTextureParams;
+@group(0) @binding(5) var<uniform> ext_tex_params : ExternalTextureParams;
 
-[[group(0), binding(1)]] var ext_tex : texture_2d<f32>;
+@group(0) @binding(1) var ext_tex : texture_2d<f32>;
 
-[[group(0), binding(6)]] var ext_tex_plane_1_1 : texture_2d<f32>;
+@group(0) @binding(6) var ext_tex_plane_1_1 : texture_2d<f32>;
 
-[[group(0), binding(7)]] var<uniform> ext_tex_params_1 : ExternalTextureParams;
+@group(0) @binding(7) var<uniform> ext_tex_params_1 : ExternalTextureParams;
 
-[[group(0), binding(2)]] var ext_tex_1 : texture_2d<f32>;
+@group(0) @binding(2) var ext_tex_1 : texture_2d<f32>;
 
-[[group(0), binding(8)]] var ext_tex_plane_1_2 : texture_2d<f32>;
+@group(0) @binding(8) var ext_tex_plane_1_2 : texture_2d<f32>;
 
-[[group(0), binding(9)]] var<uniform> ext_tex_params_2 : ExternalTextureParams;
+@group(0) @binding(9) var<uniform> ext_tex_params_2 : ExternalTextureParams;
 
-[[group(0), binding(3)]] var ext_tex_2 : texture_2d<f32>;
+@group(0) @binding(3) var ext_tex_2 : texture_2d<f32>;
 
-[[group(1), binding(1)]] var ext_tex_plane_1_3 : texture_2d<f32>;
+@group(1) @binding(1) var ext_tex_plane_1_3 : texture_2d<f32>;
 
-[[group(1), binding(2)]] var<uniform> ext_tex_params_3 : ExternalTextureParams;
+@group(1) @binding(2) var<uniform> ext_tex_params_3 : ExternalTextureParams;
 
-[[group(1), binding(0)]] var ext_tex_3 : texture_2d<f32>;
+@group(1) @binding(0) var ext_tex_3 : texture_2d<f32>;
 
 fn textureSampleExternal(plane0 : texture_2d<f32>, plane1 : texture_2d<f32>, smp : sampler, coord : vec2<f32>, params : ExternalTextureParams) -> vec4<f32> {
   if ((params.numPlanes == 1u)) {
@@ -351,8 +351,8 @@
   return vec4<f32>(r, g, b, 1.0);
 }
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] coord : vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@builtin(position) coord : vec4<f32>) -> @location(0) vec4<f32> {
   return (((textureSampleExternal(ext_tex, ext_tex_plane_1, s, coord.xy, ext_tex_params) + textureSampleExternal(ext_tex_1, ext_tex_plane_1_1, s, coord.xy, ext_tex_params_1)) + textureSampleExternal(ext_tex_2, ext_tex_plane_1_2, s, coord.xy, ext_tex_params_2)) + textureSampleExternal(ext_tex_3, ext_tex_plane_1_3, s, coord.xy, ext_tex_params_3));
 }
 )";
@@ -377,10 +377,10 @@
   textureSampleLevel(t, s, vec2<f32>(1.0, 2.0));
 }
 
-[[group(0), binding(0)]] var ext_tex : texture_external;
-[[group(0), binding(1)]] var smp : sampler;
+@group(0) @binding(0) var ext_tex : texture_external;
+@group(0) @binding(1) var smp : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   f(ext_tex, smp);
 }
@@ -413,15 +413,15 @@
   textureSampleExternal(t, ext_tex_plane_1, s, vec2<f32>(1.0, 2.0), ext_tex_params);
 }
 
-[[group(0), binding(2)]] var ext_tex_plane_1_1 : texture_2d<f32>;
+@group(0) @binding(2) var ext_tex_plane_1_1 : texture_2d<f32>;
 
-[[group(0), binding(3)]] var<uniform> ext_tex_params_1 : ExternalTextureParams;
+@group(0) @binding(3) var<uniform> ext_tex_params_1 : ExternalTextureParams;
 
-[[group(0), binding(0)]] var ext_tex : texture_2d<f32>;
+@group(0) @binding(0) var ext_tex : texture_2d<f32>;
 
-[[group(0), binding(1)]] var smp : sampler;
+@group(0) @binding(1) var smp : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   f(ext_tex, ext_tex_plane_1_1, ext_tex_params_1, smp);
 }
@@ -443,10 +443,10 @@
   textureSampleLevel(t, s, vec2<f32>(1.0, 2.0));
 }
 
-[[group(0), binding(0)]] var ext_tex : texture_external;
-[[group(0), binding(1)]] var smp : sampler;
+@group(0) @binding(0) var ext_tex : texture_external;
+@group(0) @binding(1) var smp : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   f(smp, ext_tex);
 }
@@ -479,15 +479,15 @@
   textureSampleExternal(t, ext_tex_plane_1, s, vec2<f32>(1.0, 2.0), ext_tex_params);
 }
 
-[[group(0), binding(2)]] var ext_tex_plane_1_1 : texture_2d<f32>;
+@group(0) @binding(2) var ext_tex_plane_1_1 : texture_2d<f32>;
 
-[[group(0), binding(3)]] var<uniform> ext_tex_params_1 : ExternalTextureParams;
+@group(0) @binding(3) var<uniform> ext_tex_params_1 : ExternalTextureParams;
 
-[[group(0), binding(0)]] var ext_tex : texture_2d<f32>;
+@group(0) @binding(0) var ext_tex : texture_2d<f32>;
 
-[[group(0), binding(1)]] var smp : sampler;
+@group(0) @binding(1) var smp : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   f(smp, ext_tex, ext_tex_plane_1_1, ext_tex_params_1);
 }
@@ -510,11 +510,11 @@
   textureSampleLevel(t2, s, vec2<f32>(1.0, 2.0));
 }
 
-[[group(0), binding(0)]] var ext_tex : texture_external;
-[[group(0), binding(1)]] var smp : sampler;
-[[group(0), binding(2)]] var ext_tex2 : texture_external;
+@group(0) @binding(0) var ext_tex : texture_external;
+@group(0) @binding(1) var smp : sampler;
+@group(0) @binding(2) var ext_tex2 : texture_external;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   f(ext_tex, smp, ext_tex2);
 }
@@ -548,21 +548,21 @@
   textureSampleExternal(t2, ext_tex_plane_1_1, s, vec2<f32>(1.0, 2.0), ext_tex_params_1);
 }
 
-[[group(0), binding(3)]] var ext_tex_plane_1_2 : texture_2d<f32>;
+@group(0) @binding(3) var ext_tex_plane_1_2 : texture_2d<f32>;
 
-[[group(0), binding(4)]] var<uniform> ext_tex_params_2 : ExternalTextureParams;
+@group(0) @binding(4) var<uniform> ext_tex_params_2 : ExternalTextureParams;
 
-[[group(0), binding(0)]] var ext_tex : texture_2d<f32>;
+@group(0) @binding(0) var ext_tex : texture_2d<f32>;
 
-[[group(0), binding(1)]] var smp : sampler;
+@group(0) @binding(1) var smp : sampler;
 
-[[group(0), binding(5)]] var ext_tex_plane_1_3 : texture_2d<f32>;
+@group(0) @binding(5) var ext_tex_plane_1_3 : texture_2d<f32>;
 
-[[group(0), binding(6)]] var<uniform> ext_tex_params_3 : ExternalTextureParams;
+@group(0) @binding(6) var<uniform> ext_tex_params_3 : ExternalTextureParams;
 
-[[group(0), binding(2)]] var ext_tex2 : texture_2d<f32>;
+@group(0) @binding(2) var ext_tex2 : texture_2d<f32>;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   f(ext_tex, ext_tex_plane_1_2, ext_tex_params_2, smp, ext_tex2, ext_tex_plane_1_3, ext_tex_params_3);
 }
@@ -589,10 +589,10 @@
   nested(t, s);
 }
 
-[[group(0), binding(0)]] var ext_tex : texture_external;
-[[group(0), binding(1)]] var smp : sampler;
+@group(0) @binding(0) var ext_tex : texture_external;
+@group(0) @binding(1) var smp : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   f(ext_tex, smp);
 }
@@ -629,15 +629,15 @@
   nested(t, ext_tex_plane_1_1, ext_tex_params_1, s);
 }
 
-[[group(0), binding(2)]] var ext_tex_plane_1_2 : texture_2d<f32>;
+@group(0) @binding(2) var ext_tex_plane_1_2 : texture_2d<f32>;
 
-[[group(0), binding(3)]] var<uniform> ext_tex_params_2 : ExternalTextureParams;
+@group(0) @binding(3) var<uniform> ext_tex_params_2 : ExternalTextureParams;
 
-[[group(0), binding(0)]] var ext_tex : texture_2d<f32>;
+@group(0) @binding(0) var ext_tex : texture_2d<f32>;
 
-[[group(0), binding(1)]] var smp : sampler;
+@group(0) @binding(1) var smp : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   f(ext_tex, ext_tex_plane_1_2, ext_tex_params_2, smp);
 }
diff --git a/src/transform/num_workgroups_from_uniform.h b/src/transform/num_workgroups_from_uniform.h
index af922c2..ab8daa6 100644
--- a/src/transform/num_workgroups_from_uniform.h
+++ b/src/transform/num_workgroups_from_uniform.h
@@ -34,7 +34,7 @@
 ///  num_workgroups : vec3<u32>;
 /// };
 ///
-/// [[group(0), binding(0)]]
+/// @group(0) @binding(0)
 /// var<uniform> num_workgroups_ubo : num_workgroups_struct;
 /// ```
 /// The binding group and number used for this uniform buffer is provided via
diff --git a/src/transform/num_workgroups_from_uniform_test.cc b/src/transform/num_workgroups_from_uniform_test.cc
index ecb221a..bea5222 100644
--- a/src/transform/num_workgroups_from_uniform_test.cc
+++ b/src/transform/num_workgroups_from_uniform_test.cc
@@ -57,8 +57,8 @@
 
 TEST_F(NumWorkgroupsFromUniformTest, Basic) {
   auto* src = R"(
-[[stage(compute), workgroup_size(1)]]
-fn main([[builtin(num_workgroups)]] num_wgs : vec3<u32>) {
+@stage(compute) @workgroup_size(1)
+fn main(@builtin(num_workgroups) num_wgs : vec3<u32>) {
   let groups_x = num_wgs.x;
   let groups_y = num_wgs.y;
   let groups_z = num_wgs.z;
@@ -70,7 +70,7 @@
   num_workgroups : vec3<u32>;
 }
 
-[[group(0), binding(30)]] var<uniform> tint_symbol_3 : tint_symbol_2;
+@group(0) @binding(30) var<uniform> tint_symbol_3 : tint_symbol_2;
 
 fn main_inner(num_wgs : vec3<u32>) {
   let groups_x = num_wgs.x;
@@ -78,7 +78,7 @@
   let groups_z = num_wgs.z;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   main_inner(tint_symbol_3.num_workgroups);
 }
@@ -96,10 +96,10 @@
 TEST_F(NumWorkgroupsFromUniformTest, StructOnlyMember) {
   auto* src = R"(
 struct Builtins {
-  [[builtin(num_workgroups)]] num_wgs : vec3<u32>;
+  @builtin(num_workgroups) num_wgs : vec3<u32>;
 };
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main(in : Builtins) {
   let groups_x = in.num_wgs.x;
   let groups_y = in.num_wgs.y;
@@ -112,7 +112,7 @@
   num_workgroups : vec3<u32>;
 }
 
-[[group(0), binding(30)]] var<uniform> tint_symbol_3 : tint_symbol_2;
+@group(0) @binding(30) var<uniform> tint_symbol_3 : tint_symbol_2;
 
 struct Builtins {
   num_wgs : vec3<u32>;
@@ -124,7 +124,7 @@
   let groups_z = in.num_wgs.z;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   main_inner(Builtins(tint_symbol_3.num_workgroups));
 }
@@ -142,12 +142,12 @@
 TEST_F(NumWorkgroupsFromUniformTest, StructMultipleMembers) {
   auto* src = R"(
 struct Builtins {
-  [[builtin(global_invocation_id)]] gid : vec3<u32>;
-  [[builtin(num_workgroups)]] num_wgs : vec3<u32>;
-  [[builtin(workgroup_id)]] wgid : vec3<u32>;
+  @builtin(global_invocation_id) gid : vec3<u32>;
+  @builtin(num_workgroups) num_wgs : vec3<u32>;
+  @builtin(workgroup_id) wgid : vec3<u32>;
 };
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main(in : Builtins) {
   let groups_x = in.num_wgs.x;
   let groups_y = in.num_wgs.y;
@@ -160,7 +160,7 @@
   num_workgroups : vec3<u32>;
 }
 
-[[group(0), binding(30)]] var<uniform> tint_symbol_3 : tint_symbol_2;
+@group(0) @binding(30) var<uniform> tint_symbol_3 : tint_symbol_2;
 
 struct Builtins {
   gid : vec3<u32>;
@@ -169,9 +169,9 @@
 }
 
 struct tint_symbol_1 {
-  [[builtin(global_invocation_id)]]
+  @builtin(global_invocation_id)
   gid : vec3<u32>;
-  [[builtin(workgroup_id)]]
+  @builtin(workgroup_id)
   wgid : vec3<u32>;
 }
 
@@ -181,7 +181,7 @@
   let groups_z = in.num_wgs.z;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main(tint_symbol : tint_symbol_1) {
   main_inner(Builtins(tint_symbol.gid, tint_symbol_3.num_workgroups, tint_symbol.wgid));
 }
@@ -199,31 +199,31 @@
 TEST_F(NumWorkgroupsFromUniformTest, MultipleEntryPoints) {
   auto* src = R"(
 struct Builtins1 {
-  [[builtin(num_workgroups)]] num_wgs : vec3<u32>;
+  @builtin(num_workgroups) num_wgs : vec3<u32>;
 };
 
 struct Builtins2 {
-  [[builtin(global_invocation_id)]] gid : vec3<u32>;
-  [[builtin(num_workgroups)]] num_wgs : vec3<u32>;
-  [[builtin(workgroup_id)]] wgid : vec3<u32>;
+  @builtin(global_invocation_id) gid : vec3<u32>;
+  @builtin(num_workgroups) num_wgs : vec3<u32>;
+  @builtin(workgroup_id) wgid : vec3<u32>;
 };
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main1(in : Builtins1) {
   let groups_x = in.num_wgs.x;
   let groups_y = in.num_wgs.y;
   let groups_z = in.num_wgs.z;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main2(in : Builtins2) {
   let groups_x = in.num_wgs.x;
   let groups_y = in.num_wgs.y;
   let groups_z = in.num_wgs.z;
 }
 
-[[stage(compute), workgroup_size(1)]]
-fn main3([[builtin(num_workgroups)]] num_wgs : vec3<u32>) {
+@stage(compute) @workgroup_size(1)
+fn main3(@builtin(num_workgroups) num_wgs : vec3<u32>) {
   let groups_x = num_wgs.x;
   let groups_y = num_wgs.y;
   let groups_z = num_wgs.z;
@@ -235,7 +235,7 @@
   num_workgroups : vec3<u32>;
 }
 
-[[group(0), binding(30)]] var<uniform> tint_symbol_7 : tint_symbol_6;
+@group(0) @binding(30) var<uniform> tint_symbol_7 : tint_symbol_6;
 
 struct Builtins1 {
   num_wgs : vec3<u32>;
@@ -253,15 +253,15 @@
   let groups_z = in.num_wgs.z;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main1() {
   main1_inner(Builtins1(tint_symbol_7.num_workgroups));
 }
 
 struct tint_symbol_3 {
-  [[builtin(global_invocation_id)]]
+  @builtin(global_invocation_id)
   gid : vec3<u32>;
-  [[builtin(workgroup_id)]]
+  @builtin(workgroup_id)
   wgid : vec3<u32>;
 }
 
@@ -271,7 +271,7 @@
   let groups_z = in.num_wgs.z;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main2(tint_symbol_2 : tint_symbol_3) {
   main2_inner(Builtins2(tint_symbol_2.gid, tint_symbol_7.num_workgroups, tint_symbol_2.wgid));
 }
@@ -282,7 +282,7 @@
   let groups_z = num_wgs.z;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main3() {
   main3_inner(tint_symbol_7.num_workgroups);
 }
@@ -300,11 +300,11 @@
 TEST_F(NumWorkgroupsFromUniformTest, NoUsages) {
   auto* src = R"(
 struct Builtins {
-  [[builtin(global_invocation_id)]] gid : vec3<u32>;
-  [[builtin(workgroup_id)]] wgid : vec3<u32>;
+  @builtin(global_invocation_id) gid : vec3<u32>;
+  @builtin(workgroup_id) wgid : vec3<u32>;
 };
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main(in : Builtins) {
 }
 )";
@@ -316,16 +316,16 @@
 }
 
 struct tint_symbol_1 {
-  [[builtin(global_invocation_id)]]
+  @builtin(global_invocation_id)
   gid : vec3<u32>;
-  [[builtin(workgroup_id)]]
+  @builtin(workgroup_id)
   wgid : vec3<u32>;
 }
 
 fn main_inner(in : Builtins) {
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main(tint_symbol : tint_symbol_1) {
   main_inner(Builtins(tint_symbol.gid, tint_symbol.wgid));
 }
diff --git a/src/transform/pad_array_elements_test.cc b/src/transform/pad_array_elements_test.cc
index 05ca2da..441eadc 100644
--- a/src/transform/pad_array_elements_test.cc
+++ b/src/transform/pad_array_elements_test.cc
@@ -46,11 +46,11 @@
 
 TEST_F(PadArrayElementsTest, ArrayAsGlobal) {
   auto* src = R"(
-var<private> arr : [[stride(8)]] array<i32, 4>;
+var<private> arr : @stride(8) array<i32, 4>;
 )";
   auto* expect = R"(
 struct tint_padded_array_element {
-  [[size(8)]]
+  @size(8)
   el : i32;
 }
 
@@ -65,12 +65,12 @@
 TEST_F(PadArrayElementsTest, RuntimeArray) {
   auto* src = R"(
 struct S {
-  rta : [[stride(8)]] array<i32>;
+  rta : @stride(8) array<i32>;
 };
 )";
   auto* expect = R"(
 struct tint_padded_array_element {
-  [[size(8)]]
+  @size(8)
   el : i32;
 }
 
@@ -87,15 +87,15 @@
 TEST_F(PadArrayElementsTest, ArrayFunctionVar) {
   auto* src = R"(
 fn f() {
-  var arr : [[stride(16)]] array<i32, 4>;
-  arr = [[stride(16)]] array<i32, 4>();
-  arr = [[stride(16)]] array<i32, 4>(1, 2, 3, 4);
+  var arr : @stride(16) array<i32, 4>;
+  arr = @stride(16) array<i32, 4>();
+  arr = @stride(16) array<i32, 4>(1, 2, 3, 4);
   let x = arr[3];
 }
 )";
   auto* expect = R"(
 struct tint_padded_array_element {
-  [[size(16)]]
+  @size(16)
   el : i32;
 }
 
@@ -114,13 +114,13 @@
 
 TEST_F(PadArrayElementsTest, ArrayAsParam) {
   auto* src = R"(
-fn f(a : [[stride(12)]] array<i32, 4>) -> i32 {
+fn f(a : @stride(12) array<i32, 4>) -> i32 {
   return a[2];
 }
 )";
   auto* expect = R"(
 struct tint_padded_array_element {
-  [[size(12)]]
+  @size(12)
   el : i32;
 }
 
@@ -137,14 +137,14 @@
 // TODO(crbug.com/tint/781): Cannot parse the stride on the return array type.
 TEST_F(PadArrayElementsTest, DISABLED_ArrayAsReturn) {
   auto* src = R"(
-fn f() -> [[stride(8)]] array<i32, 4> {
+fn f() -> @stride(8) array<i32, 4> {
   return array<i32, 4>(1, 2, 3, 4);
 }
 )";
   auto* expect = R"(
 struct tint_padded_array_element {
   el : i32;
-  [[size(4)]]
+  @size(4)
   padding : u32;
 };
 
@@ -160,7 +160,7 @@
 
 TEST_F(PadArrayElementsTest, ArrayAlias) {
   auto* src = R"(
-type Array = [[stride(16)]] array<i32, 4>;
+type Array = @stride(16) array<i32, 4>;
 
 fn f() {
   var arr : Array;
@@ -173,7 +173,7 @@
 )";
   auto* expect = R"(
 struct tint_padded_array_element {
-  [[size(16)]]
+  @size(16)
   el : i32;
 }
 
@@ -197,25 +197,25 @@
 TEST_F(PadArrayElementsTest, ArraysInStruct) {
   auto* src = R"(
 struct S {
-  a : [[stride(8)]] array<i32, 4>;
-  b : [[stride(8)]] array<i32, 8>;
-  c : [[stride(8)]] array<i32, 4>;
-  d : [[stride(12)]] array<i32, 8>;
+  a : @stride(8) array<i32, 4>;
+  b : @stride(8) array<i32, 8>;
+  c : @stride(8) array<i32, 4>;
+  d : @stride(12) array<i32, 8>;
 };
 )";
   auto* expect = R"(
 struct tint_padded_array_element {
-  [[size(8)]]
+  @size(8)
   el : i32;
 }
 
 struct tint_padded_array_element_1 {
-  [[size(8)]]
+  @size(8)
   el : i32;
 }
 
 struct tint_padded_array_element_2 {
-  [[size(12)]]
+  @size(12)
   el : i32;
 }
 
@@ -235,39 +235,39 @@
 TEST_F(PadArrayElementsTest, ArraysOfArraysInStruct) {
   auto* src = R"(
 struct S {
-  a : [[stride(512)]] array<i32, 4>;
-  b : [[stride(512)]] array<[[stride(32)]] array<i32, 4>, 4>;
-  c : [[stride(512)]] array<[[stride(64)]] array<[[stride(8)]] array<i32, 4>, 4>, 4>;
+  a : @stride(512) array<i32, 4>;
+  b : @stride(512) array<@stride(32) array<i32, 4>, 4>;
+  c : @stride(512) array<@stride(64) array<@stride(8) array<i32, 4>, 4>, 4>;
 };
 )";
   auto* expect = R"(
 struct tint_padded_array_element {
-  [[size(512)]]
+  @size(512)
   el : i32;
 }
 
 struct tint_padded_array_element_2 {
-  [[size(32)]]
+  @size(32)
   el : i32;
 }
 
 struct tint_padded_array_element_1 {
-  [[size(512)]]
+  @size(512)
   el : array<tint_padded_array_element_2, 4u>;
 }
 
 struct tint_padded_array_element_5 {
-  [[size(8)]]
+  @size(8)
   el : i32;
 }
 
 struct tint_padded_array_element_4 {
-  [[size(64)]]
+  @size(64)
   el : array<tint_padded_array_element_5, 4u>;
 }
 
 struct tint_padded_array_element_3 {
-  [[size(512)]]
+  @size(512)
   el : array<tint_padded_array_element_4, 4u>;
 }
 
@@ -286,9 +286,9 @@
 TEST_F(PadArrayElementsTest, AccessArraysOfArraysInStruct) {
   auto* src = R"(
 struct S {
-  a : [[stride(512)]] array<i32, 4>;
-  b : [[stride(512)]] array<[[stride(32)]] array<i32, 4>, 4>;
-  c : [[stride(512)]] array<[[stride(64)]] array<[[stride(8)]] array<i32, 4>, 4>, 4>;
+  a : @stride(512) array<i32, 4>;
+  b : @stride(512) array<@stride(32) array<i32, 4>, 4>;
+  c : @stride(512) array<@stride(64) array<@stride(8) array<i32, 4>, 4>, 4>;
 };
 
 fn f(s : S) -> i32 {
@@ -297,32 +297,32 @@
 )";
   auto* expect = R"(
 struct tint_padded_array_element {
-  [[size(512)]]
+  @size(512)
   el : i32;
 }
 
 struct tint_padded_array_element_2 {
-  [[size(32)]]
+  @size(32)
   el : i32;
 }
 
 struct tint_padded_array_element_1 {
-  [[size(512)]]
+  @size(512)
   el : array<tint_padded_array_element_2, 4u>;
 }
 
 struct tint_padded_array_element_5 {
-  [[size(8)]]
+  @size(8)
   el : i32;
 }
 
 struct tint_padded_array_element_4 {
-  [[size(64)]]
+  @size(64)
   el : array<tint_padded_array_element_5, 4u>;
 }
 
 struct tint_padded_array_element_3 {
-  [[size(512)]]
+  @size(512)
   el : array<tint_padded_array_element_4, 4u>;
 }
 
@@ -346,24 +346,24 @@
   auto* src = R"(
 type T0 = i32;
 
-type T1 = [[stride(8)]] array<i32, 1>;
+type T1 = @stride(8) array<i32, 1>;
 
 type T2 = i32;
 
-fn f1(a : [[stride(8)]] array<i32, 2>) {
+fn f1(a : @stride(8) array<i32, 2>) {
 }
 
 type T3 = i32;
 
 fn f2() {
-  var v : [[stride(8)]] array<i32, 3>;
+  var v : @stride(8) array<i32, 3>;
 }
 )";
   auto* expect = R"(
 type T0 = i32;
 
 struct tint_padded_array_element {
-  [[size(8)]]
+  @size(8)
   el : i32;
 }
 
@@ -372,7 +372,7 @@
 type T2 = i32;
 
 struct tint_padded_array_element_1 {
-  [[size(8)]]
+  @size(8)
   el : i32;
 }
 
@@ -382,7 +382,7 @@
 type T3 = i32;
 
 struct tint_padded_array_element_2 {
-  [[size(8)]]
+  @size(8)
   el : i32;
 }
 
diff --git a/src/transform/remove_phonies_test.cc b/src/transform/remove_phonies_test.cc
index 6d6c86d..6e8a1f1 100644
--- a/src/transform/remove_phonies_test.cc
+++ b/src/transform/remove_phonies_test.cc
@@ -37,7 +37,7 @@
 
 TEST_F(RemovePhoniesTest, NoSideEffects) {
   auto* src = R"(
-[[group(0), binding(0)]] var t : texture_2d<f32>;
+@group(0) @binding(0) var t : texture_2d<f32>;
 
 fn f() {
   var v : i32;
@@ -54,7 +54,7 @@
 )";
 
   auto* expect = R"(
-[[group(0), binding(0)]] var t : texture_2d<f32>;
+@group(0) @binding(0) var t : texture_2d<f32>;
 
 fn f() {
   var v : i32;
@@ -177,7 +177,7 @@
   arr : array<i32>;
 };
 
-[[group(0), binding(0)]] var<storage, read_write> s : S;
+@group(0) @binding(0) var<storage, read_write> s : S;
 
 fn x() -> i32 {
   return 0;
@@ -206,7 +206,7 @@
   arr : array<i32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> s : S;
+@group(0) @binding(0) var<storage, read_write> s : S;
 
 fn x() -> i32 {
   return 0;
diff --git a/src/transform/renamer_test.cc b/src/transform/renamer_test.cc
index 7f83043..5ef8ee5 100644
--- a/src/transform/renamer_test.cc
+++ b/src/transform/renamer_test.cc
@@ -46,9 +46,9 @@
   return vert_idx;
 }
 
-[[stage(vertex)]]
-fn entry([[builtin(vertex_index)]] vert_idx : u32
-        ) -> [[builtin(position)]] vec4<f32>  {
+@stage(vertex)
+fn entry(@builtin(vertex_index) vert_idx : u32
+        ) -> @builtin(position) vec4<f32>  {
   ignore(test(vert_idx));
   return vec4<f32>();
 }
@@ -59,8 +59,8 @@
   return tint_symbol_1;
 }
 
-[[stage(vertex)]]
-fn tint_symbol_2([[builtin(vertex_index)]] tint_symbol_1 : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn tint_symbol_2(@builtin(vertex_index) tint_symbol_1 : u32) -> @builtin(position) vec4<f32> {
   ignore(tint_symbol(tint_symbol_1));
   return vec4<f32>();
 }
@@ -83,8 +83,8 @@
 
 TEST_F(RenamerTest, PreserveSwizzles) {
   auto* src = R"(
-[[stage(vertex)]]
-fn entry() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn entry() -> @builtin(position) vec4<f32> {
   var v : vec4<f32>;
   var rgba : f32;
   var xyzw : f32;
@@ -93,8 +93,8 @@
 )";
 
   auto* expect = R"(
-[[stage(vertex)]]
-fn tint_symbol() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn tint_symbol() -> @builtin(position) vec4<f32> {
   var tint_symbol_1 : vec4<f32>;
   var tint_symbol_2 : f32;
   var tint_symbol_3 : f32;
@@ -120,16 +120,16 @@
 
 TEST_F(RenamerTest, PreserveIntrinsics) {
   auto* src = R"(
-[[stage(vertex)]]
-fn entry() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn entry() -> @builtin(position) vec4<f32> {
   var blah : vec4<f32>;
   return abs(blah);
 }
 )";
 
   auto* expect = R"(
-[[stage(vertex)]]
-fn tint_symbol() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn tint_symbol() -> @builtin(position) vec4<f32> {
   var tint_symbol_1 : vec4<f32>;
   return abs(tint_symbol_1);
 }
@@ -151,7 +151,7 @@
 
 TEST_F(RenamerTest, PreserveBuiltinTypes) {
   auto* src = R"(
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn entry() {
   var a = modf(1.0).whole;
   var b = modf(1.0).fract;
@@ -161,7 +161,7 @@
 )";
 
   auto* expect = R"(
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn tint_symbol() {
   var tint_symbol_1 = modf(1.0).whole;
   var tint_symbol_2 = modf(1.0).fract;
@@ -186,8 +186,8 @@
 
 TEST_F(RenamerTest, AttemptSymbolCollision) {
   auto* src = R"(
-[[stage(vertex)]]
-fn entry() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn entry() -> @builtin(position) vec4<f32> {
   var tint_symbol : vec4<f32>;
   var tint_symbol_2 : vec4<f32>;
   var tint_symbol_4 : vec4<f32>;
@@ -196,8 +196,8 @@
 )";
 
   auto* expect = R"(
-[[stage(vertex)]]
-fn tint_symbol() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn tint_symbol() -> @builtin(position) vec4<f32> {
   var tint_symbol_1 : vec4<f32>;
   var tint_symbol_2 : vec4<f32>;
   var tint_symbol_3 : vec4<f32>;
@@ -229,7 +229,7 @@
   auto keyword = GetParam();
 
   auto src = R"(
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() {
   var )" + keyword +
              R"( : i32;
@@ -237,7 +237,7 @@
 )";
 
   auto* expect = R"(
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() {
   var tint_symbol : i32;
 }
@@ -254,7 +254,7 @@
   auto keyword = GetParam();
 
   auto src = R"(
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() {
   var )" + keyword +
              R"( : i32;
@@ -262,7 +262,7 @@
 )";
 
   auto* expect = R"(
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() {
   var tint_symbol : i32;
 }
@@ -279,7 +279,7 @@
   auto keyword = GetParam();
 
   auto src = R"(
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() {
   var )" + keyword +
              R"( : i32;
@@ -287,7 +287,7 @@
 )";
 
   auto* expect = R"(
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() {
   var tint_symbol : i32;
 }
diff --git a/src/transform/robustness_test.cc b/src/transform/robustness_test.cc
index a471381..8af6cce 100644
--- a/src/transform/robustness_test.cc
+++ b/src/transform/robustness_test.cc
@@ -178,7 +178,7 @@
   a : array<f32, 0x7fffffff>;
   b : array<f32>;
 };
-[[group(0), binding(0)]] var<storage, read> s : S;
+@group(0) @binding(0) var<storage, read> s : S;
 
 fn f() {
   // Signed
@@ -217,7 +217,7 @@
   b : array<f32>;
 };
 
-[[group(0), binding(0)]] var<storage, read> s : S;
+@group(0) @binding(0) var<storage, read> s : S;
 
 fn f() {
   var i32_a1 : f32 = s.a[2147483646];
@@ -579,7 +579,7 @@
 
 // TODO(dsinclair): Implement when constant_id exists
 TEST_F(RobustnessTest, DISABLED_Vector_Constant_Id_Clamps) {
-  // [[override(1300)]] let idx : i32;
+  // @override(1300) let idx : i32;
   // var a : vec3<f32>
   // var b : f32 = a[idx]
   //
@@ -588,7 +588,7 @@
 
 // TODO(dsinclair): Implement when constant_id exists
 TEST_F(RobustnessTest, DISABLED_Array_Constant_Id_Clamps) {
-  // [[override(1300)]] let idx : i32;
+  // @override(1300) let idx : i32;
   // var a : array<f32, 4>
   // var b : f32 = a[idx]
   //
@@ -597,7 +597,7 @@
 
 // TODO(dsinclair): Implement when constant_id exists
 TEST_F(RobustnessTest, DISABLED_Matrix_Column_Constant_Id_Clamps) {
-  // [[override(1300)]] let idx : i32;
+  // @override(1300) let idx : i32;
   // var a : mat3x2<f32>
   // var b : f32 = a[idx][1]
   //
@@ -606,7 +606,7 @@
 
 // TODO(dsinclair): Implement when constant_id exists
 TEST_F(RobustnessTest, DISABLED_Matrix_Row_Constant_Id_Clamps) {
-  // [[override(1300)]] let idx : i32;
+  // @override(1300) let idx : i32;
   // var a : mat3x2<f32>
   // var b : f32 = a[1][idx]
   //
@@ -619,7 +619,7 @@
   a : f32;
   b : array<f32>;
 };
-[[group(0), binding(0)]] var<storage, read> s : S;
+@group(0) @binding(0) var<storage, read> s : S;
 
 fn f() {
   var d : f32 = s.b[25];
@@ -632,7 +632,7 @@
   b : array<f32>;
 }
 
-[[group(0), binding(0)]] var<storage, read> s : S;
+@group(0) @binding(0) var<storage, read> s : S;
 
 fn f() {
   var d : f32 = s.b[min(25u, (arrayLength(&(s.b)) - 1u))];
@@ -652,14 +652,14 @@
 // Clamp textureLoad() coord, array_index and level values
 TEST_F(RobustnessTest, TextureLoad_Clamp) {
   auto* src = R"(
-[[group(0), binding(0)]] var tex_1d : texture_1d<f32>;
-[[group(0), binding(0)]] var tex_2d : texture_2d<f32>;
-[[group(0), binding(0)]] var tex_2d_arr : texture_2d_array<f32>;
-[[group(0), binding(0)]] var tex_3d : texture_3d<f32>;
-[[group(0), binding(0)]] var tex_ms_2d : texture_multisampled_2d<f32>;
-[[group(0), binding(0)]] var tex_depth_2d : texture_depth_2d;
-[[group(0), binding(0)]] var tex_depth_2d_arr : texture_depth_2d_array;
-[[group(0), binding(0)]] var tex_external : texture_external;
+@group(0) @binding(0) var tex_1d : texture_1d<f32>;
+@group(0) @binding(0) var tex_2d : texture_2d<f32>;
+@group(0) @binding(0) var tex_2d_arr : texture_2d_array<f32>;
+@group(0) @binding(0) var tex_3d : texture_3d<f32>;
+@group(0) @binding(0) var tex_ms_2d : texture_multisampled_2d<f32>;
+@group(0) @binding(0) var tex_depth_2d : texture_depth_2d;
+@group(0) @binding(0) var tex_depth_2d_arr : texture_depth_2d_array;
+@group(0) @binding(0) var tex_external : texture_external;
 
 fn f() {
   var array_idx : i32;
@@ -679,21 +679,21 @@
 
   auto* expect =
       R"(
-[[group(0), binding(0)]] var tex_1d : texture_1d<f32>;
+@group(0) @binding(0) var tex_1d : texture_1d<f32>;
 
-[[group(0), binding(0)]] var tex_2d : texture_2d<f32>;
+@group(0) @binding(0) var tex_2d : texture_2d<f32>;
 
-[[group(0), binding(0)]] var tex_2d_arr : texture_2d_array<f32>;
+@group(0) @binding(0) var tex_2d_arr : texture_2d_array<f32>;
 
-[[group(0), binding(0)]] var tex_3d : texture_3d<f32>;
+@group(0) @binding(0) var tex_3d : texture_3d<f32>;
 
-[[group(0), binding(0)]] var tex_ms_2d : texture_multisampled_2d<f32>;
+@group(0) @binding(0) var tex_ms_2d : texture_multisampled_2d<f32>;
 
-[[group(0), binding(0)]] var tex_depth_2d : texture_depth_2d;
+@group(0) @binding(0) var tex_depth_2d : texture_depth_2d;
 
-[[group(0), binding(0)]] var tex_depth_2d_arr : texture_depth_2d_array;
+@group(0) @binding(0) var tex_depth_2d_arr : texture_depth_2d_array;
 
-[[group(0), binding(0)]] var tex_external : texture_external;
+@group(0) @binding(0) var tex_external : texture_external;
 
 fn f() {
   var array_idx : i32;
@@ -718,13 +718,13 @@
 // Clamp textureStore() coord, array_index and level values
 TEST_F(RobustnessTest, TextureStore_Clamp) {
   auto* src = R"(
-[[group(0), binding(0)]] var tex1d : texture_storage_1d<rgba8sint, write>;
+@group(0) @binding(0) var tex1d : texture_storage_1d<rgba8sint, write>;
 
-[[group(0), binding(1)]] var tex2d : texture_storage_2d<rgba8sint, write>;
+@group(0) @binding(1) var tex2d : texture_storage_2d<rgba8sint, write>;
 
-[[group(0), binding(2)]] var tex2d_arr : texture_storage_2d_array<rgba8sint, write>;
+@group(0) @binding(2) var tex2d_arr : texture_storage_2d_array<rgba8sint, write>;
 
-[[group(0), binding(3)]] var tex3d : texture_storage_3d<rgba8sint, write>;
+@group(0) @binding(3) var tex3d : texture_storage_3d<rgba8sint, write>;
 
 fn f() {
   textureStore(tex1d, 10, vec4<i32>());
@@ -735,13 +735,13 @@
 )";
 
   auto* expect = R"(
-[[group(0), binding(0)]] var tex1d : texture_storage_1d<rgba8sint, write>;
+@group(0) @binding(0) var tex1d : texture_storage_1d<rgba8sint, write>;
 
-[[group(0), binding(1)]] var tex2d : texture_storage_2d<rgba8sint, write>;
+@group(0) @binding(1) var tex2d : texture_storage_2d<rgba8sint, write>;
 
-[[group(0), binding(2)]] var tex2d_arr : texture_storage_2d_array<rgba8sint, write>;
+@group(0) @binding(2) var tex2d_arr : texture_storage_2d_array<rgba8sint, write>;
 
-[[group(0), binding(3)]] var tex3d : texture_storage_3d<rgba8sint, write>;
+@group(0) @binding(3) var tex3d : texture_storage_3d<rgba8sint, write>;
 
 fn f() {
   textureStore(tex1d, clamp(10, i32(), (textureDimensions(tex1d) - i32(1))), vec4<i32>());
@@ -779,7 +779,7 @@
   b : array<f32>;
 };
 
-[[group(0), binding(0)]] var<storage, read> s : S;
+@group(0) @binding(0) var<storage, read> s : S;
 
 let c : u32 = 1u;
 
@@ -796,7 +796,7 @@
   b : array<f32>;
 }
 
-[[group(0), binding(0)]] var<storage, read> s : S;
+@group(0) @binding(0) var<storage, read> s : S;
 
 let c : u32 = 1u;
 
@@ -817,13 +817,13 @@
   a : array<f32, 4>;
   b : array<f32>;
 };
-[[group(0), binding(0)]] var<storage, read> s : S;
+@group(0) @binding(0) var<storage, read> s : S;
 
-type UArr = [[stride(16)]] array<f32, 4>;
+type UArr = @stride(16) array<f32, 4>;
 struct U {
   a : UArr;
 };
-[[group(1), binding(0)]] var<uniform> u : U;
+@group(1) @binding(0) var<uniform> u : U;
 
 fn f() {
   // Signed
@@ -876,15 +876,15 @@
   b : array<f32>;
 }
 
-[[group(0), binding(0)]] var<storage, read> s : S;
+@group(0) @binding(0) var<storage, read> s : S;
 
-type UArr = [[stride(16)]] array<f32, 4>;
+type UArr = @stride(16) array<f32, 4>;
 
 struct U {
   a : UArr;
 }
 
-[[group(1), binding(0)]] var<uniform> u : U;
+@group(1) @binding(0) var<uniform> u : U;
 
 fn f() {
   var i32_sa1 : f32 = s.a[3];
@@ -939,15 +939,15 @@
   b : array<f32>;
 }
 
-[[group(0), binding(0)]] var<storage, read> s : S;
+@group(0) @binding(0) var<storage, read> s : S;
 
-type UArr = [[stride(16)]] array<f32, 4>;
+type UArr = @stride(16) array<f32, 4>;
 
 struct U {
   a : UArr;
 }
 
-[[group(1), binding(0)]] var<uniform> u : U;
+@group(1) @binding(0) var<uniform> u : U;
 
 fn f() {
   var i32_sa1 : f32 = s.a[4];
@@ -1004,15 +1004,15 @@
   b : array<f32>;
 }
 
-[[group(0), binding(0)]] var<storage, read> s : S;
+@group(0) @binding(0) var<storage, read> s : S;
 
-type UArr = [[stride(16)]] array<f32, 4>;
+type UArr = @stride(16) array<f32, 4>;
 
 struct U {
   a : UArr;
 }
 
-[[group(1), binding(0)]] var<uniform> u : U;
+@group(1) @binding(0) var<uniform> u : U;
 
 fn f() {
   var i32_sa1 : f32 = s.a[3];
@@ -1069,15 +1069,15 @@
   b : array<f32>;
 }
 
-[[group(0), binding(0)]] var<storage, read> s : S;
+@group(0) @binding(0) var<storage, read> s : S;
 
-type UArr = [[stride(16)]] array<f32, 4>;
+type UArr = @stride(16) array<f32, 4>;
 
 struct U {
   a : UArr;
 }
 
-[[group(1), binding(0)]] var<uniform> u : U;
+@group(1) @binding(0) var<uniform> u : U;
 
 fn f() {
   var i32_sa1 : f32 = s.a[4];
diff --git a/src/transform/simplify_pointers_test.cc b/src/transform/simplify_pointers_test.cc
index 6b55d32..a9cce89 100644
--- a/src/transform/simplify_pointers_test.cc
+++ b/src/transform/simplify_pointers_test.cc
@@ -249,7 +249,7 @@
   return 1;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var arr = array<f32, 4>();
   for (let a = &arr[foo()]; ;) {
@@ -264,7 +264,7 @@
   return 1;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var arr = array<f32, 4>();
   let a_save = foo();
@@ -350,7 +350,7 @@
   auto* src = R"(
 var<private> a : array<i32, 2>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = &a;
   var a : i32 = (*x)[0];
@@ -363,7 +363,7 @@
   auto* expect = R"(
 var<private> a : array<i32, 2>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var a_1 : i32 = a[0];
   {
diff --git a/src/transform/single_entry_point_test.cc b/src/transform/single_entry_point_test.cc
index b2193b1..6b950fe 100644
--- a/src/transform/single_entry_point_test.cc
+++ b/src/transform/single_entry_point_test.cc
@@ -49,8 +49,8 @@
 
 TEST_F(SingleEntryPointTest, Error_InvalidEntryPoint) {
   auto* src = R"(
-[[stage(vertex)]]
-fn main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main() -> @builtin(position) vec4<f32> {
   return vec4<f32>();
 }
 )";
@@ -70,7 +70,7 @@
   auto* src = R"(
 fn foo() {}
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {}
 )";
 
@@ -87,7 +87,7 @@
 
 TEST_F(SingleEntryPointTest, SingleEntryPoint) {
   auto* src = R"(
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
 }
 )";
@@ -103,26 +103,26 @@
 
 TEST_F(SingleEntryPointTest, MultipleEntryPoints) {
   auto* src = R"(
-[[stage(vertex)]]
-fn vert_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vert_main() -> @builtin(position) vec4<f32> {
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() {
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main1() {
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main2() {
 }
 )";
 
   auto* expect = R"(
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main1() {
 }
 )";
@@ -146,23 +146,23 @@
 
 var<private> d : f32;
 
-[[stage(vertex)]]
-fn vert_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vert_main() -> @builtin(position) vec4<f32> {
   a = 0.0;
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() {
   b = 0.0;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main1() {
   c = 0.0;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main2() {
   d = 0.0;
 }
@@ -171,7 +171,7 @@
   auto* expect = R"(
 var<private> c : f32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main1() {
   c = 0.0;
 }
@@ -196,23 +196,23 @@
 
 let d : f32 = 1.0;
 
-[[stage(vertex)]]
-fn vert_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vert_main() -> @builtin(position) vec4<f32> {
   let local_a : f32 = a;
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main() {
   let local_b : f32 = b;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main1() {
   let local_c : f32 = c;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main2() {
   let local_d : f32 = d;
 }
@@ -221,7 +221,7 @@
   auto* expect = R"(
 let c : f32 = 1.0;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main1() {
   let local_c : f32 = c;
 }
@@ -240,7 +240,7 @@
   auto* src = R"(
 let size : i32 = 1;
 
-[[stage(compute), workgroup_size(size)]]
+@stage(compute) @workgroup_size(size)
 fn main() {
 }
 )";
@@ -258,32 +258,32 @@
 
 TEST_F(SingleEntryPointTest, OverridableConstants) {
   auto* src = R"(
-[[override(1001)]] let c1 : u32 = 1u;
+@override(1001) let c1 : u32 = 1u;
 [[override]] let c2 : u32 = 1u;
-[[override(0)]] let c3 : u32 = 1u;
-[[override(9999)]] let c4 : u32 = 1u;
+@override(0) let c3 : u32 = 1u;
+@override(9999) let c4 : u32 = 1u;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main1() {
     let local_d = c1;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main2() {
     let local_d = c2;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main3() {
     let local_d = c3;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main4() {
     let local_d = c4;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main5() {
     let local_d = 1u;
 }
@@ -292,9 +292,9 @@
   {
     SingleEntryPoint::Config cfg("comp_main1");
     auto* expect = R"(
-[[override(1001)]] let c1 : u32 = 1u;
+@override(1001) let c1 : u32 = 1u;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main1() {
   let local_d = c1;
 }
@@ -310,9 +310,9 @@
     // The decorator is replaced with the one with explicit id
     // And should not be affected by other constants stripped away
     auto* expect = R"(
-[[override(1)]] let c2 : u32 = 1u;
+@override(1) let c2 : u32 = 1u;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main2() {
   let local_d = c2;
 }
@@ -326,9 +326,9 @@
   {
     SingleEntryPoint::Config cfg("comp_main3");
     auto* expect = R"(
-[[override(0)]] let c3 : u32 = 1u;
+@override(0) let c3 : u32 = 1u;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main3() {
   let local_d = c3;
 }
@@ -342,9 +342,9 @@
   {
     SingleEntryPoint::Config cfg("comp_main4");
     auto* expect = R"(
-[[override(9999)]] let c4 : u32 = 1u;
+@override(9999) let c4 : u32 = 1u;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main4() {
   let local_d = c4;
 }
@@ -358,7 +358,7 @@
   {
     SingleEntryPoint::Config cfg("comp_main5");
     auto* expect = R"(
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main5() {
   let local_d = 1u;
 }
@@ -391,12 +391,12 @@
   inner_shared();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main1() {
   outer1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main2() {
   outer2();
 }
@@ -414,7 +414,7 @@
   inner_shared();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main1() {
   outer1();
 }
@@ -465,12 +465,12 @@
   outer2_var = 0.0;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main1() {
   outer1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main2() {
   outer2();
 }
@@ -497,7 +497,7 @@
   outer1_var = 0.0;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main1() {
   outer1();
 }
diff --git a/src/transform/vectorize_scalar_matrix_constructors_test.cc b/src/transform/vectorize_scalar_matrix_constructors_test.cc
index c603ee2..7e72e4c 100644
--- a/src/transform/vectorize_scalar_matrix_constructors_test.cc
+++ b/src/transform/vectorize_scalar_matrix_constructors_test.cc
@@ -54,7 +54,7 @@
   }
 
   std::string tmpl = R"(
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let m = ${matrix}(${values});
 }
@@ -83,7 +83,7 @@
   }
 
   std::string tmpl = R"(
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let m = ${matrix}(${columns});
 }
diff --git a/src/transform/vertex_pulling_test.cc b/src/transform/vertex_pulling_test.cc
index 10b8ee8..b2482af 100644
--- a/src/transform/vertex_pulling_test.cc
+++ b/src/transform/vertex_pulling_test.cc
@@ -38,8 +38,8 @@
 
 TEST_F(VertexPullingTest, Error_InvalidEntryPoint) {
   auto* src = R"(
-[[stage(vertex)]]
-fn main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main() -> @builtin(position) vec4<f32> {
   return vec4<f32>();
 }
 )";
@@ -58,7 +58,7 @@
 
 TEST_F(VertexPullingTest, Error_EntryPointWrongStage) {
   auto* src = R"(
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {}
 )";
 
@@ -76,8 +76,8 @@
 
 TEST_F(VertexPullingTest, Error_BadStride) {
   auto* src = R"(
-[[stage(vertex)]]
-fn main([[location(0)]] var_a : f32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(@location(0) var_a : f32) -> @builtin(position) vec4<f32> {
   return vec4<f32>(var_a, 0.0, 0.0, 1.0);
 }
 )";
@@ -100,19 +100,19 @@
 
 TEST_F(VertexPullingTest, BasicModule) {
   auto* src = R"(
-[[stage(vertex)]]
-fn main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main() -> @builtin(position) vec4<f32> {
   return vec4<f32>();
 }
 )";
 
   auto* expect = R"(
 struct TintVertexData {
-  tint_vertex_data : [[stride(4)]] array<u32>;
+  tint_vertex_data : @stride(4) array<u32>;
 }
 
-[[stage(vertex)]]
-fn main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main() -> @builtin(position) vec4<f32> {
   return vec4<f32>();
 }
 )";
@@ -129,21 +129,21 @@
 
 TEST_F(VertexPullingTest, OneAttribute) {
   auto* src = R"(
-[[stage(vertex)]]
-fn main([[location(0)]] var_a : f32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(@location(0) var_a : f32) -> @builtin(position) vec4<f32> {
   return vec4<f32>(var_a, 0.0, 0.0, 1.0);
 }
 )";
 
   auto* expect = R"(
 struct TintVertexData {
-  tint_vertex_data : [[stride(4)]] array<u32>;
+  tint_vertex_data : @stride(4) array<u32>;
 }
 
-[[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
+@binding(0) @group(4) var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
-[[stage(vertex)]]
-fn main([[builtin(vertex_index)]] tint_pulling_vertex_index : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(@builtin(vertex_index) tint_pulling_vertex_index : u32) -> @builtin(position) vec4<f32> {
   var var_a : f32;
   {
     let buffer_array_base_0 = tint_pulling_vertex_index;
@@ -167,21 +167,21 @@
 
 TEST_F(VertexPullingTest, OneInstancedAttribute) {
   auto* src = R"(
-[[stage(vertex)]]
-fn main([[location(0)]] var_a : f32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(@location(0) var_a : f32) -> @builtin(position) vec4<f32> {
   return vec4<f32>(var_a, 0.0, 0.0, 1.0);
 }
 )";
 
   auto* expect = R"(
 struct TintVertexData {
-  tint_vertex_data : [[stride(4)]] array<u32>;
+  tint_vertex_data : @stride(4) array<u32>;
 }
 
-[[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
+@binding(0) @group(4) var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
-[[stage(vertex)]]
-fn main([[builtin(instance_index)]] tint_pulling_instance_index : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(@builtin(instance_index) tint_pulling_instance_index : u32) -> @builtin(position) vec4<f32> {
   var var_a : f32;
   {
     let buffer_array_base_0 = tint_pulling_instance_index;
@@ -205,21 +205,21 @@
 
 TEST_F(VertexPullingTest, OneAttributeDifferentOutputSet) {
   auto* src = R"(
-[[stage(vertex)]]
-fn main([[location(0)]] var_a : f32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(@location(0) var_a : f32) -> @builtin(position) vec4<f32> {
   return vec4<f32>(var_a, 0.0, 0.0, 1.0);
 }
 )";
 
   auto* expect = R"(
 struct TintVertexData {
-  tint_vertex_data : [[stride(4)]] array<u32>;
+  tint_vertex_data : @stride(4) array<u32>;
 }
 
-[[binding(0), group(5)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
+@binding(0) @group(5) var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
-[[stage(vertex)]]
-fn main([[builtin(vertex_index)]] tint_pulling_vertex_index : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(@builtin(vertex_index) tint_pulling_vertex_index : u32) -> @builtin(position) vec4<f32> {
   var var_a : f32;
   {
     let buffer_array_base_0 = tint_pulling_vertex_index;
@@ -245,29 +245,29 @@
 TEST_F(VertexPullingTest, OneAttribute_Struct) {
   auto* src = R"(
 struct Inputs {
-  [[location(0)]] var_a : f32;
+  @location(0) var_a : f32;
 };
 
-[[stage(vertex)]]
-fn main(inputs : Inputs) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(inputs : Inputs) -> @builtin(position) vec4<f32> {
   return vec4<f32>(inputs.var_a, 0.0, 0.0, 1.0);
 }
 )";
 
   auto* expect = R"(
 struct TintVertexData {
-  tint_vertex_data : [[stride(4)]] array<u32>;
+  tint_vertex_data : @stride(4) array<u32>;
 }
 
-[[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
+@binding(0) @group(4) var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
 struct Inputs {
-  [[location(0)]]
+  @location(0)
   var_a : f32;
 }
 
-[[stage(vertex)]]
-fn main([[builtin(vertex_index)]] tint_pulling_vertex_index : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(@builtin(vertex_index) tint_pulling_vertex_index : u32) -> @builtin(position) vec4<f32> {
   var inputs : Inputs;
   {
     let buffer_array_base_0 = tint_pulling_vertex_index;
@@ -292,27 +292,27 @@
 // We expect the transform to use an existing builtin variables if it finds them
 TEST_F(VertexPullingTest, ExistingVertexIndexAndInstanceIndex) {
   auto* src = R"(
-[[stage(vertex)]]
-fn main([[location(0)]] var_a : f32,
-        [[location(1)]] var_b : f32,
-        [[builtin(vertex_index)]] custom_vertex_index : u32,
-        [[builtin(instance_index)]] custom_instance_index : u32
-        ) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(@location(0) var_a : f32,
+        @location(1) var_b : f32,
+        @builtin(vertex_index) custom_vertex_index : u32,
+        @builtin(instance_index) custom_instance_index : u32
+        ) -> @builtin(position) vec4<f32> {
   return vec4<f32>(var_a, var_b, 0.0, 1.0);
 }
 )";
 
   auto* expect = R"(
 struct TintVertexData {
-  tint_vertex_data : [[stride(4)]] array<u32>;
+  tint_vertex_data : @stride(4) array<u32>;
 }
 
-[[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
+@binding(0) @group(4) var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
-[[binding(1), group(4)]] var<storage, read> tint_pulling_vertex_buffer_1 : TintVertexData;
+@binding(1) @group(4) var<storage, read> tint_pulling_vertex_buffer_1 : TintVertexData;
 
-[[stage(vertex)]]
-fn main([[builtin(vertex_index)]] custom_vertex_index : u32, [[builtin(instance_index)]] custom_instance_index : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(@builtin(vertex_index) custom_vertex_index : u32, @builtin(instance_index) custom_instance_index : u32) -> @builtin(position) vec4<f32> {
   var var_a : f32;
   var var_b : f32;
   {
@@ -350,47 +350,47 @@
 TEST_F(VertexPullingTest, ExistingVertexIndexAndInstanceIndex_Struct) {
   auto* src = R"(
 struct Inputs {
-  [[location(0)]] var_a : f32;
-  [[location(1)]] var_b : f32;
-  [[builtin(vertex_index)]] custom_vertex_index : u32;
-  [[builtin(instance_index)]] custom_instance_index : u32;
+  @location(0) var_a : f32;
+  @location(1) var_b : f32;
+  @builtin(vertex_index) custom_vertex_index : u32;
+  @builtin(instance_index) custom_instance_index : u32;
 };
 
-[[stage(vertex)]]
-fn main(inputs : Inputs) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(inputs : Inputs) -> @builtin(position) vec4<f32> {
   return vec4<f32>(inputs.var_a, inputs.var_b, 0.0, 1.0);
 }
 )";
 
   auto* expect = R"(
 struct TintVertexData {
-  tint_vertex_data : [[stride(4)]] array<u32>;
+  tint_vertex_data : @stride(4) array<u32>;
 }
 
-[[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
+@binding(0) @group(4) var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
-[[binding(1), group(4)]] var<storage, read> tint_pulling_vertex_buffer_1 : TintVertexData;
+@binding(1) @group(4) var<storage, read> tint_pulling_vertex_buffer_1 : TintVertexData;
 
 struct tint_symbol {
-  [[builtin(vertex_index)]]
+  @builtin(vertex_index)
   custom_vertex_index : u32;
-  [[builtin(instance_index)]]
+  @builtin(instance_index)
   custom_instance_index : u32;
 }
 
 struct Inputs {
-  [[location(0)]]
+  @location(0)
   var_a : f32;
-  [[location(1)]]
+  @location(1)
   var_b : f32;
-  [[builtin(vertex_index)]]
+  @builtin(vertex_index)
   custom_vertex_index : u32;
-  [[builtin(instance_index)]]
+  @builtin(instance_index)
   custom_instance_index : u32;
 }
 
-[[stage(vertex)]]
-fn main(tint_symbol_1 : tint_symbol) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(tint_symbol_1 : tint_symbol) -> @builtin(position) vec4<f32> {
   var inputs : Inputs;
   inputs.custom_vertex_index = tint_symbol_1.custom_vertex_index;
   inputs.custom_instance_index = tint_symbol_1.custom_instance_index;
@@ -429,46 +429,46 @@
 TEST_F(VertexPullingTest, ExistingVertexIndexAndInstanceIndex_SeparateStruct) {
   auto* src = R"(
 struct Inputs {
-  [[location(0)]] var_a : f32;
-  [[location(1)]] var_b : f32;
+  @location(0) var_a : f32;
+  @location(1) var_b : f32;
 };
 
 struct Indices {
-  [[builtin(vertex_index)]] custom_vertex_index : u32;
-  [[builtin(instance_index)]] custom_instance_index : u32;
+  @builtin(vertex_index) custom_vertex_index : u32;
+  @builtin(instance_index) custom_instance_index : u32;
 };
 
-[[stage(vertex)]]
-fn main(inputs : Inputs, indices : Indices) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(inputs : Inputs, indices : Indices) -> @builtin(position) vec4<f32> {
   return vec4<f32>(inputs.var_a, inputs.var_b, 0.0, 1.0);
 }
 )";
 
   auto* expect = R"(
 struct TintVertexData {
-  tint_vertex_data : [[stride(4)]] array<u32>;
+  tint_vertex_data : @stride(4) array<u32>;
 }
 
-[[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
+@binding(0) @group(4) var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
-[[binding(1), group(4)]] var<storage, read> tint_pulling_vertex_buffer_1 : TintVertexData;
+@binding(1) @group(4) var<storage, read> tint_pulling_vertex_buffer_1 : TintVertexData;
 
 struct Inputs {
-  [[location(0)]]
+  @location(0)
   var_a : f32;
-  [[location(1)]]
+  @location(1)
   var_b : f32;
 }
 
 struct Indices {
-  [[builtin(vertex_index)]]
+  @builtin(vertex_index)
   custom_vertex_index : u32;
-  [[builtin(instance_index)]]
+  @builtin(instance_index)
   custom_instance_index : u32;
 }
 
-[[stage(vertex)]]
-fn main(indices : Indices) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(indices : Indices) -> @builtin(position) vec4<f32> {
   var inputs : Inputs;
   {
     let buffer_array_base_0 = indices.custom_vertex_index;
@@ -504,22 +504,22 @@
 
 TEST_F(VertexPullingTest, TwoAttributesSameBuffer) {
   auto* src = R"(
-[[stage(vertex)]]
-fn main([[location(0)]] var_a : f32,
-        [[location(1)]] var_b : vec4<f32>) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(@location(0) var_a : f32,
+        @location(1) var_b : vec4<f32>) -> @builtin(position) vec4<f32> {
   return vec4<f32>();
 }
 )";
 
   auto* expect = R"(
 struct TintVertexData {
-  tint_vertex_data : [[stride(4)]] array<u32>;
+  tint_vertex_data : @stride(4) array<u32>;
 }
 
-[[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
+@binding(0) @group(4) var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
-[[stage(vertex)]]
-fn main([[builtin(vertex_index)]] tint_pulling_vertex_index : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(@builtin(vertex_index) tint_pulling_vertex_index : u32) -> @builtin(position) vec4<f32> {
   var var_a : f32;
   var var_b : vec4<f32>;
   {
@@ -547,28 +547,28 @@
 
 TEST_F(VertexPullingTest, FloatVectorAttributes) {
   auto* src = R"(
-[[stage(vertex)]]
-fn main([[location(0)]] var_a : vec2<f32>,
-        [[location(1)]] var_b : vec3<f32>,
-        [[location(2)]] var_c : vec4<f32>
-        ) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(@location(0) var_a : vec2<f32>,
+        @location(1) var_b : vec3<f32>,
+        @location(2) var_c : vec4<f32>
+        ) -> @builtin(position) vec4<f32> {
   return vec4<f32>();
 }
 )";
 
   auto* expect = R"(
 struct TintVertexData {
-  tint_vertex_data : [[stride(4)]] array<u32>;
+  tint_vertex_data : @stride(4) array<u32>;
 }
 
-[[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
+@binding(0) @group(4) var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
-[[binding(1), group(4)]] var<storage, read> tint_pulling_vertex_buffer_1 : TintVertexData;
+@binding(1) @group(4) var<storage, read> tint_pulling_vertex_buffer_1 : TintVertexData;
 
-[[binding(2), group(4)]] var<storage, read> tint_pulling_vertex_buffer_2 : TintVertexData;
+@binding(2) @group(4) var<storage, read> tint_pulling_vertex_buffer_2 : TintVertexData;
 
-[[stage(vertex)]]
-fn main([[builtin(vertex_index)]] tint_pulling_vertex_index : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(@builtin(vertex_index) tint_pulling_vertex_index : u32) -> @builtin(position) vec4<f32> {
   var var_a : vec2<f32>;
   var var_b : vec3<f32>;
   var var_c : vec4<f32>;
@@ -601,9 +601,9 @@
 
 TEST_F(VertexPullingTest, AttemptSymbolCollision) {
   auto* src = R"(
-[[stage(vertex)]]
-fn main([[location(0)]] var_a : f32,
-        [[location(1)]] var_b : vec4<f32>) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(@location(0) var_a : f32,
+        @location(1) var_b : vec4<f32>) -> @builtin(position) vec4<f32> {
   var tint_pulling_vertex_index : i32;
   var tint_pulling_vertex_buffer_0 : i32;
   var tint_vertex_data : i32;
@@ -614,13 +614,13 @@
 
   auto* expect = R"(
 struct TintVertexData {
-  tint_vertex_data_1 : [[stride(4)]] array<u32>;
+  tint_vertex_data_1 : @stride(4) array<u32>;
 }
 
-[[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0_1 : TintVertexData;
+@binding(0) @group(4) var<storage, read> tint_pulling_vertex_buffer_0_1 : TintVertexData;
 
-[[stage(vertex)]]
-fn main([[builtin(vertex_index)]] tint_pulling_vertex_index_1 : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(@builtin(vertex_index) tint_pulling_vertex_index_1 : u32) -> @builtin(position) vec4<f32> {
   var var_a : f32;
   var var_b : vec4<f32>;
   {
@@ -652,52 +652,52 @@
 
 TEST_F(VertexPullingTest, FormatsAligned) {
   auto* src = R"(
-[[stage(vertex)]]
+@stage(vertex)
 fn main(
-    [[location(0)]] uint8x2 : vec2<u32>,
-    [[location(1)]] uint8x4 : vec4<u32>,
-    [[location(2)]] sint8x2 : vec2<i32>,
-    [[location(3)]] sint8x4 : vec4<i32>,
-    [[location(4)]] unorm8x2 : vec2<f32>,
-    [[location(5)]] unorm8x4 : vec4<f32>,
-    [[location(6)]] snorm8x2 : vec2<f32>,
-    [[location(7)]] snorm8x4 : vec4<f32>,
-    [[location(8)]] uint16x2 : vec2<u32>,
-    [[location(9)]] uint16x4 : vec4<u32>,
-    [[location(10)]] sint16x2 : vec2<i32>,
-    [[location(11)]] sint16x4 : vec4<i32>,
-    [[location(12)]] unorm16x2 : vec2<f32>,
-    [[location(13)]] unorm16x4 : vec4<f32>,
-    [[location(14)]] snorm16x2 : vec2<f32>,
-    [[location(15)]] snorm16x4 : vec4<f32>,
-    [[location(16)]] float16x2 : vec2<f32>,
-    [[location(17)]] float16x4 : vec4<f32>,
-    [[location(18)]] float32 : f32,
-    [[location(19)]] float32x2 : vec2<f32>,
-    [[location(20)]] float32x3 : vec3<f32>,
-    [[location(21)]] float32x4 : vec4<f32>,
-    [[location(22)]] uint32 : u32,
-    [[location(23)]] uint32x2 : vec2<u32>,
-    [[location(24)]] uint32x3 : vec3<u32>,
-    [[location(25)]] uint32x4 : vec4<u32>,
-    [[location(26)]] sint32 : i32,
-    [[location(27)]] sint32x2 : vec2<i32>,
-    [[location(28)]] sint32x3 : vec3<i32>,
-    [[location(29)]] sint32x4 : vec4<i32>
-  ) -> [[builtin(position)]] vec4<f32> {
+    @location(0) uint8x2 : vec2<u32>,
+    @location(1) uint8x4 : vec4<u32>,
+    @location(2) sint8x2 : vec2<i32>,
+    @location(3) sint8x4 : vec4<i32>,
+    @location(4) unorm8x2 : vec2<f32>,
+    @location(5) unorm8x4 : vec4<f32>,
+    @location(6) snorm8x2 : vec2<f32>,
+    @location(7) snorm8x4 : vec4<f32>,
+    @location(8) uint16x2 : vec2<u32>,
+    @location(9) uint16x4 : vec4<u32>,
+    @location(10) sint16x2 : vec2<i32>,
+    @location(11) sint16x4 : vec4<i32>,
+    @location(12) unorm16x2 : vec2<f32>,
+    @location(13) unorm16x4 : vec4<f32>,
+    @location(14) snorm16x2 : vec2<f32>,
+    @location(15) snorm16x4 : vec4<f32>,
+    @location(16) float16x2 : vec2<f32>,
+    @location(17) float16x4 : vec4<f32>,
+    @location(18) float32 : f32,
+    @location(19) float32x2 : vec2<f32>,
+    @location(20) float32x3 : vec3<f32>,
+    @location(21) float32x4 : vec4<f32>,
+    @location(22) uint32 : u32,
+    @location(23) uint32x2 : vec2<u32>,
+    @location(24) uint32x3 : vec3<u32>,
+    @location(25) uint32x4 : vec4<u32>,
+    @location(26) sint32 : i32,
+    @location(27) sint32x2 : vec2<i32>,
+    @location(28) sint32x3 : vec3<i32>,
+    @location(29) sint32x4 : vec4<i32>
+  ) -> @builtin(position) vec4<f32> {
   return vec4<f32>(0.0, 0.0, 0.0, 1.0);
 }
 )";
 
   auto* expect = R"(
 struct TintVertexData {
-  tint_vertex_data : [[stride(4)]] array<u32>;
+  tint_vertex_data : @stride(4) array<u32>;
 }
 
-[[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
+@binding(0) @group(4) var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
-[[stage(vertex)]]
-fn main([[builtin(vertex_index)]] tint_pulling_vertex_index : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(@builtin(vertex_index) tint_pulling_vertex_index : u32) -> @builtin(position) vec4<f32> {
   var uint8x2 : vec2<u32>;
   var uint8x4 : vec4<u32>;
   var sint8x2 : vec2<i32>;
@@ -811,39 +811,39 @@
 
 TEST_F(VertexPullingTest, FormatsStrideUnaligned) {
   auto* src = R"(
-[[stage(vertex)]]
+@stage(vertex)
 fn main(
-    [[location(0)]] uint8x2 : vec2<u32>,
-    [[location(1)]] uint8x4 : vec4<u32>,
-    [[location(2)]] sint8x2 : vec2<i32>,
-    [[location(3)]] sint8x4 : vec4<i32>,
-    [[location(4)]] unorm8x2 : vec2<f32>,
-    [[location(5)]] unorm8x4 : vec4<f32>,
-    [[location(6)]] snorm8x2 : vec2<f32>,
-    [[location(7)]] snorm8x4 : vec4<f32>,
-    [[location(8)]] uint16x2 : vec2<u32>,
-    [[location(9)]] uint16x4 : vec4<u32>,
-    [[location(10)]] sint16x2 : vec2<i32>,
-    [[location(11)]] sint16x4 : vec4<i32>,
-    [[location(12)]] unorm16x2 : vec2<f32>,
-    [[location(13)]] unorm16x4 : vec4<f32>,
-    [[location(14)]] snorm16x2 : vec2<f32>,
-    [[location(15)]] snorm16x4 : vec4<f32>,
-    [[location(16)]] float16x2 : vec2<f32>,
-    [[location(17)]] float16x4 : vec4<f32>,
-    [[location(18)]] float32 : f32,
-    [[location(19)]] float32x2 : vec2<f32>,
-    [[location(20)]] float32x3 : vec3<f32>,
-    [[location(21)]] float32x4 : vec4<f32>,
-    [[location(22)]] uint32 : u32,
-    [[location(23)]] uint32x2 : vec2<u32>,
-    [[location(24)]] uint32x3 : vec3<u32>,
-    [[location(25)]] uint32x4 : vec4<u32>,
-    [[location(26)]] sint32 : i32,
-    [[location(27)]] sint32x2 : vec2<i32>,
-    [[location(28)]] sint32x3 : vec3<i32>,
-    [[location(29)]] sint32x4 : vec4<i32>
-  ) -> [[builtin(position)]] vec4<f32> {
+    @location(0) uint8x2 : vec2<u32>,
+    @location(1) uint8x4 : vec4<u32>,
+    @location(2) sint8x2 : vec2<i32>,
+    @location(3) sint8x4 : vec4<i32>,
+    @location(4) unorm8x2 : vec2<f32>,
+    @location(5) unorm8x4 : vec4<f32>,
+    @location(6) snorm8x2 : vec2<f32>,
+    @location(7) snorm8x4 : vec4<f32>,
+    @location(8) uint16x2 : vec2<u32>,
+    @location(9) uint16x4 : vec4<u32>,
+    @location(10) sint16x2 : vec2<i32>,
+    @location(11) sint16x4 : vec4<i32>,
+    @location(12) unorm16x2 : vec2<f32>,
+    @location(13) unorm16x4 : vec4<f32>,
+    @location(14) snorm16x2 : vec2<f32>,
+    @location(15) snorm16x4 : vec4<f32>,
+    @location(16) float16x2 : vec2<f32>,
+    @location(17) float16x4 : vec4<f32>,
+    @location(18) float32 : f32,
+    @location(19) float32x2 : vec2<f32>,
+    @location(20) float32x3 : vec3<f32>,
+    @location(21) float32x4 : vec4<f32>,
+    @location(22) uint32 : u32,
+    @location(23) uint32x2 : vec2<u32>,
+    @location(24) uint32x3 : vec3<u32>,
+    @location(25) uint32x4 : vec4<u32>,
+    @location(26) sint32 : i32,
+    @location(27) sint32x2 : vec2<i32>,
+    @location(28) sint32x3 : vec3<i32>,
+    @location(29) sint32x4 : vec4<i32>
+  ) -> @builtin(position) vec4<f32> {
   return vec4<f32>(0.0, 0.0, 0.0, 1.0);
 }
 )";
@@ -851,13 +851,13 @@
   auto* expect =
       R"(
 struct TintVertexData {
-  tint_vertex_data : [[stride(4)]] array<u32>;
+  tint_vertex_data : @stride(4) array<u32>;
 }
 
-[[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
+@binding(0) @group(4) var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
-[[stage(vertex)]]
-fn main([[builtin(vertex_index)]] tint_pulling_vertex_index : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(@builtin(vertex_index) tint_pulling_vertex_index : u32) -> @builtin(position) vec4<f32> {
   var uint8x2 : vec2<u32>;
   var uint8x4 : vec4<u32>;
   var sint8x2 : vec2<i32>;
@@ -971,52 +971,52 @@
 
 TEST_F(VertexPullingTest, FormatsWithVectorsResized) {
   auto* src = R"(
-[[stage(vertex)]]
+@stage(vertex)
 fn main(
-    [[location(0)]] uint8x2 : vec3<u32>,
-    [[location(1)]] uint8x4 : vec2<u32>,
-    [[location(2)]] sint8x2 : i32,
-    [[location(3)]] sint8x4 : vec2<i32>,
-    [[location(4)]] unorm8x2 : vec4<f32>,
-    [[location(5)]] unorm8x4 : f32,
-    [[location(6)]] snorm8x2 : vec3<f32>,
-    [[location(7)]] snorm8x4 : f32,
-    [[location(8)]] uint16x2 : vec3<u32>,
-    [[location(9)]] uint16x4 : vec2<u32>,
-    [[location(10)]] sint16x2 : vec4<i32>,
-    [[location(11)]] sint16x4 : i32,
-    [[location(12)]] unorm16x2 : vec3<f32>,
-    [[location(13)]] unorm16x4 : f32,
-    [[location(14)]] snorm16x2 : vec4<f32>,
-    [[location(15)]] snorm16x4 : vec3<f32>,
-    [[location(16)]] float16x2 : vec4<f32>,
-    [[location(17)]] float16x4 : f32,
-    [[location(18)]] float32 : vec4<f32>,
-    [[location(19)]] float32x2 : vec4<f32>,
-    [[location(20)]] float32x3 : vec2<f32>,
-    [[location(21)]] float32x4 : vec3<f32>,
-    [[location(22)]] uint32 : vec3<u32>,
-    [[location(23)]] uint32x2 : vec4<u32>,
-    [[location(24)]] uint32x3 : vec4<u32>,
-    [[location(25)]] uint32x4 : vec2<u32>,
-    [[location(26)]] sint32 : vec4<i32>,
-    [[location(27)]] sint32x2 : vec3<i32>,
-    [[location(28)]] sint32x3 : i32,
-    [[location(29)]] sint32x4 : vec2<i32>
-  ) -> [[builtin(position)]] vec4<f32> {
+    @location(0) uint8x2 : vec3<u32>,
+    @location(1) uint8x4 : vec2<u32>,
+    @location(2) sint8x2 : i32,
+    @location(3) sint8x4 : vec2<i32>,
+    @location(4) unorm8x2 : vec4<f32>,
+    @location(5) unorm8x4 : f32,
+    @location(6) snorm8x2 : vec3<f32>,
+    @location(7) snorm8x4 : f32,
+    @location(8) uint16x2 : vec3<u32>,
+    @location(9) uint16x4 : vec2<u32>,
+    @location(10) sint16x2 : vec4<i32>,
+    @location(11) sint16x4 : i32,
+    @location(12) unorm16x2 : vec3<f32>,
+    @location(13) unorm16x4 : f32,
+    @location(14) snorm16x2 : vec4<f32>,
+    @location(15) snorm16x4 : vec3<f32>,
+    @location(16) float16x2 : vec4<f32>,
+    @location(17) float16x4 : f32,
+    @location(18) float32 : vec4<f32>,
+    @location(19) float32x2 : vec4<f32>,
+    @location(20) float32x3 : vec2<f32>,
+    @location(21) float32x4 : vec3<f32>,
+    @location(22) uint32 : vec3<u32>,
+    @location(23) uint32x2 : vec4<u32>,
+    @location(24) uint32x3 : vec4<u32>,
+    @location(25) uint32x4 : vec2<u32>,
+    @location(26) sint32 : vec4<i32>,
+    @location(27) sint32x2 : vec3<i32>,
+    @location(28) sint32x3 : i32,
+    @location(29) sint32x4 : vec2<i32>
+  ) -> @builtin(position) vec4<f32> {
   return vec4<f32>(0.0, 0.0, 0.0, 1.0);
 }
 )";
 
   auto* expect = R"(
 struct TintVertexData {
-  tint_vertex_data : [[stride(4)]] array<u32>;
+  tint_vertex_data : @stride(4) array<u32>;
 }
 
-[[binding(0), group(4)]] var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
+@binding(0) @group(4) var<storage, read> tint_pulling_vertex_buffer_0 : TintVertexData;
 
-[[stage(vertex)]]
-fn main([[builtin(vertex_index)]] tint_pulling_vertex_index : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(@builtin(vertex_index) tint_pulling_vertex_index : u32) -> @builtin(position) vec4<f32> {
   var uint8x2 : vec3<u32>;
   var uint8x4 : vec2<u32>;
   var sint8x2 : i32;
diff --git a/src/transform/zero_init_workgroup_memory_test.cc b/src/transform/zero_init_workgroup_memory_test.cc
index 166036e..d23e0af 100644
--- a/src/transform/zero_init_workgroup_memory_test.cc
+++ b/src/transform/zero_init_workgroup_memory_test.cc
@@ -60,7 +60,7 @@
   b = c;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
 }
 )";
@@ -75,16 +75,16 @@
   auto* src = R"(
 var<workgroup> v : i32;
 
-[[stage(compute), workgroup_size(1)]]
-fn f([[builtin(local_invocation_index)]] local_idx : u32) {
+@stage(compute) @workgroup_size(1)
+fn f(@builtin(local_invocation_index) local_idx : u32) {
   ignore(v); // Initialization should be inserted above this statement
 }
 )";
   auto* expect = R"(
 var<workgroup> v : i32;
 
-[[stage(compute), workgroup_size(1)]]
-fn f([[builtin(local_invocation_index)]] local_idx : u32) {
+@stage(compute) @workgroup_size(1)
+fn f(@builtin(local_invocation_index) local_idx : u32) {
   {
     v = i32();
   }
@@ -104,10 +104,10 @@
 var<workgroup> v : i32;
 
 struct Params {
-  [[builtin(local_invocation_index)]] local_idx : u32;
+  @builtin(local_invocation_index) local_idx : u32;
 };
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f(params : Params) {
   ignore(v); // Initialization should be inserted above this statement
 }
@@ -116,11 +116,11 @@
 var<workgroup> v : i32;
 
 struct Params {
-  [[builtin(local_invocation_index)]]
+  @builtin(local_invocation_index)
   local_idx : u32;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f(params : Params) {
   {
     v = i32();
@@ -139,7 +139,7 @@
   auto* src = R"(
 var<workgroup> v : i32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   ignore(v); // Initialization should be inserted above this statement
 }
@@ -147,8 +147,8 @@
   auto* expect = R"(
 var<workgroup> v : i32;
 
-[[stage(compute), workgroup_size(1)]]
-fn f([[builtin(local_invocation_index)]] local_invocation_index : u32) {
+@stage(compute) @workgroup_size(1)
+fn f(@builtin(local_invocation_index) local_invocation_index : u32) {
   {
     v = i32();
   }
@@ -176,8 +176,8 @@
 
 var<workgroup> c : array<S, 32>;
 
-[[stage(compute), workgroup_size(1)]]
-fn f([[builtin(local_invocation_index)]] local_idx : u32) {
+@stage(compute) @workgroup_size(1)
+fn f(@builtin(local_invocation_index) local_idx : u32) {
   ignore(a); // Initialization should be inserted above this statement
   ignore(b);
   ignore(c);
@@ -195,8 +195,8 @@
 
 var<workgroup> c : array<S, 32>;
 
-[[stage(compute), workgroup_size(1)]]
-fn f([[builtin(local_invocation_index)]] local_idx : u32) {
+@stage(compute) @workgroup_size(1)
+fn f(@builtin(local_invocation_index) local_idx : u32) {
   {
     a = i32();
     b.x = i32();
@@ -240,8 +240,8 @@
 
 var<workgroup> c : array<S, 32>;
 
-[[stage(compute), workgroup_size(2, 3)]]
-fn f([[builtin(local_invocation_index)]] local_idx : u32) {
+@stage(compute) @workgroup_size(2, 3)
+fn f(@builtin(local_invocation_index) local_idx : u32) {
   ignore(a); // Initialization should be inserted above this statement
   ignore(b);
   ignore(c);
@@ -259,8 +259,8 @@
 
 var<workgroup> c : array<S, 32>;
 
-[[stage(compute), workgroup_size(2, 3)]]
-fn f([[builtin(local_invocation_index)]] local_idx : u32) {
+@stage(compute) @workgroup_size(2, 3)
+fn f(@builtin(local_invocation_index) local_idx : u32) {
   if ((local_idx < 1u)) {
     a = i32();
     b.x = i32();
@@ -304,10 +304,10 @@
 
 var<workgroup> c : array<S, 32>;
 
-[[override(1)]] let X : i32;
+@override(1) let X : i32;
 
-[[stage(compute), workgroup_size(2, 3, X)]]
-fn f([[builtin(local_invocation_index)]] local_idx : u32) {
+@stage(compute) @workgroup_size(2, 3, X)
+fn f(@builtin(local_invocation_index) local_idx : u32) {
   ignore(a); // Initialization should be inserted above this statement
   ignore(b);
   ignore(c);
@@ -326,10 +326,10 @@
 
 var<workgroup> c : array<S, 32>;
 
-[[override(1)]] let X : i32;
+@override(1) let X : i32;
 
-[[stage(compute), workgroup_size(2, 3, X)]]
-fn f([[builtin(local_invocation_index)]] local_idx : u32) {
+@stage(compute) @workgroup_size(2, 3, X)
+fn f(@builtin(local_invocation_index) local_idx : u32) {
   for(var idx : u32 = local_idx; (idx < 1u); idx = (idx + (u32(X) * 6u))) {
     a = i32();
     b.x = i32();
@@ -374,10 +374,10 @@
 
 var<workgroup> c : array<S, 32>;
 
-[[override(1)]] let X : u32;
+@override(1) let X : u32;
 
-[[stage(compute), workgroup_size(5u, X, 10u)]]
-fn f([[builtin(local_invocation_index)]] local_idx : u32) {
+@stage(compute) @workgroup_size(5u, X, 10u)
+fn f(@builtin(local_invocation_index) local_idx : u32) {
   ignore(a); // Initialization should be inserted above this statement
   ignore(b);
   ignore(c);
@@ -397,10 +397,10 @@
 
 var<workgroup> c : array<S, 32>;
 
-[[override(1)]] let X : u32;
+@override(1) let X : u32;
 
-[[stage(compute), workgroup_size(5u, X, 10u)]]
-fn f([[builtin(local_invocation_index)]] local_idx : u32) {
+@stage(compute) @workgroup_size(5u, X, 10u)
+fn f(@builtin(local_invocation_index) local_idx : u32) {
   for(var idx : u32 = local_idx; (idx < 1u); idx = (idx + (X * 50u))) {
     a = i32();
   }
@@ -462,8 +462,8 @@
 
 var<workgroup> c : array<S, 32>;
 
-[[stage(compute), workgroup_size(1)]]
-fn f([[builtin(local_invocation_id)]] local_invocation_id : vec3<u32>) {
+@stage(compute) @workgroup_size(1)
+fn f(@builtin(local_invocation_id) local_invocation_id : vec3<u32>) {
   ignore(a); // Initialization should be inserted above this statement
   ignore(b);
   ignore(c);
@@ -481,8 +481,8 @@
 
 var<workgroup> c : array<S, 32>;
 
-[[stage(compute), workgroup_size(1)]]
-fn f([[builtin(local_invocation_id)]] local_invocation_id : vec3<u32>, [[builtin(local_invocation_index)]] local_invocation_index : u32) {
+@stage(compute) @workgroup_size(1)
+fn f(@builtin(local_invocation_id) local_invocation_id : vec3<u32>, @builtin(local_invocation_index) local_invocation_index : u32) {
   {
     a = i32();
     b.x = i32();
@@ -525,18 +525,18 @@
 
 var<workgroup> c : array<S, 32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f1() {
   ignore(a); // Initialization should be inserted above this statement
   ignore(c);
 }
 
-[[stage(compute), workgroup_size(1, 2, 3)]]
-fn f2([[builtin(local_invocation_id)]] local_invocation_id : vec3<u32>) {
+@stage(compute) @workgroup_size(1, 2, 3)
+fn f2(@builtin(local_invocation_id) local_invocation_id : vec3<u32>) {
   ignore(b); // Initialization should be inserted above this statement
 }
 
-[[stage(compute), workgroup_size(4, 5, 6)]]
+@stage(compute) @workgroup_size(4, 5, 6)
 fn f3() {
   ignore(c); // Initialization should be inserted above this statement
   ignore(a);
@@ -554,8 +554,8 @@
 
 var<workgroup> c : array<S, 32>;
 
-[[stage(compute), workgroup_size(1)]]
-fn f1([[builtin(local_invocation_index)]] local_invocation_index : u32) {
+@stage(compute) @workgroup_size(1)
+fn f1(@builtin(local_invocation_index) local_invocation_index : u32) {
   {
     a = i32();
   }
@@ -573,8 +573,8 @@
   ignore(c);
 }
 
-[[stage(compute), workgroup_size(1, 2, 3)]]
-fn f2([[builtin(local_invocation_id)]] local_invocation_id : vec3<u32>, [[builtin(local_invocation_index)]] local_invocation_index_1 : u32) {
+@stage(compute) @workgroup_size(1, 2, 3)
+fn f2(@builtin(local_invocation_id) local_invocation_id : vec3<u32>, @builtin(local_invocation_index) local_invocation_index_1 : u32) {
   if ((local_invocation_index_1 < 1u)) {
     b.x = i32();
   }
@@ -586,8 +586,8 @@
   ignore(b);
 }
 
-[[stage(compute), workgroup_size(4, 5, 6)]]
-fn f3([[builtin(local_invocation_index)]] local_invocation_index_2 : u32) {
+@stage(compute) @workgroup_size(4, 5, 6)
+fn f3(@builtin(local_invocation_index) local_invocation_index_2 : u32) {
   if ((local_invocation_index_2 < 1u)) {
     a = i32();
   }
@@ -623,8 +623,8 @@
   use_v();
 }
 
-[[stage(compute), workgroup_size(1)]]
-fn f([[builtin(local_invocation_index)]] local_idx : u32) {
+@stage(compute) @workgroup_size(1)
+fn f(@builtin(local_invocation_index) local_idx : u32) {
   call_use_v(); // Initialization should be inserted above this statement
 }
 )";
@@ -639,8 +639,8 @@
   use_v();
 }
 
-[[stage(compute), workgroup_size(1)]]
-fn f([[builtin(local_invocation_index)]] local_idx : u32) {
+@stage(compute) @workgroup_size(1)
+fn f(@builtin(local_invocation_index) local_idx : u32) {
   {
     v = i32();
   }
@@ -659,7 +659,7 @@
 var<workgroup> i : atomic<i32>;
 var<workgroup> u : atomic<u32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   ignore(i); // Initialization should be inserted above this statement
   ignore(u);
@@ -670,8 +670,8 @@
 
 var<workgroup> u : atomic<u32>;
 
-[[stage(compute), workgroup_size(1)]]
-fn f([[builtin(local_invocation_index)]] local_invocation_index : u32) {
+@stage(compute) @workgroup_size(1)
+fn f(@builtin(local_invocation_index) local_invocation_index : u32) {
   {
     atomicStore(&(i), i32());
     atomicStore(&(u), u32());
@@ -699,7 +699,7 @@
 
 var<workgroup> w : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   ignore(w); // Initialization should be inserted above this statement
 }
@@ -715,8 +715,8 @@
 
 var<workgroup> w : S;
 
-[[stage(compute), workgroup_size(1)]]
-fn f([[builtin(local_invocation_index)]] local_invocation_index : u32) {
+@stage(compute) @workgroup_size(1)
+fn f(@builtin(local_invocation_index) local_invocation_index : u32) {
   {
     w.a = i32();
     atomicStore(&(w.i), i32());
@@ -738,7 +738,7 @@
   auto* src = R"(
 var<workgroup> w : array<atomic<u32>, 4>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   ignore(w); // Initialization should be inserted above this statement
 }
@@ -746,8 +746,8 @@
   auto* expect = R"(
 var<workgroup> w : array<atomic<u32>, 4>;
 
-[[stage(compute), workgroup_size(1)]]
-fn f([[builtin(local_invocation_index)]] local_invocation_index : u32) {
+@stage(compute) @workgroup_size(1)
+fn f(@builtin(local_invocation_index) local_invocation_index : u32) {
   for(var idx : u32 = local_invocation_index; (idx < 4u); idx = (idx + 1u)) {
     let i : u32 = idx;
     atomicStore(&(w[i]), u32());
@@ -774,7 +774,7 @@
 
 var<workgroup> w : array<S, 4>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   ignore(w); // Initialization should be inserted above this statement
 }
@@ -790,8 +790,8 @@
 
 var<workgroup> w : array<S, 4>;
 
-[[stage(compute), workgroup_size(1)]]
-fn f([[builtin(local_invocation_index)]] local_invocation_index : u32) {
+@stage(compute) @workgroup_size(1)
+fn f(@builtin(local_invocation_index) local_invocation_index : u32) {
   for(var idx : u32 = local_invocation_index; (idx < 4u); idx = (idx + 1u)) {
     let i_1 : u32 = idx;
     w[i_1].a = i32();
diff --git a/src/writer/glsl/generator_impl_function_test.cc b/src/writer/glsl/generator_impl_function_test.cc
index 3d710f4..19aae88 100644
--- a/src/writer/glsl/generator_impl_function_test.cc
+++ b/src/writer/glsl/generator_impl_function_test.cc
@@ -127,7 +127,7 @@
 
 TEST_F(GlslGeneratorImplTest_Function,
        Emit_Decoration_EntryPoint_WithInOutVars) {
-  // fn frag_main([[location(0)]] foo : f32) -> [[location(1)]] f32 {
+  // fn frag_main(@location(0) foo : f32) -> @location(1) f32 {
   //   return foo;
   // }
   auto* foo_in = Param("foo", ty.f32(), {Location(0)});
@@ -173,7 +173,7 @@
 
 TEST_F(GlslGeneratorImplTest_Function,
        Emit_Decoration_EntryPoint_WithInOut_Builtins) {
-  // fn frag_main([[position(0)]] coord : vec4<f32>) -> [[frag_depth]] f32 {
+  // fn frag_main(@position(0) coord : vec4<f32>) -> @frag_depth f32 {
   //   return coord.x;
   // }
   auto* coord_in =
@@ -221,9 +221,9 @@
 TEST_F(GlslGeneratorImplTest_Function,
        Emit_Decoration_EntryPoint_SharedStruct_DifferentStages) {
   // struct Interface {
-  //   [[builtin(position)]] pos : vec4<f32>;
-  //   [[location(1)]] col1 : f32;
-  //   [[location(2)]] col2 : f32;
+  //   @builtin(position) pos : vec4<f32>;
+  //   @location(1) col1 : f32;
+  //   @location(2) col2 : f32;
   // };
   // fn vert_main() -> Interface {
   //   return Interface(vec4<f32>(), 0.4, 0.6);
@@ -332,7 +332,7 @@
 TEST_F(GlslGeneratorImplTest_Function,
        Emit_Decoration_EntryPoint_SharedStruct_HelperFunction) {
   // struct VertexOutput {
-  //   [[builtin(position)]] pos : vec4<f32>;
+  //   @builtin(position) pos : vec4<f32>;
   // };
   // fn foo(x : f32) -> VertexOutput {
   //   return VertexOutput(vec4<f32>(x, x, x, 1.0));
@@ -1032,15 +1032,15 @@
   // [[block]] struct Data {
   //   d : f32;
   // };
-  // [[binding(0), group(0)]] var<storage> data : Data;
+  // @binding(0) @group(0) var<storage> data : Data;
   //
-  // [[stage(compute), workgroup_size(1)]]
+  // @stage(compute) @workgroup_size(1)
   // fn a() {
   //   var v = data.d;
   //   return;
   // }
   //
-  // [[stage(compute), workgroup_size(1)]]
+  // @stage(compute) @workgroup_size(1)
   // fn b() {
   //   var v = data.d;
   //   return;
diff --git a/src/writer/glsl/generator_impl_member_accessor_test.cc b/src/writer/glsl/generator_impl_member_accessor_test.cc
index 36809b3..07eeaa4 100644
--- a/src/writer/glsl/generator_impl_member_accessor_test.cc
+++ b/src/writer/glsl/generator_impl_member_accessor_test.cc
@@ -372,7 +372,7 @@
 TEST_F(GlslGeneratorImplTest_MemberAccessor,
        EmitExpression_IndexAccessor_StorageBuffer_Load_Int_FromArray) {
   // struct Data {
-  //   a : [[stride(4)]] array<i32, 5>;
+  //   a : @stride(4) array<i32, 5>;
   // };
   // var<storage> data : Data;
   // data.a[2];
@@ -420,7 +420,7 @@
 TEST_F(GlslGeneratorImplTest_MemberAccessor,
        EmitExpression_IndexAccessor_StorageBuffer_Load_Int_FromArray_ExprIdx) {
   // struct Data {
-  //   a : [[stride(4)]] array<i32, 5>;
+  //   a : @stride(4) array<i32, 5>;
   // };
   // var<storage> data : Data;
   // data.a[(2 + 4) - 3];
@@ -468,7 +468,7 @@
 
 TEST_F(GlslGeneratorImplTest_MemberAccessor, StorageBuffer_Store_ToArray) {
   // struct Data {
-  //   a : [[stride(4)]] array<i32, 5>;
+  //   a : @stride(4) array<i32, 5>;
   // };
   // var<storage> data : Data;
   // data.a[2] = 2;
@@ -518,7 +518,7 @@
   //   b : vec3<f32>;
   // };
   // struct Data {
-  //   var c : [[stride(32)]] array<Inner, 4>;
+  //   var c : @stride(32) array<Inner, 4>;
   // };
   //
   // var<storage> data : Pre;
@@ -578,7 +578,7 @@
   //   b : vec3<f32>;
   // };
   // struct Data {
-  //   var c : [[stride(32)]] array<Inner, 4>;
+  //   var c : @stride(32) array<Inner, 4>;
   // };
   //
   // var<storage> data : Pre;
@@ -640,7 +640,7 @@
   //   b : vec3<f32>;
   // };
   // struct Data {
-  //   var c : [[stride(32)]] array<Inner, 4>;
+  //   var c : @stride(32) array<Inner, 4>;
   // };
   //
   // var<storage> data : Pre;
@@ -702,7 +702,7 @@
   //   b : vec3<f32>;
   // };
   // struct Data {
-  //   var c : [[stride(32)]] array<Inner, 4>;
+  //   var c : @stride(32) array<Inner, 4>;
   // };
   //
   // var<storage> data : Pre;
@@ -763,7 +763,7 @@
   //   b : vec3<f32>;
   // };
   // struct Data {
-  //   var c : [[stride(32)]] array<Inner, 4>;
+  //   var c : @stride(32) array<Inner, 4>;
   // };
   //
   // var<storage> data : Pre;
@@ -822,7 +822,7 @@
   //   b : vec3<f32>;
   // };
   // struct Data {
-  //   var c : [[stride(32)]] array<Inner, 4>;
+  //   var c : @stride(32) array<Inner, 4>;
   // };
   //
   // var<storage> data : Pre;
diff --git a/src/writer/hlsl/generator_impl_function_test.cc b/src/writer/hlsl/generator_impl_function_test.cc
index 3af0f4f..7688e85 100644
--- a/src/writer/hlsl/generator_impl_function_test.cc
+++ b/src/writer/hlsl/generator_impl_function_test.cc
@@ -113,7 +113,7 @@
 
 TEST_F(HlslGeneratorImplTest_Function,
        Emit_Decoration_EntryPoint_WithInOutVars) {
-  // fn frag_main([[location(0)]] foo : f32) -> [[location(1)]] f32 {
+  // fn frag_main(@location(0) foo : f32) -> @location(1) f32 {
   //   return foo;
   // }
   auto* foo_in = Param("foo", ty.f32(), {Location(0)});
@@ -145,7 +145,7 @@
 
 TEST_F(HlslGeneratorImplTest_Function,
        Emit_Decoration_EntryPoint_WithInOut_Builtins) {
-  // fn frag_main([[position(0)]] coord : vec4<f32>) -> [[frag_depth]] f32 {
+  // fn frag_main(@position(0) coord : vec4<f32>) -> @frag_depth f32 {
   //   return coord.x;
   // }
   auto* coord_in =
@@ -181,9 +181,9 @@
 TEST_F(HlslGeneratorImplTest_Function,
        Emit_Decoration_EntryPoint_SharedStruct_DifferentStages) {
   // struct Interface {
-  //   [[builtin(position)]] pos : vec4<f32>;
-  //   [[location(1)]] col1 : f32;
-  //   [[location(2)]] col2 : f32;
+  //   @builtin(position) pos : vec4<f32>;
+  //   @location(1) col1 : f32;
+  //   @location(2) col2 : f32;
   // };
   // fn vert_main() -> Interface {
   //   return Interface(vec4<f32>(), 0.4, 0.6);
@@ -265,7 +265,7 @@
 TEST_F(HlslGeneratorImplTest_Function,
        Emit_Decoration_EntryPoint_SharedStruct_HelperFunction) {
   // struct VertexOutput {
-  //   [[builtin(position)]] pos : vec4<f32>;
+  //   @builtin(position) pos : vec4<f32>;
   // };
   // fn foo(x : f32) -> VertexOutput {
   //   return VertexOutput(vec4<f32>(x, x, x, 1.0));
@@ -860,15 +860,15 @@
   // [[block]] struct Data {
   //   d : f32;
   // };
-  // [[binding(0), group(0)]] var<storage> data : Data;
+  // @binding(0) @group(0) var<storage> data : Data;
   //
-  // [[stage(compute), workgroup_size(1)]]
+  // @stage(compute) @workgroup_size(1)
   // fn a() {
   //   var v = data.d;
   //   return;
   // }
   //
-  // [[stage(compute), workgroup_size(1)]]
+  // @stage(compute) @workgroup_size(1)
   // fn b() {
   //   var v = data.d;
   //   return;
diff --git a/src/writer/hlsl/generator_impl_member_accessor_test.cc b/src/writer/hlsl/generator_impl_member_accessor_test.cc
index 195a160..03cf494 100644
--- a/src/writer/hlsl/generator_impl_member_accessor_test.cc
+++ b/src/writer/hlsl/generator_impl_member_accessor_test.cc
@@ -393,7 +393,7 @@
 TEST_F(HlslGeneratorImplTest_MemberAccessor,
        EmitExpression_IndexAccessor_StorageBuffer_Load_Int_FromArray) {
   // struct Data {
-  //   a : [[stride(4)]] array<i32, 5>;
+  //   a : @stride(4) array<i32, 5>;
   // };
   // var<storage> data : Data;
   // data.a[2];
@@ -425,7 +425,7 @@
 TEST_F(HlslGeneratorImplTest_MemberAccessor,
        EmitExpression_IndexAccessor_StorageBuffer_Load_Int_FromArray_ExprIdx) {
   // struct Data {
-  //   a : [[stride(4)]] array<i32, 5>;
+  //   a : @stride(4) array<i32, 5>;
   // };
   // var<storage> data : Data;
   // data.a[(2 + 4) - 3];
@@ -457,7 +457,7 @@
 
 TEST_F(HlslGeneratorImplTest_MemberAccessor, StorageBuffer_Store_ToArray) {
   // struct Data {
-  //   a : [[stride(4)]] array<i32, 5>;
+  //   a : @stride(4) array<i32, 5>;
   // };
   // var<storage> data : Data;
   // data.a[2] = 2;
@@ -491,7 +491,7 @@
   //   b : vec3<f32>;
   // };
   // struct Data {
-  //   var c : [[stride(32)]] array<Inner, 4>;
+  //   var c : @stride(32) array<Inner, 4>;
   // };
   //
   // var<storage> data : Pre;
@@ -533,7 +533,7 @@
   //   b : vec3<f32>;
   // };
   // struct Data {
-  //   var c : [[stride(32)]] array<Inner, 4>;
+  //   var c : @stride(32) array<Inner, 4>;
   // };
   //
   // var<storage> data : Pre;
@@ -577,7 +577,7 @@
   //   b : vec3<f32>;
   // };
   // struct Data {
-  //   var c : [[stride(32)]] array<Inner, 4>;
+  //   var c : @stride(32) array<Inner, 4>;
   // };
   //
   // var<storage> data : Pre;
@@ -621,7 +621,7 @@
   //   b : vec3<f32>;
   // };
   // struct Data {
-  //   var c : [[stride(32)]] array<Inner, 4>;
+  //   var c : @stride(32) array<Inner, 4>;
   // };
   //
   // var<storage> data : Pre;
@@ -664,7 +664,7 @@
   //   b : vec3<f32>;
   // };
   // struct Data {
-  //   var c : [[stride(32)]] array<Inner, 4>;
+  //   var c : @stride(32) array<Inner, 4>;
   // };
   //
   // var<storage> data : Pre;
@@ -705,7 +705,7 @@
   //   b : vec3<f32>;
   // };
   // struct Data {
-  //   var c : [[stride(32)]] array<Inner, 4>;
+  //   var c : @stride(32) array<Inner, 4>;
   // };
   //
   // var<storage> data : Pre;
diff --git a/src/writer/msl/generator_impl_function_test.cc b/src/writer/msl/generator_impl_function_test.cc
index 6ecef9a..7e0e576 100644
--- a/src/writer/msl/generator_impl_function_test.cc
+++ b/src/writer/msl/generator_impl_function_test.cc
@@ -91,7 +91,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_Decoration_EntryPoint_WithInOutVars) {
-  // fn frag_main([[location(0)]] foo : f32) -> [[location(1)]] f32 {
+  // fn frag_main(@location(0) foo : f32) -> @location(1) f32 {
   //   return foo;
   // }
   auto* foo_in = Param("foo", ty.f32(), {Location(0)});
@@ -126,7 +126,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, Emit_Decoration_EntryPoint_WithInOut_Builtins) {
-  // fn frag_main([[position(0)]] coord : vec4<f32>) -> [[frag_depth]] f32 {
+  // fn frag_main(@position(0) coord : vec4<f32>) -> @frag_depth f32 {
   //   return coord.x;
   // }
   auto* coord_in =
@@ -163,9 +163,9 @@
 TEST_F(MslGeneratorImplTest,
        Emit_Decoration_EntryPoint_SharedStruct_DifferentStages) {
   // struct Interface {
-  //   [[location(1)]] col1 : f32;
-  //   [[location(2)]] col2 : f32;
-  //   [[builtin(position)]] pos : vec4<f32>;
+  //   @location(1) col1 : f32;
+  //   @location(2) col2 : f32;
+  //   @builtin(position) pos : vec4<f32>;
   // };
   // fn vert_main() -> Interface {
   //   return Interface(0.4, 0.6, vec4<f32>());
@@ -248,7 +248,7 @@
 TEST_F(MslGeneratorImplTest,
        Emit_Decoration_EntryPoint_SharedStruct_HelperFunction) {
   // struct VertexOutput {
-  //   [[builtin(position)]] pos : vec4<f32>;
+  //   @builtin(position) pos : vec4<f32>;
   // };
   // fn foo(x : f32) -> VertexOutput {
   //   return VertexOutput(vec4<f32>(x, x, x, 1.0));
@@ -643,14 +643,14 @@
   // [[block]] struct Data {
   //   d : f32;
   // };
-  // [[binding(0), group(0)]] var<storage> data : Data;
+  // @binding(0) @group(0) var<storage> data : Data;
   //
-  // [[stage(compute), workgroup_size(1)]]
+  // @stage(compute) @workgroup_size(1)
   // fn a() {
   //   return;
   // }
   //
-  // [[stage(compute), workgroup_size(1)]]
+  // @stage(compute) @workgroup_size(1)
   // fn b() {
   //   return;
   // }
diff --git a/src/writer/spirv/builder_entry_point_test.cc b/src/writer/spirv/builder_entry_point_test.cc
index 57d4eae..46d6745 100644
--- a/src/writer/spirv/builder_entry_point_test.cc
+++ b/src/writer/spirv/builder_entry_point_test.cc
@@ -37,9 +37,9 @@
 using BuilderTest = TestHelper;
 
 TEST_F(BuilderTest, EntryPoint_Parameters) {
-  // [[stage(fragment)]]
-  // fn frag_main([[builtin(position)]] coord : vec4<f32>,
-  //              [[location(1)]] loc1 : f32) {
+  // @stage(fragment)
+  // fn frag_main(@builtin(position) coord : vec4<f32>,
+  //              @location(1) loc1 : f32) {
   //   var col : f32 = (coord.x * loc1);
   // }
   auto* coord =
@@ -106,8 +106,8 @@
 }
 
 TEST_F(BuilderTest, EntryPoint_ReturnValue) {
-  // [[stage(fragment)]]
-  // fn frag_main([[location(0)]] loc_in : u32) -> [[location(0)]] f32 {
+  // @stage(fragment)
+  // fn frag_main(@location(0) loc_in : u32) -> @location(0) f32 {
   //   if (loc_in > 10) {
   //     return 0.5;
   //   }
@@ -183,17 +183,17 @@
 
 TEST_F(BuilderTest, EntryPoint_SharedStruct) {
   // struct Interface {
-  //   [[location(1)]] value : f32;
-  //   [[builtin(position)]] pos : vec4<f32>;
+  //   @location(1) value : f32;
+  //   @builtin(position) pos : vec4<f32>;
   // };
   //
-  // [[stage(vertex)]]
+  // @stage(vertex)
   // fn vert_main() -> Interface {
   //   return Interface(42.0, vec4<f32>());
   // }
   //
-  // [[stage(fragment)]]
-  // fn frag_main(inputs : Interface) -> [[builtin(frag_depth)]] f32 {
+  // @stage(fragment)
+  // fn frag_main(inputs : Interface) -> @builtin(frag_depth) f32 {
   //   return inputs.value;
   // }
 
diff --git a/src/writer/spirv/builder_function_test.cc b/src/writer/spirv/builder_function_test.cc
index 8a9ff94..b86bb4b 100644
--- a/src/writer/spirv/builder_function_test.cc
+++ b/src/writer/spirv/builder_function_test.cc
@@ -189,14 +189,14 @@
   // [[block]] struct Data {
   //   d : f32;
   // };
-  // [[binding(0), group(0)]] var<storage> data : Data;
+  // @binding(0) @group(0) var<storage> data : Data;
   //
-  // [[stage(compute), workgroup_size(1)]]
+  // @stage(compute) @workgroup_size(1)
   // fn a() {
   //   return;
   // }
   //
-  // [[stage(compute), workgroup_size(1)]]
+  // @stage(compute) @workgroup_size(1)
   // fn b() {
   //   return;
   // }
diff --git a/src/writer/spirv/builder_intrinsic_test.cc b/src/writer/spirv/builder_intrinsic_test.cc
index e5da115..114885b 100644
--- a/src/writer/spirv/builder_intrinsic_test.cc
+++ b/src/writer/spirv/builder_intrinsic_test.cc
@@ -1846,9 +1846,9 @@
 
 TEST_F(IntrinsicBuilderTest, Call_ArrayLength_ViaLets_WithPtrNoise) {
   // [[block]] struct my_struct {
-  //   a : [[stride(4)]] array<f32>;
+  //   a : @stride(4) array<f32>;
   // };
-  // [[binding(1), group(2)]] var<storage, read> b : my_struct;
+  // @binding(1) @group(2) var<storage, read> b : my_struct;
   //
   // fn a_func() {
   //   let p = &*&b;
@@ -1913,7 +1913,7 @@
   //   i : atomic<i32>;
   // }
   //
-  // [[binding(1), group(2)]] var<storage, read_write> b : S;
+  // @binding(1) @group(2) var<storage, read_write> b : S;
   //
   // fn a_func() {
   //   let u : u32 = atomicLoad(&b.u);
@@ -1979,7 +1979,7 @@
   //   i : atomic<i32>;
   // }
   //
-  // [[binding(1), group(2)]] var<storage, read_write> b : S;
+  // @binding(1) @group(2) var<storage, read_write> b : S;
   //
   // fn a_func() {
   //   var u = 1u;
@@ -2059,7 +2059,7 @@
   //   v : atomic<i32>;
   // }
   //
-  // [[binding(1), group(2)]] var<storage, read_write> b : S;
+  // @binding(1) @group(2) var<storage, read_write> b : S;
   //
   // fn a_func() {
   //   var v = 10;
@@ -2137,7 +2137,7 @@
   //   v : atomic<u32>;
   // }
   //
-  // [[binding(1), group(2)]] var<storage, read_write> b : S;
+  // @binding(1) @group(2) var<storage, read_write> b : S;
   //
   // fn a_func() {
   //   var v = 10u;
@@ -2213,7 +2213,7 @@
   //   i : atomic<i32>;
   // }
   //
-  // [[binding(1), group(2)]] var<storage, read_write> b : S;
+  // @binding(1) @group(2) var<storage, read_write> b : S;
   //
   // fn a_func() {
   //   var u = 10u;
@@ -2295,7 +2295,7 @@
   //   i : atomic<i32>;
   // }
   //
-  // [[binding(1), group(2)]] var<storage, read_write> b : S;
+  // @binding(1) @group(2) var<storage, read_write> b : S;
   //
   // fn a_func() {
   //   let u : vec2<u32> = atomicCompareExchangeWeak(&b.u, 10u);
diff --git a/src/writer/wgsl/generator_impl.cc b/src/writer/wgsl/generator_impl.cc
index 1295c76..13fd561 100644
--- a/src/writer/wgsl/generator_impl.cc
+++ b/src/writer/wgsl/generator_impl.cc
@@ -369,7 +369,7 @@
   if (auto* ary = ty->As<ast::Array>()) {
     for (auto* deco : ary->decorations) {
       if (auto* stride = deco->As<ast::StrideDecoration>()) {
-        out << "[[stride(" << stride->stride << ")]] ";
+        out << "@stride(" << stride->stride << ") ";
       }
     }
 
@@ -526,7 +526,7 @@
   line() << "struct " << program_->Symbols().NameFor(str->name) << " {";
 
   auto add_padding = [&](uint32_t size) {
-    line() << "[[size(" << size << ")]]";
+    line() << "@size(" << size << ")";
 
     // Note: u32 is the smallest primitive we currently support. When WGSL
     // supports smaller types, this will need to be updated.
@@ -536,7 +536,7 @@
   increment_indent();
   uint32_t offset = 0;
   for (auto* mem : str->members) {
-    // TODO(crbug.com/tint/798) move the [[offset]] decoration handling to the
+    // TODO(crbug.com/tint/798) move the @offset decoration handling to the
     // transform::Wgsl sanitizer.
     if (auto* mem_sem = program_->Sem().Get(mem)) {
       offset = utils::RoundUp(mem_sem->Align(), offset);
@@ -625,14 +625,13 @@
 
 bool GeneratorImpl::EmitDecorations(std::ostream& out,
                                     const ast::DecorationList& decos) {
-  out << "[[";
   bool first = true;
   for (auto* deco : decos) {
     if (!first) {
-      out << ", ";
+      out << " ";
     }
     first = false;
-
+    out << "@";
     if (auto* workgroup = deco->As<ast::WorkgroupDecoration>()) {
       auto values = workgroup->Values();
       out << "workgroup_size(";
@@ -686,7 +685,6 @@
       return false;
     }
   }
-  out << "]]";
 
   return true;
 }
diff --git a/src/writer/wgsl/generator_impl_function_test.cc b/src/writer/wgsl/generator_impl_function_test.cc
index 3aebf94..d8843db 100644
--- a/src/writer/wgsl/generator_impl_function_test.cc
+++ b/src/writer/wgsl/generator_impl_function_test.cc
@@ -76,7 +76,7 @@
   gen.increment_indent();
 
   ASSERT_TRUE(gen.EmitFunction(func));
-  EXPECT_EQ(gen.result(), R"(  [[stage(compute), workgroup_size(2, 4, 6)]]
+  EXPECT_EQ(gen.result(), R"(  @stage(compute) @workgroup_size(2, 4, 6)
   fn my_func() {
     return;
   }
@@ -98,7 +98,7 @@
   gen.increment_indent();
 
   ASSERT_TRUE(gen.EmitFunction(func));
-  EXPECT_EQ(gen.result(), R"(  [[stage(compute), workgroup_size(2, height)]]
+  EXPECT_EQ(gen.result(), R"(  @stage(compute) @workgroup_size(2, height)
   fn my_func() {
     return;
   }
@@ -120,8 +120,8 @@
   gen.increment_indent();
 
   ASSERT_TRUE(gen.EmitFunction(func));
-  EXPECT_EQ(gen.result(), R"(  [[stage(fragment)]]
-  fn frag_main([[builtin(position)]] coord : vec4<f32>, [[location(1)]] loc1 : f32) {
+  EXPECT_EQ(gen.result(), R"(  @stage(fragment)
+  fn frag_main(@builtin(position) coord : vec4<f32>, @location(1) loc1 : f32) {
   }
 )");
 }
@@ -143,8 +143,8 @@
   gen.increment_indent();
 
   ASSERT_TRUE(gen.EmitFunction(func));
-  EXPECT_EQ(gen.result(), R"(  [[stage(fragment)]]
-  fn frag_main() -> [[location(1)]] f32 {
+  EXPECT_EQ(gen.result(), R"(  @stage(fragment)
+  fn frag_main() -> @location(1) f32 {
     return 1.0;
   }
 )");
@@ -156,14 +156,14 @@
   // [[block]] struct Data {
   //   d : f32;
   // };
-  // [[binding(0), group(0)]] var<storage> data : Data;
+  // @binding(0) @group(0) var<storage> data : Data;
   //
-  // [[stage(compute), workgroup_size(1)]]
+  // @stage(compute) @workgroup_size(1)
   // fn a() {
   //   return;
   // }
   //
-  // [[stage(compute), workgroup_size(1)]]
+  // @stage(compute) @workgroup_size(1)
   // fn b() {
   //   return;
   // }
@@ -210,20 +210,20 @@
   GeneratorImpl& gen = Build();
 
   ASSERT_TRUE(gen.Generate()) << gen.error();
-  EXPECT_EQ(gen.result(), R"([[block]]
+  EXPECT_EQ(gen.result(), R"(@block
 struct Data {
   d : f32;
 }
 
-[[binding(0), group(0)]] var<storage, read_write> data : Data;
+@binding(0) @group(0) var<storage, read_write> data : Data;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn a() {
   var v : f32 = data.d;
   return;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn b() {
   var v : f32 = data.d;
   return;
diff --git a/src/writer/wgsl/generator_impl_global_decl_test.cc b/src/writer/wgsl/generator_impl_global_decl_test.cc
index e22a75e..3664534 100644
--- a/src/writer/wgsl/generator_impl_global_decl_test.cc
+++ b/src/writer/wgsl/generator_impl_global_decl_test.cc
@@ -35,7 +35,7 @@
   gen.increment_indent();
 
   ASSERT_TRUE(gen.Generate()) << gen.error();
-  EXPECT_EQ(gen.result(), R"(  [[stage(compute), workgroup_size(1, 1, 1)]]
+  EXPECT_EQ(gen.result(), R"(  @stage(compute) @workgroup_size(1, 1, 1)
   fn test_function() {
     var a : f32;
   }
@@ -91,7 +91,7 @@
     a : i32;
   }
 
-  [[stage(compute), workgroup_size(1)]]
+  @stage(compute) @workgroup_size(1)
   fn main() {
     var s0 : S0;
     var s1 : S1;
@@ -112,7 +112,7 @@
   gen.increment_indent();
 
   ASSERT_TRUE(gen.Generate()) << gen.error();
-  EXPECT_EQ(gen.result(), "  [[group(0), binding(0)]] var s : sampler;\n");
+  EXPECT_EQ(gen.result(), "  @group(0) @binding(0) var s : sampler;\n");
 }
 
 TEST_F(WgslGeneratorImplTest, Emit_Global_Texture) {
@@ -128,8 +128,7 @@
   gen.increment_indent();
 
   ASSERT_TRUE(gen.Generate()) << gen.error();
-  EXPECT_EQ(gen.result(),
-            "  [[group(0), binding(0)]] var t : texture_1d<f32>;\n");
+  EXPECT_EQ(gen.result(), "  @group(0) @binding(0) var t : texture_1d<f32>;\n");
 }
 
 TEST_F(WgslGeneratorImplTest, Emit_OverridableConstants) {
@@ -141,9 +140,9 @@
   gen.increment_indent();
 
   ASSERT_TRUE(gen.Generate()) << gen.error();
-  EXPECT_EQ(gen.result(), R"(  [[override]] let a : f32;
+  EXPECT_EQ(gen.result(), R"(  @override let a : f32;
 
-  [[override(7)]] let b : f32;
+  @override(7) let b : f32;
 )");
 }
 
diff --git a/src/writer/wgsl/generator_impl_type_test.cc b/src/writer/wgsl/generator_impl_type_test.cc
index dd1355e..22dfc4b 100644
--- a/src/writer/wgsl/generator_impl_type_test.cc
+++ b/src/writer/wgsl/generator_impl_type_test.cc
@@ -56,7 +56,7 @@
 
   std::stringstream out;
   ASSERT_TRUE(gen.EmitType(out, a)) << gen.error();
-  EXPECT_EQ(out.str(), "[[stride(16)]] array<bool, 4>");
+  EXPECT_EQ(out.str(), "@stride(16) array<bool, 4>");
 }
 
 TEST_F(WgslGeneratorImplTest, EmitType_RuntimeArray) {
@@ -162,10 +162,10 @@
 
   ASSERT_TRUE(gen.EmitStructType(s)) << gen.error();
   EXPECT_EQ(gen.result(), R"(struct S {
-  [[size(8)]]
+  @size(8)
   padding : u32;
   a : i32;
-  [[size(4)]]
+  @size(4)
   padding_1 : u32;
   b : f32;
 }
@@ -183,10 +183,10 @@
 
   ASSERT_TRUE(gen.EmitStructType(s)) << gen.error();
   EXPECT_EQ(gen.result(), R"(struct S {
-  [[size(8)]]
+  @size(8)
   padding : u32;
   tint_0_padding : i32;
-  [[size(4)]]
+  @size(4)
   padding_1 : u32;
   tint_2_padding : f32;
 }
@@ -203,9 +203,9 @@
 
   ASSERT_TRUE(gen.EmitStructType(s)) << gen.error();
   EXPECT_EQ(gen.result(), R"(struct S {
-  [[align(8)]]
+  @align(8)
   a : i32;
-  [[align(16)]]
+  @align(16)
   b : f32;
 }
 )");
@@ -221,9 +221,9 @@
 
   ASSERT_TRUE(gen.EmitStructType(s)) << gen.error();
   EXPECT_EQ(gen.result(), R"(struct S {
-  [[size(16)]]
+  @size(16)
   a : i32;
-  [[size(32)]]
+  @size(32)
   b : f32;
 }
 )");
@@ -240,10 +240,10 @@
   GeneratorImpl& gen = Build();
 
   ASSERT_TRUE(gen.EmitStructType(s)) << gen.error();
-  EXPECT_EQ(gen.result(), R"([[block]]
+  EXPECT_EQ(gen.result(), R"(@block
 struct S {
   a : i32;
-  [[align(8)]]
+  @align(8)
   b : f32;
 }
 )");
@@ -263,11 +263,11 @@
   GeneratorImpl& gen = Build();
 
   ASSERT_TRUE(gen.EmitStructType(s)) << gen.error();
-  EXPECT_EQ(gen.result(), R"([[block]]
+  EXPECT_EQ(gen.result(), R"(@block
 struct S {
-  [[builtin(vertex_index)]]
+  @builtin(vertex_index)
   a : u32;
-  [[location(2)]]
+  @location(2)
   b : f32;
 }
 )");
diff --git a/src/writer/wgsl/generator_impl_variable_test.cc b/src/writer/wgsl/generator_impl_variable_test.cc
index 7e54432..6e073fa 100644
--- a/src/writer/wgsl/generator_impl_variable_test.cc
+++ b/src/writer/wgsl/generator_impl_variable_test.cc
@@ -57,7 +57,7 @@
 
   std::stringstream out;
   ASSERT_TRUE(gen.EmitVariable(out, v)) << gen.error();
-  EXPECT_EQ(out.str(), R"([[binding(0), group(0)]] var<storage, read> a : S;)");
+  EXPECT_EQ(out.str(), R"(@binding(0) @group(0) var<storage, read> a : S;)");
 }
 
 TEST_F(WgslGeneratorImplTest, EmitVariable_Access_Write) {
@@ -74,8 +74,7 @@
 
   std::stringstream out;
   ASSERT_TRUE(gen.EmitVariable(out, v)) << gen.error();
-  EXPECT_EQ(out.str(),
-            R"([[binding(0), group(0)]] var<storage, write> a : S;)");
+  EXPECT_EQ(out.str(), R"(@binding(0) @group(0) var<storage, write> a : S;)");
 }
 
 TEST_F(WgslGeneratorImplTest, EmitVariable_Access_ReadWrite) {
@@ -93,7 +92,7 @@
   std::stringstream out;
   ASSERT_TRUE(gen.EmitVariable(out, v)) << gen.error();
   EXPECT_EQ(out.str(),
-            R"([[binding(0), group(0)]] var<storage, read_write> a : S;)");
+            R"(@binding(0) @group(0) var<storage, read_write> a : S;)");
 }
 
 TEST_F(WgslGeneratorImplTest, EmitVariable_Decorated) {
@@ -108,7 +107,7 @@
 
   std::stringstream out;
   ASSERT_TRUE(gen.EmitVariable(out, v)) << gen.error();
-  EXPECT_EQ(out.str(), R"([[group(1), binding(2)]] var a : sampler;)");
+  EXPECT_EQ(out.str(), R"(@group(1) @binding(2) var a : sampler;)");
 }
 
 TEST_F(WgslGeneratorImplTest, EmitVariable_Constructor) {
diff --git a/test/access/let/matrix.spvasm.expected.wgsl b/test/access/let/matrix.spvasm.expected.wgsl
index e779e9f..b7b9fcf 100644
--- a/test/access/let/matrix.spvasm.expected.wgsl
+++ b/test/access/let/matrix.spvasm.expected.wgsl
@@ -3,7 +3,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/access/let/matrix.wgsl b/test/access/let/matrix.wgsl
index 12af9c2..b4c77cf 100644
--- a/test/access/let/matrix.wgsl
+++ b/test/access/let/matrix.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let m : mat3x3<f32> = mat3x3<f32>(vec3<f32>(1., 2., 3.), vec3<f32>(4., 5., 6.), vec3<f32>(7., 8., 9.));
   let v : vec3<f32> = m[1];
diff --git a/test/access/let/matrix.wgsl.expected.wgsl b/test/access/let/matrix.wgsl.expected.wgsl
index 546b0f3..f5dbdfb 100644
--- a/test/access/let/matrix.wgsl.expected.wgsl
+++ b/test/access/let/matrix.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let m : mat3x3<f32> = mat3x3<f32>(vec3<f32>(1.0, 2.0, 3.0), vec3<f32>(4.0, 5.0, 6.0), vec3<f32>(7.0, 8.0, 9.0));
   let v : vec3<f32> = m[1];
diff --git a/test/access/let/vector.spvasm.expected.wgsl b/test/access/let/vector.spvasm.expected.wgsl
index b341f30..77bc6a2 100644
--- a/test/access/let/vector.spvasm.expected.wgsl
+++ b/test/access/let/vector.spvasm.expected.wgsl
@@ -5,7 +5,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/access/let/vector.wgsl b/test/access/let/vector.wgsl
index c768952..3589c6b 100644
--- a/test/access/let/vector.wgsl
+++ b/test/access/let/vector.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let v : vec3<f32> = vec3<f32>(1., 2., 3.);
   let scalar : f32 = v.y;
diff --git a/test/access/let/vector.wgsl.expected.wgsl b/test/access/let/vector.wgsl.expected.wgsl
index b661cf4..d7d7a2d 100644
--- a/test/access/let/vector.wgsl.expected.wgsl
+++ b/test/access/let/vector.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let v : vec3<f32> = vec3<f32>(1.0, 2.0, 3.0);
   let scalar : f32 = v.y;
diff --git a/test/access/var/matrix.spvasm.expected.wgsl b/test/access/var/matrix.spvasm.expected.wgsl
index 527abf6..d415abd 100644
--- a/test/access/var/matrix.spvasm.expected.wgsl
+++ b/test/access/var/matrix.spvasm.expected.wgsl
@@ -5,7 +5,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/access/var/matrix.wgsl b/test/access/var/matrix.wgsl
index 0bd99dc..d511bd4 100644
--- a/test/access/var/matrix.wgsl
+++ b/test/access/var/matrix.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var m : mat3x3<f32>;
   let v : vec3<f32> = m[1];
diff --git a/test/access/var/matrix.wgsl.expected.wgsl b/test/access/var/matrix.wgsl.expected.wgsl
index 0bd99dc..d511bd4 100644
--- a/test/access/var/matrix.wgsl.expected.wgsl
+++ b/test/access/var/matrix.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var m : mat3x3<f32>;
   let v : vec3<f32> = m[1];
diff --git a/test/access/var/vector.spvasm.expected.wgsl b/test/access/var/vector.spvasm.expected.wgsl
index 3a3bfdf..310560a 100644
--- a/test/access/var/vector.spvasm.expected.wgsl
+++ b/test/access/var/vector.spvasm.expected.wgsl
@@ -8,7 +8,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/access/var/vector.wgsl b/test/access/var/vector.wgsl
index 8197419..078f82e 100644
--- a/test/access/var/vector.wgsl
+++ b/test/access/var/vector.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : vec3<f32>;
   let scalar : f32 = v.y;
diff --git a/test/access/var/vector.wgsl.expected.wgsl b/test/access/var/vector.wgsl.expected.wgsl
index 8197419..078f82e 100644
--- a/test/access/var/vector.wgsl.expected.wgsl
+++ b/test/access/var/vector.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : vec3<f32>;
   let scalar : f32 = v.y;
diff --git a/test/array/assign_to_function_var.wgsl b/test/array/assign_to_function_var.wgsl
index aeb1ab9..d5ccaa2 100644
--- a/test/array/assign_to_function_var.wgsl
+++ b/test/array/assign_to_function_var.wgsl
@@ -1,4 +1,4 @@
-type ArrayType = [[stride(16)]] array<i32, 4>;
+type ArrayType = @stride(16) array<i32, 4>;
 
 struct S {
   arr : ArrayType;
@@ -6,8 +6,8 @@
 
 var<private> src_private : ArrayType;
 var<workgroup> src_workgroup : ArrayType;
-[[group(0), binding(0)]] var<uniform> src_uniform : S;
-[[group(0), binding(1)]] var<storage, read_write> src_storage : S;
+@group(0) @binding(0) var<uniform> src_uniform : S;
+@group(0) @binding(1) var<storage, read_write> src_storage : S;
 
 fn ret_arr() -> ArrayType {
   return ArrayType();
diff --git a/test/array/assign_to_function_var.wgsl.expected.wgsl b/test/array/assign_to_function_var.wgsl.expected.wgsl
index 3951d85..0033bea 100644
--- a/test/array/assign_to_function_var.wgsl.expected.wgsl
+++ b/test/array/assign_to_function_var.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-type ArrayType = [[stride(16)]] array<i32, 4>;
+type ArrayType = @stride(16) array<i32, 4>;
 
 struct S {
   arr : ArrayType;
@@ -8,9 +8,9 @@
 
 var<workgroup> src_workgroup : ArrayType;
 
-[[group(0), binding(0)]] var<uniform> src_uniform : S;
+@group(0) @binding(0) var<uniform> src_uniform : S;
 
-[[group(0), binding(1)]] var<storage, read_write> src_storage : S;
+@group(0) @binding(1) var<storage, read_write> src_storage : S;
 
 fn ret_arr() -> ArrayType {
   return ArrayType();
diff --git a/test/array/assign_to_private_var.wgsl b/test/array/assign_to_private_var.wgsl
index b8b342c..510da19 100644
--- a/test/array/assign_to_private_var.wgsl
+++ b/test/array/assign_to_private_var.wgsl
@@ -1,4 +1,4 @@
-type ArrayType = [[stride(16)]] array<i32, 4>;
+type ArrayType = @stride(16) array<i32, 4>;
 
 struct S {
   arr : ArrayType;
@@ -6,8 +6,8 @@
 
 var<private> src_private : ArrayType;
 var<workgroup> src_workgroup : ArrayType;
-[[group(0), binding(0)]] var<uniform> src_uniform : S;
-[[group(0), binding(1)]] var<storage, read_write> src_storage : S;
+@group(0) @binding(0) var<uniform> src_uniform : S;
+@group(0) @binding(1) var<storage, read_write> src_storage : S;
 
 var<private> dst : ArrayType;
 var<private> dst_nested : array<array<array<i32, 2>, 3>, 4>;
diff --git a/test/array/assign_to_private_var.wgsl.expected.wgsl b/test/array/assign_to_private_var.wgsl.expected.wgsl
index 56f7ba5..fd2057b 100644
--- a/test/array/assign_to_private_var.wgsl.expected.wgsl
+++ b/test/array/assign_to_private_var.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-type ArrayType = [[stride(16)]] array<i32, 4>;
+type ArrayType = @stride(16) array<i32, 4>;
 
 struct S {
   arr : ArrayType;
@@ -8,9 +8,9 @@
 
 var<workgroup> src_workgroup : ArrayType;
 
-[[group(0), binding(0)]] var<uniform> src_uniform : S;
+@group(0) @binding(0) var<uniform> src_uniform : S;
 
-[[group(0), binding(1)]] var<storage, read_write> src_storage : S;
+@group(0) @binding(1) var<storage, read_write> src_storage : S;
 
 var<private> dst : ArrayType;
 
diff --git a/test/array/assign_to_storage_var.wgsl b/test/array/assign_to_storage_var.wgsl
index 9bc068a..6d001d8 100644
--- a/test/array/assign_to_storage_var.wgsl
+++ b/test/array/assign_to_storage_var.wgsl
@@ -1,4 +1,4 @@
-type ArrayType = [[stride(16)]] array<i32, 4>;
+type ArrayType = @stride(16) array<i32, 4>;
 
 struct S {
   arr : ArrayType;
@@ -10,11 +10,11 @@
 
 var<private> src_private : ArrayType;
 var<workgroup> src_workgroup : ArrayType;
-[[group(0), binding(0)]] var<uniform> src_uniform : S;
-[[group(0), binding(1)]] var<storage, read_write> src_storage : S;
+@group(0) @binding(0) var<uniform> src_uniform : S;
+@group(0) @binding(1) var<storage, read_write> src_storage : S;
 
-[[group(0), binding(2)]] var<storage, read_write> dst : S;
-[[group(0), binding(3)]] var<storage, read_write> dst_nested : S_nested;
+@group(0) @binding(2) var<storage, read_write> dst : S;
+@group(0) @binding(3) var<storage, read_write> dst_nested : S_nested;
 
 fn ret_arr() -> ArrayType {
   return ArrayType();
diff --git a/test/array/assign_to_storage_var.wgsl.expected.wgsl b/test/array/assign_to_storage_var.wgsl.expected.wgsl
index dce03ab..88902fa 100644
--- a/test/array/assign_to_storage_var.wgsl.expected.wgsl
+++ b/test/array/assign_to_storage_var.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-type ArrayType = [[stride(16)]] array<i32, 4>;
+type ArrayType = @stride(16) array<i32, 4>;
 
 struct S {
   arr : ArrayType;
@@ -12,13 +12,13 @@
 
 var<workgroup> src_workgroup : ArrayType;
 
-[[group(0), binding(0)]] var<uniform> src_uniform : S;
+@group(0) @binding(0) var<uniform> src_uniform : S;
 
-[[group(0), binding(1)]] var<storage, read_write> src_storage : S;
+@group(0) @binding(1) var<storage, read_write> src_storage : S;
 
-[[group(0), binding(2)]] var<storage, read_write> dst : S;
+@group(0) @binding(2) var<storage, read_write> dst : S;
 
-[[group(0), binding(3)]] var<storage, read_write> dst_nested : S_nested;
+@group(0) @binding(3) var<storage, read_write> dst_nested : S_nested;
 
 fn ret_arr() -> ArrayType {
   return ArrayType();
diff --git a/test/array/assign_to_workgroup_var.wgsl b/test/array/assign_to_workgroup_var.wgsl
index 225f2f2..9fb94eb 100644
--- a/test/array/assign_to_workgroup_var.wgsl
+++ b/test/array/assign_to_workgroup_var.wgsl
@@ -1,4 +1,4 @@
-type ArrayType = [[stride(16)]] array<i32, 4>;
+type ArrayType = @stride(16) array<i32, 4>;
 
 struct S {
   arr : ArrayType;
@@ -6,8 +6,8 @@
 
 var<private> src_private : ArrayType;
 var<workgroup> src_workgroup : ArrayType;
-[[group(0), binding(0)]] var<uniform> src_uniform : S;
-[[group(0), binding(1)]] var<storage, read_write> src_storage : S;
+@group(0) @binding(0) var<uniform> src_uniform : S;
+@group(0) @binding(1) var<storage, read_write> src_storage : S;
 
 var<workgroup> dst : ArrayType;
 var<workgroup> dst_nested : array<array<array<i32, 2>, 3>, 4>;
diff --git a/test/array/assign_to_workgroup_var.wgsl.expected.wgsl b/test/array/assign_to_workgroup_var.wgsl.expected.wgsl
index a5a27e3..4fecbc8 100644
--- a/test/array/assign_to_workgroup_var.wgsl.expected.wgsl
+++ b/test/array/assign_to_workgroup_var.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-type ArrayType = [[stride(16)]] array<i32, 4>;
+type ArrayType = @stride(16) array<i32, 4>;
 
 struct S {
   arr : ArrayType;
@@ -8,9 +8,9 @@
 
 var<workgroup> src_workgroup : ArrayType;
 
-[[group(0), binding(0)]] var<uniform> src_uniform : S;
+@group(0) @binding(0) var<uniform> src_uniform : S;
 
-[[group(0), binding(1)]] var<storage, read_write> src_storage : S;
+@group(0) @binding(1) var<storage, read_write> src_storage : S;
 
 var<workgroup> dst : ArrayType;
 
diff --git a/test/array/function_parameter.wgsl b/test/array/function_parameter.wgsl
index e50418b..23de855 100644
--- a/test/array/function_parameter.wgsl
+++ b/test/array/function_parameter.wgsl
@@ -10,7 +10,7 @@
   return a[1][2][3];
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let a1 : array<f32, 4> = array<f32, 4>();
   let a2 : array<array<f32, 4>, 3> = array<array<f32, 4>, 3>();
diff --git a/test/array/function_parameter.wgsl.expected.wgsl b/test/array/function_parameter.wgsl.expected.wgsl
index e50418b..23de855 100644
--- a/test/array/function_parameter.wgsl.expected.wgsl
+++ b/test/array/function_parameter.wgsl.expected.wgsl
@@ -10,7 +10,7 @@
   return a[1][2][3];
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let a1 : array<f32, 4> = array<f32, 4>();
   let a2 : array<array<f32, 4>, 3> = array<array<f32, 4>, 3>();
diff --git a/test/array/function_return_type.wgsl b/test/array/function_return_type.wgsl
index 407302f..7491245 100644
--- a/test/array/function_return_type.wgsl
+++ b/test/array/function_return_type.wgsl
@@ -10,7 +10,7 @@
   return array<array<array<f32, 4>, 3>, 2>(f2(), f2());
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let a1 : array<f32, 4> = f1();
   let a2 : array<array<f32, 4>, 3> = f2();
diff --git a/test/array/function_return_type.wgsl.expected.wgsl b/test/array/function_return_type.wgsl.expected.wgsl
index 407302f..7491245 100644
--- a/test/array/function_return_type.wgsl.expected.wgsl
+++ b/test/array/function_return_type.wgsl.expected.wgsl
@@ -10,7 +10,7 @@
   return array<array<array<f32, 4>, 3>, 2>(f2(), f2());
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let a1 : array<f32, 4> = f1();
   let a2 : array<array<f32, 4>, 3> = f2();
diff --git a/test/array/size.wgsl b/test/array/size.wgsl
index c5ebee4..60721db 100644
--- a/test/array/size.wgsl
+++ b/test/array/size.wgsl
@@ -1,7 +1,7 @@
 let slen = 4;
 let ulen = 4u;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var signed_literal : array<f32, 4>;
   var unsigned_literal : array<f32, 4u>;
diff --git a/test/array/size.wgsl.expected.wgsl b/test/array/size.wgsl.expected.wgsl
index f0df1f0..0998407 100644
--- a/test/array/size.wgsl.expected.wgsl
+++ b/test/array/size.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
 
 let ulen = 4u;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var signed_literal : array<f32, 4>;
   var unsigned_literal : array<f32, 4u>;
diff --git a/test/array/type_constructor.wgsl b/test/array/type_constructor.wgsl
index 2870b12..8a07f39 100644
--- a/test/array/type_constructor.wgsl
+++ b/test/array/type_constructor.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x : i32 = 42;
 
diff --git a/test/array/type_constructor.wgsl.expected.wgsl b/test/array/type_constructor.wgsl.expected.wgsl
index 39eaafd..4381ec8 100644
--- a/test/array/type_constructor.wgsl.expected.wgsl
+++ b/test/array/type_constructor.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x : i32 = 42;
   let empty : array<i32, 4> = array<i32, 4>();
diff --git a/test/benchmark/particles.wgsl b/test/benchmark/particles.wgsl
index 4734a37..10bfb00 100644
--- a/test/benchmark/particles.wgsl
+++ b/test/benchmark/particles.wgsl
@@ -17,21 +17,21 @@
   right : vec3<f32>;
   up    : vec3<f32>;
 };
-[[binding(0), group(0)]] var<uniform> render_params : RenderParams;
+@binding(0) @group(0) var<uniform> render_params : RenderParams;
 
 struct VertexInput {
-  [[location(0)]] position : vec3<f32>;
-  [[location(1)]] color    : vec4<f32>;
-  [[location(2)]] quad_pos : vec2<f32>; // -1..+1
+  @location(0) position : vec3<f32>;
+  @location(1) color    : vec4<f32>;
+  @location(2) quad_pos : vec2<f32>; // -1..+1
 };
 
 struct VertexOutput {
-  [[builtin(position)]] position : vec4<f32>;
-  [[location(0)]]       color    : vec4<f32>;
-  [[location(1)]]       quad_pos : vec2<f32>; // -1..+1
+  @builtin(position) position : vec4<f32>;
+  @location(0)       color    : vec4<f32>;
+  @location(1)       quad_pos : vec2<f32>; // -1..+1
 };
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vs_main(in : VertexInput) -> VertexOutput {
   var quad_pos = mat2x3<f32>(render_params.right, render_params.up) * in.quad_pos;
   var position = in.position + quad_pos * 0.01;
@@ -45,8 +45,8 @@
 ////////////////////////////////////////////////////////////////////////////////
 // Fragment shader
 ////////////////////////////////////////////////////////////////////////////////
-[[stage(fragment)]]
-fn fs_main(in : VertexOutput) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
   var color = in.color;
   // Apply a circular particle alpha mask
   color.a = color.a * max(1.0 - length(in.quad_pos), 0.0);
@@ -72,12 +72,12 @@
   particles : array<Particle>;
 };
 
-[[binding(0), group(0)]] var<uniform> sim_params : SimulationParams;
-[[binding(1), group(0)]] var<storage, read_write> data : Particles;
-[[binding(2), group(0)]] var texture : texture_2d<f32>;
+@binding(0) @group(0) var<uniform> sim_params : SimulationParams;
+@binding(1) @group(0) var<storage, read_write> data : Particles;
+@binding(2) @group(0) var texture : texture_2d<f32>;
 
-[[stage(compute), workgroup_size(64)]]
-fn simulate([[builtin(global_invocation_id)]] GlobalInvocationID : vec3<u32>) {
+@stage(compute) @workgroup_size(64)
+fn simulate(@builtin(global_invocation_id) GlobalInvocationID : vec3<u32>) {
   rand_seed = (sim_params.seed.xy + vec2<f32>(GlobalInvocationID.xy)) * sim_params.seed.zw;
 
   let idx = GlobalInvocationID.x;
@@ -136,11 +136,11 @@
   weights : array<f32>;
 };
 
-[[binding(3), group(0)]] var<uniform> ubo : UBO;
-[[binding(4), group(0)]] var<storage, read> buf_in : Buffer;
-[[binding(5), group(0)]] var<storage, read_write> buf_out : Buffer;
-[[binding(6), group(0)]] var tex_in : texture_2d<f32>;
-[[binding(7), group(0)]] var tex_out : texture_storage_2d<rgba8unorm, write>;
+@binding(3) @group(0) var<uniform> ubo : UBO;
+@binding(4) @group(0) var<storage, read> buf_in : Buffer;
+@binding(5) @group(0) var<storage, read_write> buf_out : Buffer;
+@binding(6) @group(0) var tex_in : texture_2d<f32>;
+@binding(7) @group(0) var tex_out : texture_storage_2d<rgba8unorm, write>;
 
 ////////////////////////////////////////////////////////////////////////////////
 // import_level
@@ -148,8 +148,8 @@
 // Loads the alpha channel from a texel of the source image, and writes it to
 // the buf_out.weights.
 ////////////////////////////////////////////////////////////////////////////////
-[[stage(compute), workgroup_size(64)]]
-fn import_level([[builtin(global_invocation_id)]] coord : vec3<u32>) {
+@stage(compute) @workgroup_size(64)
+fn import_level(@builtin(global_invocation_id) coord : vec3<u32>) {
   _ = &buf_in;
   let offset = coord.x + coord.y * ubo.width;
   buf_out.weights[offset] = textureLoad(tex_in, vec2<i32>(coord.xy), 0).w;
@@ -163,8 +163,8 @@
 // mip level of tex_out. See simulate() in particle.wgsl to understand the
 // probability logic.
 ////////////////////////////////////////////////////////////////////////////////
-[[stage(compute), workgroup_size(64)]]
-fn export_level([[builtin(global_invocation_id)]] coord : vec3<u32>) {
+@stage(compute) @workgroup_size(64)
+fn export_level(@builtin(global_invocation_id) coord : vec3<u32>) {
   if (all(coord.xy < vec2<u32>(textureDimensions(tex_out)))) {
     let dst_offset = coord.x    + coord.y    * ubo.width;
     let src_offset = coord.x*2u + coord.y*2u * ubo.width;
diff --git a/test/benchmark/particles.wgsl.expected.wgsl b/test/benchmark/particles.wgsl.expected.wgsl
index 0ab3f50..ad07dc5 100644
--- a/test/benchmark/particles.wgsl.expected.wgsl
+++ b/test/benchmark/particles.wgsl.expected.wgsl
@@ -12,27 +12,27 @@
   up : vec3<f32>;
 }
 
-[[binding(0), group(0)]] var<uniform> render_params : RenderParams;
+@binding(0) @group(0) var<uniform> render_params : RenderParams;
 
 struct VertexInput {
-  [[location(0)]]
+  @location(0)
   position : vec3<f32>;
-  [[location(1)]]
+  @location(1)
   color : vec4<f32>;
-  [[location(2)]]
+  @location(2)
   quad_pos : vec2<f32>;
 }
 
 struct VertexOutput {
-  [[builtin(position)]]
+  @builtin(position)
   position : vec4<f32>;
-  [[location(0)]]
+  @location(0)
   color : vec4<f32>;
-  [[location(1)]]
+  @location(1)
   quad_pos : vec2<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vs_main(in : VertexInput) -> VertexOutput {
   var quad_pos = (mat2x3<f32>(render_params.right, render_params.up) * in.quad_pos);
   var position = (in.position + (quad_pos * 0.01));
@@ -43,8 +43,8 @@
   return out;
 }
 
-[[stage(fragment)]]
-fn fs_main(in : VertexOutput) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
   var color = in.color;
   color.a = (color.a * max((1.0 - length(in.quad_pos)), 0.0));
   return color;
@@ -66,14 +66,14 @@
   particles : array<Particle>;
 }
 
-[[binding(0), group(0)]] var<uniform> sim_params : SimulationParams;
+@binding(0) @group(0) var<uniform> sim_params : SimulationParams;
 
-[[binding(1), group(0)]] var<storage, read_write> data : Particles;
+@binding(1) @group(0) var<storage, read_write> data : Particles;
 
-[[binding(2), group(0)]] var texture : texture_2d<f32>;
+@binding(2) @group(0) var texture : texture_2d<f32>;
 
-[[stage(compute), workgroup_size(64)]]
-fn simulate([[builtin(global_invocation_id)]] GlobalInvocationID : vec3<u32>) {
+@stage(compute) @workgroup_size(64)
+fn simulate(@builtin(global_invocation_id) GlobalInvocationID : vec3<u32>) {
   rand_seed = ((sim_params.seed.xy + vec2<f32>(GlobalInvocationID.xy)) * sim_params.seed.zw);
   let idx = GlobalInvocationID.x;
   var particle = data.particles[idx];
@@ -110,25 +110,25 @@
   weights : array<f32>;
 }
 
-[[binding(3), group(0)]] var<uniform> ubo : UBO;
+@binding(3) @group(0) var<uniform> ubo : UBO;
 
-[[binding(4), group(0)]] var<storage, read> buf_in : Buffer;
+@binding(4) @group(0) var<storage, read> buf_in : Buffer;
 
-[[binding(5), group(0)]] var<storage, read_write> buf_out : Buffer;
+@binding(5) @group(0) var<storage, read_write> buf_out : Buffer;
 
-[[binding(6), group(0)]] var tex_in : texture_2d<f32>;
+@binding(6) @group(0) var tex_in : texture_2d<f32>;
 
-[[binding(7), group(0)]] var tex_out : texture_storage_2d<rgba8unorm, write>;
+@binding(7) @group(0) var tex_out : texture_storage_2d<rgba8unorm, write>;
 
-[[stage(compute), workgroup_size(64)]]
-fn import_level([[builtin(global_invocation_id)]] coord : vec3<u32>) {
+@stage(compute) @workgroup_size(64)
+fn import_level(@builtin(global_invocation_id) coord : vec3<u32>) {
   _ = &(buf_in);
   let offset = (coord.x + (coord.y * ubo.width));
   buf_out.weights[offset] = textureLoad(tex_in, vec2<i32>(coord.xy), 0).w;
 }
 
-[[stage(compute), workgroup_size(64)]]
-fn export_level([[builtin(global_invocation_id)]] coord : vec3<u32>) {
+@stage(compute) @workgroup_size(64)
+fn export_level(@builtin(global_invocation_id) coord : vec3<u32>) {
   if (all((coord.xy < vec2<u32>(textureDimensions(tex_out))))) {
     let dst_offset = (coord.x + (coord.y * ubo.width));
     let src_offset = ((coord.x * 2u) + ((coord.y * 2u) * ubo.width));
diff --git a/test/benchmark/simple_compute.wgsl b/test/benchmark/simple_compute.wgsl
index f5b883a..605bfee 100644
--- a/test/benchmark/simple_compute.wgsl
+++ b/test/benchmark/simple_compute.wgsl
@@ -2,9 +2,9 @@
   data : array<i32>;
 };
 
-[[group(0), binding(0)]] var<storage, read_write> buffer : SB;
+@group(0) @binding(0) var<storage, read_write> buffer : SB;
 
-[[stage(compute), workgroup_size(1, 2, 3)]]
-fn main([[builtin(global_invocation_id)]] id : vec3<u32>) {
+@stage(compute) @workgroup_size(1, 2, 3)
+fn main(@builtin(global_invocation_id) id : vec3<u32>) {
   buffer.data[id.x] = buffer.data[id.x] + 1;
 }
diff --git a/test/benchmark/simple_compute.wgsl.expected.wgsl b/test/benchmark/simple_compute.wgsl.expected.wgsl
index a83b28f..458c08c 100644
--- a/test/benchmark/simple_compute.wgsl.expected.wgsl
+++ b/test/benchmark/simple_compute.wgsl.expected.wgsl
@@ -2,9 +2,9 @@
   data : array<i32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> buffer : SB;
+@group(0) @binding(0) var<storage, read_write> buffer : SB;
 
-[[stage(compute), workgroup_size(1, 2, 3)]]
-fn main([[builtin(global_invocation_id)]] id : vec3<u32>) {
+@stage(compute) @workgroup_size(1, 2, 3)
+fn main(@builtin(global_invocation_id) id : vec3<u32>) {
   buffer.data[id.x] = (buffer.data[id.x] + 1);
 }
diff --git a/test/benchmark/simple_fragment.wgsl b/test/benchmark/simple_fragment.wgsl
index bb5ed94..3fe67bf 100644
--- a/test/benchmark/simple_fragment.wgsl
+++ b/test/benchmark/simple_fragment.wgsl
@@ -1,12 +1,12 @@
 struct Input {
-  [[location(0)]] color: vec4<f32>;
+  @location(0) color: vec4<f32>;
 };
 
 struct Output {
-  [[location(0)]] color: vec4<f32>;
+  @location(0) color: vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main(in : Input) -> Output {
   return Output(in.color);
 }
diff --git a/test/benchmark/simple_fragment.wgsl.expected.wgsl b/test/benchmark/simple_fragment.wgsl.expected.wgsl
index 7236de2..19b9e99 100644
--- a/test/benchmark/simple_fragment.wgsl.expected.wgsl
+++ b/test/benchmark/simple_fragment.wgsl.expected.wgsl
@@ -1,14 +1,14 @@
 struct Input {
-  [[location(0)]]
+  @location(0)
   color : vec4<f32>;
 }
 
 struct Output {
-  [[location(0)]]
+  @location(0)
   color : vec4<f32>;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main(in : Input) -> Output {
   return Output(in.color);
 }
diff --git a/test/benchmark/simple_vertex.wgsl b/test/benchmark/simple_vertex.wgsl
index 8f9a07b..fb13fe2 100644
--- a/test/benchmark/simple_vertex.wgsl
+++ b/test/benchmark/simple_vertex.wgsl
@@ -1,12 +1,12 @@
 struct Input {
-  [[location(0)]] position: vec4<f32>;
+  @location(0) position: vec4<f32>;
 };
 
 struct Output {
-  [[builtin(position)]] position : vec4<f32>;
+  @builtin(position) position : vec4<f32>;
 };
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main(in : Input) -> Output {
   return Output(in.position);
 }
diff --git a/test/benchmark/simple_vertex.wgsl.expected.wgsl b/test/benchmark/simple_vertex.wgsl.expected.wgsl
index fdce23e..41368eb 100644
--- a/test/benchmark/simple_vertex.wgsl.expected.wgsl
+++ b/test/benchmark/simple_vertex.wgsl.expected.wgsl
@@ -1,14 +1,14 @@
 struct Input {
-  [[location(0)]]
+  @location(0)
   position : vec4<f32>;
 }
 
 struct Output {
-  [[builtin(position)]]
+  @builtin(position)
   position : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main(in : Input) -> Output {
   return Output(in.position);
 }
diff --git a/test/buffer/storage/dynamic_index/read.wgsl b/test/buffer/storage/dynamic_index/read.wgsl
index 633b1be..94c2c1f 100644
--- a/test/buffer/storage/dynamic_index/read.wgsl
+++ b/test/buffer/storage/dynamic_index/read.wgsl
@@ -7,17 +7,17 @@
     f : f32;
     g : mat2x3<f32>;
     h : mat3x2<f32>;
-    i : [[stride(16)]] array<vec4<i32>, 4>;
+    i : @stride(16) array<vec4<i32>, 4>;
 };
 
 struct S {
     arr : array<Inner>;
 };
 
-[[binding(0), group(0)]] var<storage, read> s : S;
+@binding(0) @group(0) var<storage, read> s : S;
 
-[[stage(compute), workgroup_size(1)]]
-fn main([[builtin(local_invocation_index)]] idx : u32) {
+@stage(compute) @workgroup_size(1)
+fn main(@builtin(local_invocation_index) idx : u32) {
     let a = s.arr[idx].a;
     let b = s.arr[idx].b;
     let c = s.arr[idx].c;
diff --git a/test/buffer/storage/dynamic_index/read.wgsl.expected.wgsl b/test/buffer/storage/dynamic_index/read.wgsl.expected.wgsl
index bd24ab0..fd0c451 100644
--- a/test/buffer/storage/dynamic_index/read.wgsl.expected.wgsl
+++ b/test/buffer/storage/dynamic_index/read.wgsl.expected.wgsl
@@ -7,17 +7,17 @@
   f : f32;
   g : mat2x3<f32>;
   h : mat3x2<f32>;
-  i : [[stride(16)]] array<vec4<i32>, 4>;
+  i : @stride(16) array<vec4<i32>, 4>;
 }
 
 struct S {
   arr : array<Inner>;
 }
 
-[[binding(0), group(0)]] var<storage, read> s : S;
+@binding(0) @group(0) var<storage, read> s : S;
 
-[[stage(compute), workgroup_size(1)]]
-fn main([[builtin(local_invocation_index)]] idx : u32) {
+@stage(compute) @workgroup_size(1)
+fn main(@builtin(local_invocation_index) idx : u32) {
   let a = s.arr[idx].a;
   let b = s.arr[idx].b;
   let c = s.arr[idx].c;
diff --git a/test/buffer/storage/dynamic_index/write.wgsl b/test/buffer/storage/dynamic_index/write.wgsl
index 836c018..3770015 100644
--- a/test/buffer/storage/dynamic_index/write.wgsl
+++ b/test/buffer/storage/dynamic_index/write.wgsl
@@ -7,17 +7,17 @@
     f : f32;
     g : mat2x3<f32>;
     h : mat3x2<f32>;
-    i : [[stride(16)]] array<vec4<i32>, 4>;
+    i : @stride(16) array<vec4<i32>, 4>;
 };
 
 struct S {
     arr : array<Inner>;
 };
 
-[[binding(0), group(0)]] var<storage, read_write> s : S;
+@binding(0) @group(0) var<storage, read_write> s : S;
 
-[[stage(compute), workgroup_size(1)]]
-fn main([[builtin(local_invocation_index)]] idx : u32) {
+@stage(compute) @workgroup_size(1)
+fn main(@builtin(local_invocation_index) idx : u32) {
     s.arr[idx].a = vec3<i32>();
     s.arr[idx].b = i32();
     s.arr[idx].c = vec3<u32>();
@@ -26,5 +26,5 @@
     s.arr[idx].f = f32();
     s.arr[idx].g = mat2x3<f32>();
     s.arr[idx].h = mat3x2<f32>();
-    s.arr[idx].i = [[stride(16)]] array<vec4<i32>, 4>();
+    s.arr[idx].i = @stride(16) array<vec4<i32>, 4>();
 }
diff --git a/test/buffer/storage/dynamic_index/write.wgsl.expected.wgsl b/test/buffer/storage/dynamic_index/write.wgsl.expected.wgsl
index b015519..d51db21 100644
--- a/test/buffer/storage/dynamic_index/write.wgsl.expected.wgsl
+++ b/test/buffer/storage/dynamic_index/write.wgsl.expected.wgsl
@@ -7,17 +7,17 @@
   f : f32;
   g : mat2x3<f32>;
   h : mat3x2<f32>;
-  i : [[stride(16)]] array<vec4<i32>, 4>;
+  i : @stride(16) array<vec4<i32>, 4>;
 }
 
 struct S {
   arr : array<Inner>;
 }
 
-[[binding(0), group(0)]] var<storage, read_write> s : S;
+@binding(0) @group(0) var<storage, read_write> s : S;
 
-[[stage(compute), workgroup_size(1)]]
-fn main([[builtin(local_invocation_index)]] idx : u32) {
+@stage(compute) @workgroup_size(1)
+fn main(@builtin(local_invocation_index) idx : u32) {
   s.arr[idx].a = vec3<i32>();
   s.arr[idx].b = i32();
   s.arr[idx].c = vec3<u32>();
@@ -26,5 +26,5 @@
   s.arr[idx].f = f32();
   s.arr[idx].g = mat2x3<f32>();
   s.arr[idx].h = mat3x2<f32>();
-  s.arr[idx].i = [[stride(16)]] array<vec4<i32>, 4>();
+  s.arr[idx].i = @stride(16) array<vec4<i32>, 4>();
 }
diff --git a/test/buffer/storage/static_index/read.wgsl b/test/buffer/storage/static_index/read.wgsl
index c0824b3..773fbbb 100644
--- a/test/buffer/storage/static_index/read.wgsl
+++ b/test/buffer/storage/static_index/read.wgsl
@@ -12,12 +12,12 @@
     g : mat2x3<f32>;
     h : mat3x2<f32>;
     i : Inner;
-    j : [[stride(16)]] array<Inner, 4>;
+    j : @stride(16) array<Inner, 4>;
 };
 
-[[binding(0), group(0)]] var<storage, read> s : S;
+@binding(0) @group(0) var<storage, read> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     let a = s.a;
     let b = s.b;
diff --git a/test/buffer/storage/static_index/read.wgsl.expected.wgsl b/test/buffer/storage/static_index/read.wgsl.expected.wgsl
index 56187c5..3413a96 100644
--- a/test/buffer/storage/static_index/read.wgsl.expected.wgsl
+++ b/test/buffer/storage/static_index/read.wgsl.expected.wgsl
@@ -12,12 +12,12 @@
   g : mat2x3<f32>;
   h : mat3x2<f32>;
   i : Inner;
-  j : [[stride(16)]] array<Inner, 4>;
+  j : @stride(16) array<Inner, 4>;
 }
 
-[[binding(0), group(0)]] var<storage, read> s : S;
+@binding(0) @group(0) var<storage, read> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let a = s.a;
   let b = s.b;
diff --git a/test/buffer/storage/static_index/write.wgsl b/test/buffer/storage/static_index/write.wgsl
index 7b4affb..ff18cbc 100644
--- a/test/buffer/storage/static_index/write.wgsl
+++ b/test/buffer/storage/static_index/write.wgsl
@@ -12,12 +12,12 @@
     g : mat2x3<f32>;
     h : mat3x2<f32>;
     i : Inner;
-    j : [[stride(16)]] array<Inner, 4>;
+    j : @stride(16) array<Inner, 4>;
 };
 
-[[binding(0), group(0)]] var<storage, write> s : S;
+@binding(0) @group(0) var<storage, write> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     s.a = vec3<i32>();
     s.b = i32();
@@ -28,5 +28,5 @@
     s.g = mat2x3<f32>();
     s.h = mat3x2<f32>();
     s.i = Inner();
-    s.j = [[stride(16)]] array<Inner, 4>();
+    s.j = @stride(16) array<Inner, 4>();
 }
diff --git a/test/buffer/storage/static_index/write.wgsl.expected.wgsl b/test/buffer/storage/static_index/write.wgsl.expected.wgsl
index 46cdde8..595efce 100644
--- a/test/buffer/storage/static_index/write.wgsl.expected.wgsl
+++ b/test/buffer/storage/static_index/write.wgsl.expected.wgsl
@@ -12,12 +12,12 @@
   g : mat2x3<f32>;
   h : mat3x2<f32>;
   i : Inner;
-  j : [[stride(16)]] array<Inner, 4>;
+  j : @stride(16) array<Inner, 4>;
 }
 
-[[binding(0), group(0)]] var<storage, write> s : S;
+@binding(0) @group(0) var<storage, write> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   s.a = vec3<i32>();
   s.b = i32();
@@ -28,5 +28,5 @@
   s.g = mat2x3<f32>();
   s.h = mat3x2<f32>();
   s.i = Inner();
-  s.j = [[stride(16)]] array<Inner, 4>();
+  s.j = @stride(16) array<Inner, 4>();
 }
diff --git a/test/buffer/storage/types/array.wgsl b/test/buffer/storage/types/array.wgsl
index 6105a26..ae79369 100644
--- a/test/buffer/storage/types/array.wgsl
+++ b/test/buffer/storage/types/array.wgsl
@@ -1,10 +1,10 @@
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<storage, read> in : array<f32, 4>;
 
-[[group(0), binding(1)]]
+@group(0) @binding(1)
 var<storage, read_write> out : array<f32, 4>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/storage/types/array.wgsl.expected.wgsl b/test/buffer/storage/types/array.wgsl.expected.wgsl
index 0aaacae..7cfa5a3 100644
--- a/test/buffer/storage/types/array.wgsl.expected.wgsl
+++ b/test/buffer/storage/types/array.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(0), binding(0)]] var<storage, read> in : array<f32, 4>;
+@group(0) @binding(0) var<storage, read> in : array<f32, 4>;
 
-[[group(0), binding(1)]] var<storage, read_write> out : array<f32, 4>;
+@group(0) @binding(1) var<storage, read_write> out : array<f32, 4>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/storage/types/f32.wgsl b/test/buffer/storage/types/f32.wgsl
index d66cdb0..d8d60af 100644
--- a/test/buffer/storage/types/f32.wgsl
+++ b/test/buffer/storage/types/f32.wgsl
@@ -1,10 +1,10 @@
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<storage, read> in : f32;
 
-[[group(0), binding(1)]]
+@group(0) @binding(1)
 var<storage, read_write> out : f32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/storage/types/f32.wgsl.expected.wgsl b/test/buffer/storage/types/f32.wgsl.expected.wgsl
index a385a75..fc61aa9 100644
--- a/test/buffer/storage/types/f32.wgsl.expected.wgsl
+++ b/test/buffer/storage/types/f32.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(0), binding(0)]] var<storage, read> in : f32;
+@group(0) @binding(0) var<storage, read> in : f32;
 
-[[group(0), binding(1)]] var<storage, read_write> out : f32;
+@group(0) @binding(1) var<storage, read_write> out : f32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/storage/types/i32.wgsl b/test/buffer/storage/types/i32.wgsl
index 2ffd35f..fa63f1d 100644
--- a/test/buffer/storage/types/i32.wgsl
+++ b/test/buffer/storage/types/i32.wgsl
@@ -1,10 +1,10 @@
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<storage, read> in : i32;
 
-[[group(0), binding(1)]]
+@group(0) @binding(1)
 var<storage, read_write> out : i32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/storage/types/i32.wgsl.expected.wgsl b/test/buffer/storage/types/i32.wgsl.expected.wgsl
index 3424f2e..f4b6b78 100644
--- a/test/buffer/storage/types/i32.wgsl.expected.wgsl
+++ b/test/buffer/storage/types/i32.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(0), binding(0)]] var<storage, read> in : i32;
+@group(0) @binding(0) var<storage, read> in : i32;
 
-[[group(0), binding(1)]] var<storage, read_write> out : i32;
+@group(0) @binding(1) var<storage, read_write> out : i32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/storage/types/mat2x2.wgsl b/test/buffer/storage/types/mat2x2.wgsl
index 60ff548..0fece18 100644
--- a/test/buffer/storage/types/mat2x2.wgsl
+++ b/test/buffer/storage/types/mat2x2.wgsl
@@ -1,10 +1,10 @@
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<storage, read> in : mat2x2<f32>;
 
-[[group(0), binding(1)]]
+@group(0) @binding(1)
 var<storage, read_write> out : mat2x2<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/storage/types/mat2x2.wgsl.expected.wgsl b/test/buffer/storage/types/mat2x2.wgsl.expected.wgsl
index 8d2cbae..5d3e650 100644
--- a/test/buffer/storage/types/mat2x2.wgsl.expected.wgsl
+++ b/test/buffer/storage/types/mat2x2.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(0), binding(0)]] var<storage, read> in : mat2x2<f32>;
+@group(0) @binding(0) var<storage, read> in : mat2x2<f32>;
 
-[[group(0), binding(1)]] var<storage, read_write> out : mat2x2<f32>;
+@group(0) @binding(1) var<storage, read_write> out : mat2x2<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/storage/types/mat2x3.wgsl b/test/buffer/storage/types/mat2x3.wgsl
index 151db83..7d64f7b 100644
--- a/test/buffer/storage/types/mat2x3.wgsl
+++ b/test/buffer/storage/types/mat2x3.wgsl
@@ -1,10 +1,10 @@
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<storage, read> in : mat2x3<f32>;
 
-[[group(0), binding(1)]]
+@group(0) @binding(1)
 var<storage, read_write> out : mat2x3<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/storage/types/mat2x3.wgsl.expected.wgsl b/test/buffer/storage/types/mat2x3.wgsl.expected.wgsl
index ab3a5fd..48eda48 100644
--- a/test/buffer/storage/types/mat2x3.wgsl.expected.wgsl
+++ b/test/buffer/storage/types/mat2x3.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(0), binding(0)]] var<storage, read> in : mat2x3<f32>;
+@group(0) @binding(0) var<storage, read> in : mat2x3<f32>;
 
-[[group(0), binding(1)]] var<storage, read_write> out : mat2x3<f32>;
+@group(0) @binding(1) var<storage, read_write> out : mat2x3<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/storage/types/mat3x2.wgsl b/test/buffer/storage/types/mat3x2.wgsl
index d77ac81..e3f972f 100644
--- a/test/buffer/storage/types/mat3x2.wgsl
+++ b/test/buffer/storage/types/mat3x2.wgsl
@@ -1,10 +1,10 @@
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<storage, read> in : mat3x2<f32>;
 
-[[group(0), binding(1)]]
+@group(0) @binding(1)
 var<storage, read_write> out : mat3x2<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/storage/types/mat3x2.wgsl.expected.wgsl b/test/buffer/storage/types/mat3x2.wgsl.expected.wgsl
index 4c87f4a..d5db436 100644
--- a/test/buffer/storage/types/mat3x2.wgsl.expected.wgsl
+++ b/test/buffer/storage/types/mat3x2.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(0), binding(0)]] var<storage, read> in : mat3x2<f32>;
+@group(0) @binding(0) var<storage, read> in : mat3x2<f32>;
 
-[[group(0), binding(1)]] var<storage, read_write> out : mat3x2<f32>;
+@group(0) @binding(1) var<storage, read_write> out : mat3x2<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/storage/types/mat4x4.wgsl b/test/buffer/storage/types/mat4x4.wgsl
index bf18a25..673d9d3 100644
--- a/test/buffer/storage/types/mat4x4.wgsl
+++ b/test/buffer/storage/types/mat4x4.wgsl
@@ -1,10 +1,10 @@
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<storage, read> in : mat4x4<f32>;
 
-[[group(0), binding(1)]]
+@group(0) @binding(1)
 var<storage, read_write> out : mat4x4<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/storage/types/mat4x4.wgsl.expected.wgsl b/test/buffer/storage/types/mat4x4.wgsl.expected.wgsl
index 7c1ebe9..402743f 100644
--- a/test/buffer/storage/types/mat4x4.wgsl.expected.wgsl
+++ b/test/buffer/storage/types/mat4x4.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(0), binding(0)]] var<storage, read> in : mat4x4<f32>;
+@group(0) @binding(0) var<storage, read> in : mat4x4<f32>;
 
-[[group(0), binding(1)]] var<storage, read_write> out : mat4x4<f32>;
+@group(0) @binding(1) var<storage, read_write> out : mat4x4<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/storage/types/runtime_array.wgsl b/test/buffer/storage/types/runtime_array.wgsl
index f403fd3..083ea11 100644
--- a/test/buffer/storage/types/runtime_array.wgsl
+++ b/test/buffer/storage/types/runtime_array.wgsl
@@ -2,13 +2,13 @@
   f : f32;
 };
 
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<storage, read> in : array<S>;
 
-[[group(0), binding(1)]]
+@group(0) @binding(1)
 var<storage, read_write> out : array<S>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out[0] = in[0];
 }
diff --git a/test/buffer/storage/types/runtime_array.wgsl.expected.wgsl b/test/buffer/storage/types/runtime_array.wgsl.expected.wgsl
index 2aca9cd..4b87ea6 100644
--- a/test/buffer/storage/types/runtime_array.wgsl.expected.wgsl
+++ b/test/buffer/storage/types/runtime_array.wgsl.expected.wgsl
@@ -2,11 +2,11 @@
   f : f32;
 }
 
-[[group(0), binding(0)]] var<storage, read> in : array<S>;
+@group(0) @binding(0) var<storage, read> in : array<S>;
 
-[[group(0), binding(1)]] var<storage, read_write> out : array<S>;
+@group(0) @binding(1) var<storage, read_write> out : array<S>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out[0] = in[0];
 }
diff --git a/test/buffer/storage/types/struct.wgsl b/test/buffer/storage/types/struct.wgsl
index 42acfbc..993b052 100644
--- a/test/buffer/storage/types/struct.wgsl
+++ b/test/buffer/storage/types/struct.wgsl
@@ -5,13 +5,13 @@
   inner : Inner;
 };
 
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<storage, read> in : S;
 
-[[group(0), binding(1)]]
+@group(0) @binding(1)
 var<storage, read_write> out : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/storage/types/struct.wgsl.expected.wgsl b/test/buffer/storage/types/struct.wgsl.expected.wgsl
index dd840d4..59d3bc9 100644
--- a/test/buffer/storage/types/struct.wgsl.expected.wgsl
+++ b/test/buffer/storage/types/struct.wgsl.expected.wgsl
@@ -6,11 +6,11 @@
   inner : Inner;
 }
 
-[[group(0), binding(0)]] var<storage, read> in : S;
+@group(0) @binding(0) var<storage, read> in : S;
 
-[[group(0), binding(1)]] var<storage, read_write> out : S;
+@group(0) @binding(1) var<storage, read_write> out : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/storage/types/u32.wgsl b/test/buffer/storage/types/u32.wgsl
index 4664d29..0b87510 100644
--- a/test/buffer/storage/types/u32.wgsl
+++ b/test/buffer/storage/types/u32.wgsl
@@ -1,10 +1,10 @@
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<storage, read> in : u32;
 
-[[group(0), binding(1)]]
+@group(0) @binding(1)
 var<storage, read_write> out : u32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/storage/types/u32.wgsl.expected.wgsl b/test/buffer/storage/types/u32.wgsl.expected.wgsl
index 46dc9d3..2cebf5e 100644
--- a/test/buffer/storage/types/u32.wgsl.expected.wgsl
+++ b/test/buffer/storage/types/u32.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(0), binding(0)]] var<storage, read> in : u32;
+@group(0) @binding(0) var<storage, read> in : u32;
 
-[[group(0), binding(1)]] var<storage, read_write> out : u32;
+@group(0) @binding(1) var<storage, read_write> out : u32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/storage/types/vec2.wgsl b/test/buffer/storage/types/vec2.wgsl
index 9841fd4..d1466d5 100644
--- a/test/buffer/storage/types/vec2.wgsl
+++ b/test/buffer/storage/types/vec2.wgsl
@@ -1,10 +1,10 @@
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<storage, read> in : vec2<i32>;
 
-[[group(0), binding(1)]]
+@group(0) @binding(1)
 var<storage, read_write> out : vec2<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/storage/types/vec2.wgsl.expected.wgsl b/test/buffer/storage/types/vec2.wgsl.expected.wgsl
index a945b32..806600b 100644
--- a/test/buffer/storage/types/vec2.wgsl.expected.wgsl
+++ b/test/buffer/storage/types/vec2.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(0), binding(0)]] var<storage, read> in : vec2<i32>;
+@group(0) @binding(0) var<storage, read> in : vec2<i32>;
 
-[[group(0), binding(1)]] var<storage, read_write> out : vec2<i32>;
+@group(0) @binding(1) var<storage, read_write> out : vec2<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/storage/types/vec3.wgsl b/test/buffer/storage/types/vec3.wgsl
index 5335059..38e25d0 100644
--- a/test/buffer/storage/types/vec3.wgsl
+++ b/test/buffer/storage/types/vec3.wgsl
@@ -1,10 +1,10 @@
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<storage, read> in : vec3<u32>;
 
-[[group(0), binding(1)]]
+@group(0) @binding(1)
 var<storage, read_write> out : vec3<u32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/storage/types/vec3.wgsl.expected.wgsl b/test/buffer/storage/types/vec3.wgsl.expected.wgsl
index 71377b0..a3fcf3a 100644
--- a/test/buffer/storage/types/vec3.wgsl.expected.wgsl
+++ b/test/buffer/storage/types/vec3.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(0), binding(0)]] var<storage, read> in : vec3<u32>;
+@group(0) @binding(0) var<storage, read> in : vec3<u32>;
 
-[[group(0), binding(1)]] var<storage, read_write> out : vec3<u32>;
+@group(0) @binding(1) var<storage, read_write> out : vec3<u32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/storage/types/vec4.wgsl b/test/buffer/storage/types/vec4.wgsl
index 494a89a..b9bf279 100644
--- a/test/buffer/storage/types/vec4.wgsl
+++ b/test/buffer/storage/types/vec4.wgsl
@@ -1,10 +1,10 @@
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<storage, read> in : vec4<f32>;
 
-[[group(0), binding(1)]]
+@group(0) @binding(1)
 var<storage, read_write> out : vec4<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/storage/types/vec4.wgsl.expected.wgsl b/test/buffer/storage/types/vec4.wgsl.expected.wgsl
index 7b278bd..22065c7 100644
--- a/test/buffer/storage/types/vec4.wgsl.expected.wgsl
+++ b/test/buffer/storage/types/vec4.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(0), binding(0)]] var<storage, read> in : vec4<f32>;
+@group(0) @binding(0) var<storage, read> in : vec4<f32>;
 
-[[group(0), binding(1)]] var<storage, read_write> out : vec4<f32>;
+@group(0) @binding(1) var<storage, read_write> out : vec4<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   out = in;
 }
diff --git a/test/buffer/uniform/dynamic_index/read.wgsl b/test/buffer/uniform/dynamic_index/read.wgsl
index 2e79833..3e9142b 100644
--- a/test/buffer/uniform/dynamic_index/read.wgsl
+++ b/test/buffer/uniform/dynamic_index/read.wgsl
@@ -8,18 +8,18 @@
     g : vec2<i32>;
     h : vec2<i32>;
     i : mat2x3<f32>;
-    [[align(16)]] j : mat3x2<f32>;
-    [[align(16)]] k : [[stride(16)]] array<vec4<i32>, 4>;
+    @align(16) j : mat3x2<f32>;
+    @align(16) k : @stride(16) array<vec4<i32>, 4>;
 };
 
 struct S {
     arr : array<Inner, 8>;
 };
 
-[[binding(0), group(0)]] var<uniform> s : S;
+@binding(0) @group(0) var<uniform> s : S;
 
-[[stage(compute), workgroup_size(1)]]
-fn main([[builtin(local_invocation_index)]] idx : u32) {
+@stage(compute) @workgroup_size(1)
+fn main(@builtin(local_invocation_index) idx : u32) {
     let a = s.arr[idx].a;
     let b = s.arr[idx].b;
     let c = s.arr[idx].c;
diff --git a/test/buffer/uniform/dynamic_index/read.wgsl.expected.wgsl b/test/buffer/uniform/dynamic_index/read.wgsl.expected.wgsl
index 0dc8fdf..1bee626 100644
--- a/test/buffer/uniform/dynamic_index/read.wgsl.expected.wgsl
+++ b/test/buffer/uniform/dynamic_index/read.wgsl.expected.wgsl
@@ -8,20 +8,20 @@
   g : vec2<i32>;
   h : vec2<i32>;
   i : mat2x3<f32>;
-  [[align(16)]]
+  @align(16)
   j : mat3x2<f32>;
-  [[align(16)]]
-  k : [[stride(16)]] array<vec4<i32>, 4>;
+  @align(16)
+  k : @stride(16) array<vec4<i32>, 4>;
 }
 
 struct S {
   arr : array<Inner, 8>;
 }
 
-[[binding(0), group(0)]] var<uniform> s : S;
+@binding(0) @group(0) var<uniform> s : S;
 
-[[stage(compute), workgroup_size(1)]]
-fn main([[builtin(local_invocation_index)]] idx : u32) {
+@stage(compute) @workgroup_size(1)
+fn main(@builtin(local_invocation_index) idx : u32) {
   let a = s.arr[idx].a;
   let b = s.arr[idx].b;
   let c = s.arr[idx].c;
diff --git a/test/buffer/uniform/static_index/read.wgsl b/test/buffer/uniform/static_index/read.wgsl
index a735ccf..e1d10e8 100644
--- a/test/buffer/uniform/static_index/read.wgsl
+++ b/test/buffer/uniform/static_index/read.wgsl
@@ -13,13 +13,13 @@
     h : vec2<i32>;
     i : mat2x3<f32>;
     j : mat3x2<f32>;
-    [[align(16)]] k : Inner;
-    [[align(16)]] l : [[stride(16)]] array<Inner, 4>;
+    @align(16) k : Inner;
+    @align(16) l : @stride(16) array<Inner, 4>;
 };
 
-[[binding(0), group(0)]] var<uniform> s : S;
+@binding(0) @group(0) var<uniform> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     let a = s.a;
     let b = s.b;
diff --git a/test/buffer/uniform/static_index/read.wgsl.expected.wgsl b/test/buffer/uniform/static_index/read.wgsl.expected.wgsl
index f43ae3b..b790c19 100644
--- a/test/buffer/uniform/static_index/read.wgsl.expected.wgsl
+++ b/test/buffer/uniform/static_index/read.wgsl.expected.wgsl
@@ -13,15 +13,15 @@
   h : vec2<i32>;
   i : mat2x3<f32>;
   j : mat3x2<f32>;
-  [[align(16)]]
+  @align(16)
   k : Inner;
-  [[align(16)]]
-  l : [[stride(16)]] array<Inner, 4>;
+  @align(16)
+  l : @stride(16) array<Inner, 4>;
 }
 
-[[binding(0), group(0)]] var<uniform> s : S;
+@binding(0) @group(0) var<uniform> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let a = s.a;
   let b = s.b;
diff --git a/test/buffer/uniform/types/array.wgsl b/test/buffer/uniform/types/array.wgsl
index 7151b53..01a7138 100644
--- a/test/buffer/uniform/types/array.wgsl
+++ b/test/buffer/uniform/types/array.wgsl
@@ -1,7 +1,7 @@
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u : array<vec4<f32>, 4>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/buffer/uniform/types/array.wgsl.expected.wgsl b/test/buffer/uniform/types/array.wgsl.expected.wgsl
index 3cfa21e..43d91c8 100644
--- a/test/buffer/uniform/types/array.wgsl.expected.wgsl
+++ b/test/buffer/uniform/types/array.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var<uniform> u : array<vec4<f32>, 4>;
+@group(0) @binding(0) var<uniform> u : array<vec4<f32>, 4>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/buffer/uniform/types/f32.wgsl b/test/buffer/uniform/types/f32.wgsl
index 1f3fbfa..bd785bb 100644
--- a/test/buffer/uniform/types/f32.wgsl
+++ b/test/buffer/uniform/types/f32.wgsl
@@ -1,7 +1,7 @@
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u : f32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/buffer/uniform/types/f32.wgsl.expected.wgsl b/test/buffer/uniform/types/f32.wgsl.expected.wgsl
index 6bd2751..ef2fa27 100644
--- a/test/buffer/uniform/types/f32.wgsl.expected.wgsl
+++ b/test/buffer/uniform/types/f32.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var<uniform> u : f32;
+@group(0) @binding(0) var<uniform> u : f32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/buffer/uniform/types/i32.wgsl b/test/buffer/uniform/types/i32.wgsl
index ca165b4..9d6e5d4 100644
--- a/test/buffer/uniform/types/i32.wgsl
+++ b/test/buffer/uniform/types/i32.wgsl
@@ -1,7 +1,7 @@
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u : i32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/buffer/uniform/types/i32.wgsl.expected.wgsl b/test/buffer/uniform/types/i32.wgsl.expected.wgsl
index 0cf7b04..794f018 100644
--- a/test/buffer/uniform/types/i32.wgsl.expected.wgsl
+++ b/test/buffer/uniform/types/i32.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var<uniform> u : i32;
+@group(0) @binding(0) var<uniform> u : i32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/buffer/uniform/types/mat2x2.wgsl b/test/buffer/uniform/types/mat2x2.wgsl
index d1cc3d3..5522acc 100644
--- a/test/buffer/uniform/types/mat2x2.wgsl
+++ b/test/buffer/uniform/types/mat2x2.wgsl
@@ -1,7 +1,7 @@
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u : mat2x2<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/buffer/uniform/types/mat2x2.wgsl.expected.wgsl b/test/buffer/uniform/types/mat2x2.wgsl.expected.wgsl
index 8c42684..49ce708 100644
--- a/test/buffer/uniform/types/mat2x2.wgsl.expected.wgsl
+++ b/test/buffer/uniform/types/mat2x2.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var<uniform> u : mat2x2<f32>;
+@group(0) @binding(0) var<uniform> u : mat2x2<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/buffer/uniform/types/mat2x3.wgsl b/test/buffer/uniform/types/mat2x3.wgsl
index 0fb978d..5179d28 100644
--- a/test/buffer/uniform/types/mat2x3.wgsl
+++ b/test/buffer/uniform/types/mat2x3.wgsl
@@ -1,7 +1,7 @@
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u : mat2x3<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/buffer/uniform/types/mat2x3.wgsl.expected.wgsl b/test/buffer/uniform/types/mat2x3.wgsl.expected.wgsl
index 5a74e94..e7f0073 100644
--- a/test/buffer/uniform/types/mat2x3.wgsl.expected.wgsl
+++ b/test/buffer/uniform/types/mat2x3.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var<uniform> u : mat2x3<f32>;
+@group(0) @binding(0) var<uniform> u : mat2x3<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/buffer/uniform/types/mat3x2.wgsl b/test/buffer/uniform/types/mat3x2.wgsl
index 59b1b80..0a308b4 100644
--- a/test/buffer/uniform/types/mat3x2.wgsl
+++ b/test/buffer/uniform/types/mat3x2.wgsl
@@ -1,7 +1,7 @@
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u : mat3x2<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/buffer/uniform/types/mat3x2.wgsl.expected.wgsl b/test/buffer/uniform/types/mat3x2.wgsl.expected.wgsl
index 5f16f76..874cf97 100644
--- a/test/buffer/uniform/types/mat3x2.wgsl.expected.wgsl
+++ b/test/buffer/uniform/types/mat3x2.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var<uniform> u : mat3x2<f32>;
+@group(0) @binding(0) var<uniform> u : mat3x2<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/buffer/uniform/types/mat4x4.wgsl b/test/buffer/uniform/types/mat4x4.wgsl
index 7d2a57b..a9bf3ca 100644
--- a/test/buffer/uniform/types/mat4x4.wgsl
+++ b/test/buffer/uniform/types/mat4x4.wgsl
@@ -1,7 +1,7 @@
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u : mat4x4<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/buffer/uniform/types/mat4x4.wgsl.expected.wgsl b/test/buffer/uniform/types/mat4x4.wgsl.expected.wgsl
index a1188d4..aa2f714 100644
--- a/test/buffer/uniform/types/mat4x4.wgsl.expected.wgsl
+++ b/test/buffer/uniform/types/mat4x4.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var<uniform> u : mat4x4<f32>;
+@group(0) @binding(0) var<uniform> u : mat4x4<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/buffer/uniform/types/struct.wgsl b/test/buffer/uniform/types/struct.wgsl
index 135bcab..2c6547c 100644
--- a/test/buffer/uniform/types/struct.wgsl
+++ b/test/buffer/uniform/types/struct.wgsl
@@ -5,10 +5,10 @@
   inner : Inner;
 };
 
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/buffer/uniform/types/struct.wgsl.expected.wgsl b/test/buffer/uniform/types/struct.wgsl.expected.wgsl
index 0e74bf8..f564832 100644
--- a/test/buffer/uniform/types/struct.wgsl.expected.wgsl
+++ b/test/buffer/uniform/types/struct.wgsl.expected.wgsl
@@ -6,9 +6,9 @@
   inner : Inner;
 }
 
-[[group(0), binding(0)]] var<uniform> u : S;
+@group(0) @binding(0) var<uniform> u : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/buffer/uniform/types/u32.wgsl b/test/buffer/uniform/types/u32.wgsl
index a1c80a3..3afc920 100644
--- a/test/buffer/uniform/types/u32.wgsl
+++ b/test/buffer/uniform/types/u32.wgsl
@@ -1,7 +1,7 @@
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u : u32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/buffer/uniform/types/u32.wgsl.expected.wgsl b/test/buffer/uniform/types/u32.wgsl.expected.wgsl
index 6751a05..d5d7e7f 100644
--- a/test/buffer/uniform/types/u32.wgsl.expected.wgsl
+++ b/test/buffer/uniform/types/u32.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var<uniform> u : u32;
+@group(0) @binding(0) var<uniform> u : u32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/buffer/uniform/types/vec2.wgsl b/test/buffer/uniform/types/vec2.wgsl
index 8f2debe..89e8889 100644
--- a/test/buffer/uniform/types/vec2.wgsl
+++ b/test/buffer/uniform/types/vec2.wgsl
@@ -1,7 +1,7 @@
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u : vec2<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/buffer/uniform/types/vec2.wgsl.expected.wgsl b/test/buffer/uniform/types/vec2.wgsl.expected.wgsl
index 61695c1..44de55f 100644
--- a/test/buffer/uniform/types/vec2.wgsl.expected.wgsl
+++ b/test/buffer/uniform/types/vec2.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var<uniform> u : vec2<i32>;
+@group(0) @binding(0) var<uniform> u : vec2<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/buffer/uniform/types/vec3.wgsl b/test/buffer/uniform/types/vec3.wgsl
index 012d269..e571c47 100644
--- a/test/buffer/uniform/types/vec3.wgsl
+++ b/test/buffer/uniform/types/vec3.wgsl
@@ -1,7 +1,7 @@
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u : vec3<u32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/buffer/uniform/types/vec3.wgsl.expected.wgsl b/test/buffer/uniform/types/vec3.wgsl.expected.wgsl
index d8d99e8..be459f7 100644
--- a/test/buffer/uniform/types/vec3.wgsl.expected.wgsl
+++ b/test/buffer/uniform/types/vec3.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var<uniform> u : vec3<u32>;
+@group(0) @binding(0) var<uniform> u : vec3<u32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/buffer/uniform/types/vec4.wgsl b/test/buffer/uniform/types/vec4.wgsl
index 24d63f0..f15e971 100644
--- a/test/buffer/uniform/types/vec4.wgsl
+++ b/test/buffer/uniform/types/vec4.wgsl
@@ -1,7 +1,7 @@
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> u : vec4<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/buffer/uniform/types/vec4.wgsl.expected.wgsl b/test/buffer/uniform/types/vec4.wgsl.expected.wgsl
index fe83de0..41a4f37 100644
--- a/test/buffer/uniform/types/vec4.wgsl.expected.wgsl
+++ b/test/buffer/uniform/types/vec4.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var<uniform> u : vec4<f32>;
+@group(0) @binding(0) var<uniform> u : vec4<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x = u;
 }
diff --git a/test/bug/chromium/1251009.wgsl b/test/bug/chromium/1251009.wgsl
index 4abe77e..7a057c0 100644
--- a/test/bug/chromium/1251009.wgsl
+++ b/test/bug/chromium/1251009.wgsl
@@ -1,19 +1,19 @@
 struct VertexInputs0 {
-  [[builtin(vertex_index)]] vertex_index : u32;
-  [[location(0)]] loc0 : i32;
+  @builtin(vertex_index) vertex_index : u32;
+  @location(0) loc0 : i32;
 };
 struct VertexInputs1 {
-  [[location(2)]] loc1 : u32;
-  [[location(3)]] loc3 : vec4<f32>;
+  @location(2) loc1 : u32;
+  @location(3) loc3 : vec4<f32>;
 };
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main(
   inputs0 : VertexInputs0,
-  [[location(1)]] loc1 : u32,
-  [[builtin(instance_index)]] instance_index : u32,
+  @location(1) loc1 : u32,
+  @builtin(instance_index) instance_index : u32,
   inputs1 : VertexInputs1,
-) -> [[builtin(position)]] vec4<f32> {
+) -> @builtin(position) vec4<f32> {
   let foo : u32 = inputs0.vertex_index + instance_index;
   return vec4<f32>();
 }
diff --git a/test/bug/chromium/1251009.wgsl.expected.wgsl b/test/bug/chromium/1251009.wgsl.expected.wgsl
index c82715d..f761f69 100644
--- a/test/bug/chromium/1251009.wgsl.expected.wgsl
+++ b/test/bug/chromium/1251009.wgsl.expected.wgsl
@@ -1,19 +1,19 @@
 struct VertexInputs0 {
-  [[builtin(vertex_index)]]
+  @builtin(vertex_index)
   vertex_index : u32;
-  [[location(0)]]
+  @location(0)
   loc0 : i32;
 }
 
 struct VertexInputs1 {
-  [[location(2)]]
+  @location(2)
   loc1 : u32;
-  [[location(3)]]
+  @location(3)
   loc3 : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main(inputs0 : VertexInputs0, [[location(1)]] loc1 : u32, [[builtin(instance_index)]] instance_index : u32, inputs1 : VertexInputs1) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(inputs0 : VertexInputs0, @location(1) loc1 : u32, @builtin(instance_index) instance_index : u32, inputs1 : VertexInputs1) -> @builtin(position) vec4<f32> {
   let foo : u32 = (inputs0.vertex_index + instance_index);
   return vec4<f32>();
 }
diff --git a/test/bug/chromium/1273230.wgsl b/test/bug/chromium/1273230.wgsl
index a2152ff..90ed840 100644
--- a/test/bug/chromium/1273230.wgsl
+++ b/test/bug/chromium/1273230.wgsl
@@ -1,6 +1,6 @@
 // /fallthroUgh]
 fn marg8uintin() {
-    _ = (0 );  
+    _ = (0 );
   _ = isNormal(4.);
 _ =   (vec4<f32>( 2.));
 
@@ -37,36 +37,36 @@
 };
 
 struct F32s {
-  values : [[stride(4)]] array<f32>;
+  values : @stride(4) array<f32>;
 };
 
 struct U32s {
-  values : [[stride(4)]] array<u32>;
+  values : @stride(4) array<u32>;
 };
 
 struct I32s {
-  values : [[stride(4)]] array<i32>;
+  values : @stride(4) array<i32>;
 };
 
 struct AU32s {
-  values : [[stride(4)]] array<atomic<u32>>;
+  values : @stride(4) array<atomic<u32>>;
 };
 
 struct AI32s {
-  values : [[stride(4)]] array<atomic<i32>>;
+  values : @stride(4) array<atomic<i32>>;
 };
 
-[[binding(0), group(0)]] var<uniform> uniforms : Uniforms;
+@binding(0) @group(0) var<uniform> uniforms : Uniforms;
 
-[[binding(10), group(0)]] var<storage, read_write> indices : U32s;
+@binding(10) @group(0) var<storage, read_write> indices : U32s;
 
-[[binding(11), group(0)]] var<storage, read_write> positions : F32s;
+@binding(11) @group(0) var<storage, read_write> positions : F32s;
 
-[[binding(20), group(0)]] var<storage, read_write> counters : AU32s;
+@binding(20) @group(0) var<storage, read_write> counters : AU32s;
 
-[[binding(21), group(0)]] var<storage, read_write> LUT : AI32s;
+@binding(21) @group(0) var<storage, read_write> LUT : AI32s;
 
-[[binding(50), group(0)]] var<storage, read_write> dbg : Dbg;
+@binding(50) @group(0) var<storage, read_write> dbg : Dbg;
 
 fn toVoxelPos(position : vec3<f32>) -> vec3<f32> {
   var bbMin = vec3<f32>(uniforms.bbMin.x, uniforms.bbMin.y, uniforms.bbMin.z);
@@ -106,8 +106,8 @@
   var g55 = atomicLoad(&(LUT.values[0]));
 }
 
-[[stage(compute), workgroup_size(128)]]
-fn main_count([[builtin(global_invocation_id)]] GlobalInvocationID : vec3<u32>) {
+@stage(compute) @workgroup_size(128)
+fn main_count(@builtin(global_invocation_id) GlobalInvocationID : vec3<u32>) {
   var triangleIndex = GlobalInvocationID.x;
   if ((triangleIndex >= uniforms.numTriangles)) {
     return;
diff --git a/test/bug/chromium/1273230.wgsl.expected.wgsl b/test/bug/chromium/1273230.wgsl.expected.wgsl
index 4708e0b..3cdfc2b 100644
--- a/test/bug/chromium/1273230.wgsl.expected.wgsl
+++ b/test/bug/chromium/1273230.wgsl.expected.wgsl
@@ -54,36 +54,36 @@
 }
 
 struct F32s {
-  values : [[stride(4)]] array<f32>;
+  values : @stride(4) array<f32>;
 }
 
 struct U32s {
-  values : [[stride(4)]] array<u32>;
+  values : @stride(4) array<u32>;
 }
 
 struct I32s {
-  values : [[stride(4)]] array<i32>;
+  values : @stride(4) array<i32>;
 }
 
 struct AU32s {
-  values : [[stride(4)]] array<atomic<u32>>;
+  values : @stride(4) array<atomic<u32>>;
 }
 
 struct AI32s {
-  values : [[stride(4)]] array<atomic<i32>>;
+  values : @stride(4) array<atomic<i32>>;
 }
 
-[[binding(0), group(0)]] var<uniform> uniforms : Uniforms;
+@binding(0) @group(0) var<uniform> uniforms : Uniforms;
 
-[[binding(10), group(0)]] var<storage, read_write> indices : U32s;
+@binding(10) @group(0) var<storage, read_write> indices : U32s;
 
-[[binding(11), group(0)]] var<storage, read_write> positions : F32s;
+@binding(11) @group(0) var<storage, read_write> positions : F32s;
 
-[[binding(20), group(0)]] var<storage, read_write> counters : AU32s;
+@binding(20) @group(0) var<storage, read_write> counters : AU32s;
 
-[[binding(21), group(0)]] var<storage, read_write> LUT : AI32s;
+@binding(21) @group(0) var<storage, read_write> LUT : AI32s;
 
-[[binding(50), group(0)]] var<storage, read_write> dbg : Dbg;
+@binding(50) @group(0) var<storage, read_write> dbg : Dbg;
 
 fn toVoxelPos(position : vec3<f32>) -> vec3<f32> {
   var bbMin = vec3<f32>(uniforms.bbMin.x, uniforms.bbMin.y, uniforms.bbMin.z);
@@ -123,8 +123,8 @@
   var g55 = atomicLoad(&(LUT.values[0]));
 }
 
-[[stage(compute), workgroup_size(128)]]
-fn main_count([[builtin(global_invocation_id)]] GlobalInvocationID : vec3<u32>) {
+@stage(compute) @workgroup_size(128)
+fn main_count(@builtin(global_invocation_id) GlobalInvocationID : vec3<u32>) {
   var triangleIndex = GlobalInvocationID.x;
   if ((triangleIndex >= uniforms.numTriangles)) {
     return;
diff --git a/test/bug/dawn/947.wgsl b/test/bug/dawn/947.wgsl
index 008d88a..fe12948 100644
--- a/test/bug/dawn/947.wgsl
+++ b/test/bug/dawn/947.wgsl
@@ -2,15 +2,15 @@
     u_scale : vec2<f32>;

     u_offset : vec2<f32>;

 };

-[[binding(0), group(0)]] var<uniform> uniforms : Uniforms;

+@binding(0) @group(0) var<uniform> uniforms : Uniforms;

 

 struct VertexOutputs {

-    [[location(0)]] texcoords : vec2<f32>;

-    [[builtin(position)]] position : vec4<f32>;

+    @location(0) texcoords : vec2<f32>;

+    @builtin(position) position : vec4<f32>;

 };

 

-[[stage(vertex)]] fn vs_main(

-    [[builtin(vertex_index)]] VertexIndex : u32

+@stage(vertex) fn vs_main(

+    @builtin(vertex_index) VertexIndex : u32

 ) -> VertexOutputs {

     var texcoord = array<vec2<f32>, 3>(

         vec2<f32>(-0.5, 0.0),

@@ -43,12 +43,12 @@
     return output;

 }

 

-[[binding(1), group(0)]] var mySampler: sampler;

-[[binding(2), group(0)]] var myTexture: texture_2d<f32>;

+@binding(1) @group(0) var mySampler: sampler;

+@binding(2) @group(0) var myTexture: texture_2d<f32>;

 

-[[stage(fragment)]] fn fs_main(

-    [[location(0)]] texcoord : vec2<f32>

-) -> [[location(0)]] vec4<f32> {

+@stage(fragment) fn fs_main(

+    @location(0) texcoord : vec2<f32>

+) -> @location(0) vec4<f32> {

     // Clamp the texcoord and discard the out-of-bound pixels.

     var clampedTexcoord =

         clamp(texcoord, vec2<f32>(0.0, 0.0), vec2<f32>(1.0, 1.0));

diff --git a/test/bug/dawn/947.wgsl.expected.wgsl b/test/bug/dawn/947.wgsl.expected.wgsl
index a7e4f69..ff78e61 100644
--- a/test/bug/dawn/947.wgsl.expected.wgsl
+++ b/test/bug/dawn/947.wgsl.expected.wgsl
@@ -3,17 +3,17 @@
   u_offset : vec2<f32>;
 }
 
-[[binding(0), group(0)]] var<uniform> uniforms : Uniforms;
+@binding(0) @group(0) var<uniform> uniforms : Uniforms;
 
 struct VertexOutputs {
-  [[location(0)]]
+  @location(0)
   texcoords : vec2<f32>;
-  [[builtin(position)]]
+  @builtin(position)
   position : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn vs_main([[builtin(vertex_index)]] VertexIndex : u32) -> VertexOutputs {
+@stage(vertex)
+fn vs_main(@builtin(vertex_index) VertexIndex : u32) -> VertexOutputs {
   var texcoord = array<vec2<f32>, 3>(vec2<f32>(-0.5, 0.0), vec2<f32>(1.5, 0.0), vec2<f32>(0.5, 2.0));
   var output : VertexOutputs;
   output.position = vec4<f32>(((texcoord[VertexIndex] * 2.0) - vec2<f32>(1.0, 1.0)), 0.0, 1.0);
@@ -26,12 +26,12 @@
   return output;
 }
 
-[[binding(1), group(0)]] var mySampler : sampler;
+@binding(1) @group(0) var mySampler : sampler;
 
-[[binding(2), group(0)]] var myTexture : texture_2d<f32>;
+@binding(2) @group(0) var myTexture : texture_2d<f32>;
 
-[[stage(fragment)]]
-fn fs_main([[location(0)]] texcoord : vec2<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn fs_main(@location(0) texcoord : vec2<f32>) -> @location(0) vec4<f32> {
   var clampedTexcoord = clamp(texcoord, vec2<f32>(0.0, 0.0), vec2<f32>(1.0, 1.0));
   if (!(all((clampedTexcoord == texcoord)))) {
     discard;
diff --git a/test/bug/fxc/dyn_array_idx/read/function.wgsl b/test/bug/fxc/dyn_array_idx/read/function.wgsl
index 5af0065..55ce8a2 100644
--- a/test/bug/fxc/dyn_array_idx/read/function.wgsl
+++ b/test/bug/fxc/dyn_array_idx/read/function.wgsl
@@ -1,16 +1,16 @@
 struct UBO {
   dynamic_idx: i32;
 };
-[[group(0), binding(0)]] var<uniform> ubo: UBO;
+@group(0) @binding(0) var<uniform> ubo: UBO;
 struct S {
   data: array<i32, 64>;
 };
 struct Result {
   out: i32;
 };
-[[group(0), binding(1)]] var<storage, read_write> result: Result;
+@group(0) @binding(1) var<storage, read_write> result: Result;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var s : S;
   result.out = s.data[ubo.dynamic_idx];
diff --git a/test/bug/fxc/dyn_array_idx/read/function.wgsl.expected.wgsl b/test/bug/fxc/dyn_array_idx/read/function.wgsl.expected.wgsl
index 9487d56..bd5d8d7 100644
--- a/test/bug/fxc/dyn_array_idx/read/function.wgsl.expected.wgsl
+++ b/test/bug/fxc/dyn_array_idx/read/function.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   dynamic_idx : i32;
 }
 
-[[group(0), binding(0)]] var<uniform> ubo : UBO;
+@group(0) @binding(0) var<uniform> ubo : UBO;
 
 struct S {
   data : array<i32, 64>;
@@ -12,9 +12,9 @@
   out : i32;
 }
 
-[[group(0), binding(1)]] var<storage, read_write> result : Result;
+@group(0) @binding(1) var<storage, read_write> result : Result;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var s : S;
   result.out = s.data[ubo.dynamic_idx];
diff --git a/test/bug/fxc/dyn_array_idx/read/private.wgsl b/test/bug/fxc/dyn_array_idx/read/private.wgsl
index c7c0b7a..2d7729b 100644
--- a/test/bug/fxc/dyn_array_idx/read/private.wgsl
+++ b/test/bug/fxc/dyn_array_idx/read/private.wgsl
@@ -1,18 +1,18 @@
 struct UBO {
   dynamic_idx: i32;
 };
-[[group(0), binding(0)]] var<uniform> ubo: UBO;
+@group(0) @binding(0) var<uniform> ubo: UBO;
 struct S {
   data: array<i32, 64>;
 };
 struct Result {
   out: i32;
 };
-[[group(0), binding(1)]] var<storage, read_write> result: Result;
+@group(0) @binding(1) var<storage, read_write> result: Result;
 
 var<private> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   result.out = s.data[ubo.dynamic_idx];
 }
diff --git a/test/bug/fxc/dyn_array_idx/read/private.wgsl.expected.wgsl b/test/bug/fxc/dyn_array_idx/read/private.wgsl.expected.wgsl
index 352b5e2..fd84a46 100644
--- a/test/bug/fxc/dyn_array_idx/read/private.wgsl.expected.wgsl
+++ b/test/bug/fxc/dyn_array_idx/read/private.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   dynamic_idx : i32;
 }
 
-[[group(0), binding(0)]] var<uniform> ubo : UBO;
+@group(0) @binding(0) var<uniform> ubo : UBO;
 
 struct S {
   data : array<i32, 64>;
@@ -12,11 +12,11 @@
   out : i32;
 }
 
-[[group(0), binding(1)]] var<storage, read_write> result : Result;
+@group(0) @binding(1) var<storage, read_write> result : Result;
 
 var<private> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   result.out = s.data[ubo.dynamic_idx];
 }
diff --git a/test/bug/fxc/dyn_array_idx/read/storage.wgsl b/test/bug/fxc/dyn_array_idx/read/storage.wgsl
index 62908a2..432c59c 100644
--- a/test/bug/fxc/dyn_array_idx/read/storage.wgsl
+++ b/test/bug/fxc/dyn_array_idx/read/storage.wgsl
@@ -1,18 +1,18 @@
 struct UBO {
   dynamic_idx: i32;
 };
-[[group(0), binding(0)]] var<uniform> ubo: UBO;
+@group(0) @binding(0) var<uniform> ubo: UBO;
 struct Result {
   out: i32;
 };
-[[group(0), binding(2)]] var<storage, read_write> result: Result;
+@group(0) @binding(2) var<storage, read_write> result: Result;
 
 struct SSBO {
   data: array<i32, 4>;
 };
-[[group(0), binding(1)]] var<storage, read_write> ssbo: SSBO;
+@group(0) @binding(1) var<storage, read_write> ssbo: SSBO;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   result.out = ssbo.data[ubo.dynamic_idx];
 }
diff --git a/test/bug/fxc/dyn_array_idx/read/storage.wgsl.expected.wgsl b/test/bug/fxc/dyn_array_idx/read/storage.wgsl.expected.wgsl
index 5445952..9fdea5f 100644
--- a/test/bug/fxc/dyn_array_idx/read/storage.wgsl.expected.wgsl
+++ b/test/bug/fxc/dyn_array_idx/read/storage.wgsl.expected.wgsl
@@ -2,21 +2,21 @@
   dynamic_idx : i32;
 }
 
-[[group(0), binding(0)]] var<uniform> ubo : UBO;
+@group(0) @binding(0) var<uniform> ubo : UBO;
 
 struct Result {
   out : i32;
 }
 
-[[group(0), binding(2)]] var<storage, read_write> result : Result;
+@group(0) @binding(2) var<storage, read_write> result : Result;
 
 struct SSBO {
   data : array<i32, 4>;
 }
 
-[[group(0), binding(1)]] var<storage, read_write> ssbo : SSBO;
+@group(0) @binding(1) var<storage, read_write> ssbo : SSBO;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   result.out = ssbo.data[ubo.dynamic_idx];
 }
diff --git a/test/bug/fxc/dyn_array_idx/read/uniform.wgsl b/test/bug/fxc/dyn_array_idx/read/uniform.wgsl
index 22d1133..be26146 100644
--- a/test/bug/fxc/dyn_array_idx/read/uniform.wgsl
+++ b/test/bug/fxc/dyn_array_idx/read/uniform.wgsl
@@ -1,14 +1,14 @@
 struct UBO {
-  data: [[stride(16)]] array<i32, 4>;
+  data: @stride(16) array<i32, 4>;
   dynamic_idx: i32;
 };
-[[group(0), binding(0)]] var<uniform> ubo: UBO;
+@group(0) @binding(0) var<uniform> ubo: UBO;
 struct Result {
   out: i32;
 };
-[[group(0), binding(2)]] var<storage, read_write> result: Result;
+@group(0) @binding(2) var<storage, read_write> result: Result;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   result.out = ubo.data[ubo.dynamic_idx];
 }
diff --git a/test/bug/fxc/dyn_array_idx/read/uniform.wgsl.expected.wgsl b/test/bug/fxc/dyn_array_idx/read/uniform.wgsl.expected.wgsl
index d0f1e72..7f3ca0b 100644
--- a/test/bug/fxc/dyn_array_idx/read/uniform.wgsl.expected.wgsl
+++ b/test/bug/fxc/dyn_array_idx/read/uniform.wgsl.expected.wgsl
@@ -1,17 +1,17 @@
 struct UBO {
-  data : [[stride(16)]] array<i32, 4>;
+  data : @stride(16) array<i32, 4>;
   dynamic_idx : i32;
 }
 
-[[group(0), binding(0)]] var<uniform> ubo : UBO;
+@group(0) @binding(0) var<uniform> ubo : UBO;
 
 struct Result {
   out : i32;
 }
 
-[[group(0), binding(2)]] var<storage, read_write> result : Result;
+@group(0) @binding(2) var<storage, read_write> result : Result;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   result.out = ubo.data[ubo.dynamic_idx];
 }
diff --git a/test/bug/fxc/dyn_array_idx/read/workgroup.wgsl b/test/bug/fxc/dyn_array_idx/read/workgroup.wgsl
index 66450c2..024506f 100644
--- a/test/bug/fxc/dyn_array_idx/read/workgroup.wgsl
+++ b/test/bug/fxc/dyn_array_idx/read/workgroup.wgsl
@@ -1,18 +1,18 @@
 struct UBO {
   dynamic_idx: i32;
 };
-[[group(0), binding(0)]] var<uniform> ubo: UBO;
+@group(0) @binding(0) var<uniform> ubo: UBO;
 struct S {
   data: array<i32, 64>;
 };
 struct Result {
   out: i32;
 };
-[[group(0), binding(1)]] var<storage, read_write> result: Result;
+@group(0) @binding(1) var<storage, read_write> result: Result;
 
 var<workgroup> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   result.out = s.data[ubo.dynamic_idx];
 }
diff --git a/test/bug/fxc/dyn_array_idx/read/workgroup.wgsl.expected.wgsl b/test/bug/fxc/dyn_array_idx/read/workgroup.wgsl.expected.wgsl
index 80a812d..9427391 100644
--- a/test/bug/fxc/dyn_array_idx/read/workgroup.wgsl.expected.wgsl
+++ b/test/bug/fxc/dyn_array_idx/read/workgroup.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   dynamic_idx : i32;
 }
 
-[[group(0), binding(0)]] var<uniform> ubo : UBO;
+@group(0) @binding(0) var<uniform> ubo : UBO;
 
 struct S {
   data : array<i32, 64>;
@@ -12,11 +12,11 @@
   out : i32;
 }
 
-[[group(0), binding(1)]] var<storage, read_write> result : Result;
+@group(0) @binding(1) var<storage, read_write> result : Result;
 
 var<workgroup> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   result.out = s.data[ubo.dynamic_idx];
 }
diff --git a/test/bug/fxc/dyn_array_idx/write/function.wgsl b/test/bug/fxc/dyn_array_idx/write/function.wgsl
index 3dea9fa..b183971 100644
--- a/test/bug/fxc/dyn_array_idx/write/function.wgsl
+++ b/test/bug/fxc/dyn_array_idx/write/function.wgsl
@@ -1,16 +1,16 @@
 struct UBO {
   dynamic_idx: i32;
 };
-[[group(0), binding(0)]] var<uniform> ubo: UBO;
+@group(0) @binding(0) var<uniform> ubo: UBO;
 struct S {
   data: array<i32, 64>;
 };
 struct Result {
   out: i32;
 };
-[[group(0), binding(1)]] var<storage, read_write> result: Result;
+@group(0) @binding(1) var<storage, read_write> result: Result;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var s : S;
   s.data[ubo.dynamic_idx] = 1;
diff --git a/test/bug/fxc/dyn_array_idx/write/function.wgsl.expected.wgsl b/test/bug/fxc/dyn_array_idx/write/function.wgsl.expected.wgsl
index 18b069c..1504f92 100644
--- a/test/bug/fxc/dyn_array_idx/write/function.wgsl.expected.wgsl
+++ b/test/bug/fxc/dyn_array_idx/write/function.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   dynamic_idx : i32;
 }
 
-[[group(0), binding(0)]] var<uniform> ubo : UBO;
+@group(0) @binding(0) var<uniform> ubo : UBO;
 
 struct S {
   data : array<i32, 64>;
@@ -12,9 +12,9 @@
   out : i32;
 }
 
-[[group(0), binding(1)]] var<storage, read_write> result : Result;
+@group(0) @binding(1) var<storage, read_write> result : Result;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var s : S;
   s.data[ubo.dynamic_idx] = 1;
diff --git a/test/bug/fxc/dyn_array_idx/write/function_via_param.wgsl b/test/bug/fxc/dyn_array_idx/write/function_via_param.wgsl
index bf46f99..4a5bc5f 100644
--- a/test/bug/fxc/dyn_array_idx/write/function_via_param.wgsl
+++ b/test/bug/fxc/dyn_array_idx/write/function_via_param.wgsl
@@ -1,20 +1,20 @@
 struct UBO {
   dynamic_idx: i32;
 };
-[[group(0), binding(0)]] var<uniform> ubo: UBO;
+@group(0) @binding(0) var<uniform> ubo: UBO;
 struct S {
   data: array<i32, 64>;
 };
 struct Result {
   out: i32;
 };
-[[group(0), binding(1)]] var<storage, read_write> result: Result;
+@group(0) @binding(1) var<storage, read_write> result: Result;
 
 fn x(p : ptr<function, S>) {
   (*p).data[ubo.dynamic_idx] = 1;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var s : S;
   x(&s);
diff --git a/test/bug/fxc/dyn_array_idx/write/function_via_param.wgsl.expected.wgsl b/test/bug/fxc/dyn_array_idx/write/function_via_param.wgsl.expected.wgsl
index 57c8a26..52bbcc4 100644
--- a/test/bug/fxc/dyn_array_idx/write/function_via_param.wgsl.expected.wgsl
+++ b/test/bug/fxc/dyn_array_idx/write/function_via_param.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   dynamic_idx : i32;
 }
 
-[[group(0), binding(0)]] var<uniform> ubo : UBO;
+@group(0) @binding(0) var<uniform> ubo : UBO;
 
 struct S {
   data : array<i32, 64>;
@@ -12,13 +12,13 @@
   out : i32;
 }
 
-[[group(0), binding(1)]] var<storage, read_write> result : Result;
+@group(0) @binding(1) var<storage, read_write> result : Result;
 
 fn x(p : ptr<function, S>) {
   (*(p)).data[ubo.dynamic_idx] = 1;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var s : S;
   x(&(s));
diff --git a/test/bug/fxc/dyn_array_idx/write/private.wgsl b/test/bug/fxc/dyn_array_idx/write/private.wgsl
index c8fade0..2720426 100644
--- a/test/bug/fxc/dyn_array_idx/write/private.wgsl
+++ b/test/bug/fxc/dyn_array_idx/write/private.wgsl
@@ -1,18 +1,18 @@
 struct UBO {
   dynamic_idx: i32;
 };
-[[group(0), binding(0)]] var<uniform> ubo: UBO;
+@group(0) @binding(0) var<uniform> ubo: UBO;
 struct S {
   data: array<i32, 64>;
 };
 struct Result {
   out: i32;
 };
-[[group(0), binding(1)]] var<storage, read_write> result: Result;
+@group(0) @binding(1) var<storage, read_write> result: Result;
 
 var<private> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   s.data[ubo.dynamic_idx] = 1;
   result.out = s.data[3];
diff --git a/test/bug/fxc/dyn_array_idx/write/private.wgsl.expected.wgsl b/test/bug/fxc/dyn_array_idx/write/private.wgsl.expected.wgsl
index 7544006..d4c7b0e 100644
--- a/test/bug/fxc/dyn_array_idx/write/private.wgsl.expected.wgsl
+++ b/test/bug/fxc/dyn_array_idx/write/private.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   dynamic_idx : i32;
 }
 
-[[group(0), binding(0)]] var<uniform> ubo : UBO;
+@group(0) @binding(0) var<uniform> ubo : UBO;
 
 struct S {
   data : array<i32, 64>;
@@ -12,11 +12,11 @@
   out : i32;
 }
 
-[[group(0), binding(1)]] var<storage, read_write> result : Result;
+@group(0) @binding(1) var<storage, read_write> result : Result;
 
 var<private> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   s.data[ubo.dynamic_idx] = 1;
   result.out = s.data[3];
diff --git a/test/bug/fxc/dyn_array_idx/write/private_via_param.wgsl b/test/bug/fxc/dyn_array_idx/write/private_via_param.wgsl
index 3c7cf56..c123fe7 100644
--- a/test/bug/fxc/dyn_array_idx/write/private_via_param.wgsl
+++ b/test/bug/fxc/dyn_array_idx/write/private_via_param.wgsl
@@ -1,14 +1,14 @@
 struct UBO {
   dynamic_idx: i32;
 };
-[[group(0), binding(0)]] var<uniform> ubo: UBO;
+@group(0) @binding(0) var<uniform> ubo: UBO;
 struct S {
   data: array<i32, 64>;
 };
 struct Result {
   out: i32;
 };
-[[group(0), binding(1)]] var<storage, read_write> result: Result;
+@group(0) @binding(1) var<storage, read_write> result: Result;
 
 var<private> s : S;
 
@@ -16,7 +16,7 @@
   (*p).data[ubo.dynamic_idx] = 1;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   x(&s);
   result.out = s.data[3];
diff --git a/test/bug/fxc/dyn_array_idx/write/private_via_param.wgsl.expected.wgsl b/test/bug/fxc/dyn_array_idx/write/private_via_param.wgsl.expected.wgsl
index fd99ff2..d4d329f 100644
--- a/test/bug/fxc/dyn_array_idx/write/private_via_param.wgsl.expected.wgsl
+++ b/test/bug/fxc/dyn_array_idx/write/private_via_param.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   dynamic_idx : i32;
 }
 
-[[group(0), binding(0)]] var<uniform> ubo : UBO;
+@group(0) @binding(0) var<uniform> ubo : UBO;
 
 struct S {
   data : array<i32, 64>;
@@ -12,7 +12,7 @@
   out : i32;
 }
 
-[[group(0), binding(1)]] var<storage, read_write> result : Result;
+@group(0) @binding(1) var<storage, read_write> result : Result;
 
 var<private> s : S;
 
@@ -20,7 +20,7 @@
   (*(p)).data[ubo.dynamic_idx] = 1;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   x(&(s));
   result.out = s.data[3];
diff --git a/test/bug/fxc/dyn_array_idx/write/storage.wgsl b/test/bug/fxc/dyn_array_idx/write/storage.wgsl
index 0ced96e..9e4babe 100644
--- a/test/bug/fxc/dyn_array_idx/write/storage.wgsl
+++ b/test/bug/fxc/dyn_array_idx/write/storage.wgsl
@@ -1,18 +1,18 @@
 struct UBO {
   dynamic_idx: i32;
 };
-[[group(0), binding(0)]] var<uniform> ubo: UBO;
+@group(0) @binding(0) var<uniform> ubo: UBO;
 struct Result {
   out: i32;
 };
-[[group(0), binding(2)]] var<storage, read_write> result: Result;
+@group(0) @binding(2) var<storage, read_write> result: Result;
 
 struct SSBO {
   data: array<i32, 4>;
 };
-[[group(0), binding(1)]] var<storage, read_write> ssbo: SSBO;
+@group(0) @binding(1) var<storage, read_write> ssbo: SSBO;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   ssbo.data[ubo.dynamic_idx] = 1;
   result.out = ssbo.data[3];
diff --git a/test/bug/fxc/dyn_array_idx/write/storage.wgsl.expected.wgsl b/test/bug/fxc/dyn_array_idx/write/storage.wgsl.expected.wgsl
index b3d0217..2f5ce76 100644
--- a/test/bug/fxc/dyn_array_idx/write/storage.wgsl.expected.wgsl
+++ b/test/bug/fxc/dyn_array_idx/write/storage.wgsl.expected.wgsl
@@ -2,21 +2,21 @@
   dynamic_idx : i32;
 }
 
-[[group(0), binding(0)]] var<uniform> ubo : UBO;
+@group(0) @binding(0) var<uniform> ubo : UBO;
 
 struct Result {
   out : i32;
 }
 
-[[group(0), binding(2)]] var<storage, read_write> result : Result;
+@group(0) @binding(2) var<storage, read_write> result : Result;
 
 struct SSBO {
   data : array<i32, 4>;
 }
 
-[[group(0), binding(1)]] var<storage, read_write> ssbo : SSBO;
+@group(0) @binding(1) var<storage, read_write> ssbo : SSBO;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   ssbo.data[ubo.dynamic_idx] = 1;
   result.out = ssbo.data[3];
diff --git a/test/bug/fxc/dyn_array_idx/write/workgroup.wgsl b/test/bug/fxc/dyn_array_idx/write/workgroup.wgsl
index 8f7e84b..961f020 100644
--- a/test/bug/fxc/dyn_array_idx/write/workgroup.wgsl
+++ b/test/bug/fxc/dyn_array_idx/write/workgroup.wgsl
@@ -1,18 +1,18 @@
 struct UBO {
   dynamic_idx: i32;
 };
-[[group(0), binding(0)]] var<uniform> ubo: UBO;
+@group(0) @binding(0) var<uniform> ubo: UBO;
 struct S {
   data: array<i32, 64>;
 };
 struct Result {
   out: i32;
 };
-[[group(0), binding(1)]] var<storage, read_write> result: Result;
+@group(0) @binding(1) var<storage, read_write> result: Result;
 
 var<workgroup> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   s.data[ubo.dynamic_idx] = 1;
   result.out = s.data[3];
diff --git a/test/bug/fxc/dyn_array_idx/write/workgroup.wgsl.expected.wgsl b/test/bug/fxc/dyn_array_idx/write/workgroup.wgsl.expected.wgsl
index 7c122d1..f0026f9 100644
--- a/test/bug/fxc/dyn_array_idx/write/workgroup.wgsl.expected.wgsl
+++ b/test/bug/fxc/dyn_array_idx/write/workgroup.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   dynamic_idx : i32;
 }
 
-[[group(0), binding(0)]] var<uniform> ubo : UBO;
+@group(0) @binding(0) var<uniform> ubo : UBO;
 
 struct S {
   data : array<i32, 64>;
@@ -12,11 +12,11 @@
   out : i32;
 }
 
-[[group(0), binding(1)]] var<storage, read_write> result : Result;
+@group(0) @binding(1) var<storage, read_write> result : Result;
 
 var<workgroup> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   s.data[ubo.dynamic_idx] = 1;
   result.out = s.data[3];
diff --git a/test/bug/fxc/gradient_in_varying_loop/1112.wgsl b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl
index b4dff54..bc9a36c 100644
--- a/test/bug/fxc/gradient_in_varying_loop/1112.wgsl
+++ b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl
@@ -1,10 +1,10 @@
 // 1112.wgsl

-[[group(0), binding(0)]] var Sampler: sampler;

-[[group(0), binding(1)]] var randomTexture: texture_2d<f32>;

-[[group(0), binding(2)]] var depthTexture: texture_2d<f32>;

+@group(0) @binding(0) var Sampler: sampler;

+@group(0) @binding(1) var randomTexture: texture_2d<f32>;

+@group(0) @binding(2) var depthTexture: texture_2d<f32>;

 

-[[stage(fragment)]]

-fn main([[location(0)]] vUV : vec2<f32>) -> [[location(0)]] vec4<f32> {

+@stage(fragment)

+fn main(@location(0) vUV : vec2<f32>) -> @location(0) vec4<f32> {

     let random: vec3<f32> = textureSample(randomTexture, Sampler, vUV).rgb;

 

     var i = 0;

diff --git a/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.wgsl b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.wgsl
index 6728e4e..0998c72 100644
--- a/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.wgsl
+++ b/test/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.wgsl
@@ -1,11 +1,11 @@
-[[group(0), binding(0)]] var Sampler : sampler;
+@group(0) @binding(0) var Sampler : sampler;
 
-[[group(0), binding(1)]] var randomTexture : texture_2d<f32>;
+@group(0) @binding(1) var randomTexture : texture_2d<f32>;
 
-[[group(0), binding(2)]] var depthTexture : texture_2d<f32>;
+@group(0) @binding(2) var depthTexture : texture_2d<f32>;
 
-[[stage(fragment)]]
-fn main([[location(0)]] vUV : vec2<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main(@location(0) vUV : vec2<f32>) -> @location(0) vec4<f32> {
   let random : vec3<f32> = textureSample(randomTexture, Sampler, vUV).rgb;
   var i = 0;
   loop {
diff --git a/test/bug/fxc/indexed_assign_to_array_in_struct/1206.wgsl b/test/bug/fxc/indexed_assign_to_array_in_struct/1206.wgsl
index df48e4c..773dd61 100644
--- a/test/bug/fxc/indexed_assign_to_array_in_struct/1206.wgsl
+++ b/test/bug/fxc/indexed_assign_to_array_in_struct/1206.wgsl
@@ -13,10 +13,10 @@
   p : array<Particle>;

 };

 

-[[group(1), binding(3)]] var<storage, read> particles : Particles;

-[[group(1), binding(4)]] var<uniform> sim : Simulation;

+@group(1) @binding(3) var<storage, read> particles : Particles;

+@group(1) @binding(4) var<uniform> sim : Simulation;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   var particle = particles.p[0];

   particle.position[sim.i] = particle.position[sim.i];

diff --git a/test/bug/fxc/indexed_assign_to_array_in_struct/1206.wgsl.expected.wgsl b/test/bug/fxc/indexed_assign_to_array_in_struct/1206.wgsl.expected.wgsl
index 818e3b4..df8979b 100644
--- a/test/bug/fxc/indexed_assign_to_array_in_struct/1206.wgsl.expected.wgsl
+++ b/test/bug/fxc/indexed_assign_to_array_in_struct/1206.wgsl.expected.wgsl
@@ -13,11 +13,11 @@
   p : array<Particle>;
 }
 
-[[group(1), binding(3)]] var<storage, read> particles : Particles;
+@group(1) @binding(3) var<storage, read> particles : Particles;
 
-[[group(1), binding(4)]] var<uniform> sim : Simulation;
+@group(1) @binding(4) var<uniform> sim : Simulation;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var particle = particles.p[0];
   particle.position[sim.i] = particle.position[sim.i];
diff --git a/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_x.wgsl b/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_x.wgsl
index ea01de2..30627d8 100644
--- a/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_x.wgsl
+++ b/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_x.wgsl
@@ -3,9 +3,9 @@
   j : u32;

 };

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   var m1 : mat2x4<f32>;

   m1[uniforms.i][0] = 1.0;

diff --git a/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_x.wgsl.expected.wgsl b/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_x.wgsl.expected.wgsl
index 3b201de..9f79724 100644
--- a/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_x.wgsl.expected.wgsl
+++ b/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_x.wgsl.expected.wgsl
@@ -3,9 +3,9 @@
   j : u32;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var m1 : mat2x4<f32>;
   m1[uniforms.i][0] = 1.0;
diff --git a/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_xy.wgsl b/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_xy.wgsl
index aab333e..e72acfe 100644
--- a/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_xy.wgsl
+++ b/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_xy.wgsl
@@ -3,9 +3,9 @@
   j : u32;

 };

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   var m1 : mat2x4<f32>;

   m1[uniforms.i][uniforms.j] = 1.0;

diff --git a/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_xy.wgsl.expected.wgsl b/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_xy.wgsl.expected.wgsl
index 8b37003..9847626 100644
--- a/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_xy.wgsl.expected.wgsl
+++ b/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_xy.wgsl.expected.wgsl
@@ -3,9 +3,9 @@
   j : u32;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var m1 : mat2x4<f32>;
   m1[uniforms.i][uniforms.j] = 1.0;
diff --git a/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_y.wgsl b/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_y.wgsl
index f893f32..87d95ad 100644
--- a/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_y.wgsl
+++ b/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_y.wgsl
@@ -3,11 +3,11 @@
   j : u32;

 };

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

 

 var<private> m1 : mat2x4<f32>;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   m1[0][uniforms.j] = 1.0;

 }

diff --git a/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_y.wgsl.expected.wgsl b/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_y.wgsl.expected.wgsl
index 031f689..0bf7965 100644
--- a/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_y.wgsl.expected.wgsl
+++ b/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_scalar_y.wgsl.expected.wgsl
@@ -3,11 +3,11 @@
   j : u32;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
 var<private> m1 : mat2x4<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   m1[0][uniforms.j] = 1.0;
 }
diff --git a/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_vector.wgsl b/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_vector.wgsl
index e5ccc3d..8db52b8 100644
--- a/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_vector.wgsl
+++ b/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_vector.wgsl
@@ -3,9 +3,9 @@
   j : u32;

 };

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   var m1 : mat2x4<f32>;

   m1[uniforms.i] = vec4<f32>(1.0);

diff --git a/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_vector.wgsl.expected.wgsl b/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_vector.wgsl.expected.wgsl
index 4dc3783..87cf58c 100644
--- a/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_vector.wgsl.expected.wgsl
+++ b/test/bug/fxc/matrix_assignment_dynamic_index/local_assign_vector.wgsl.expected.wgsl
@@ -3,9 +3,9 @@
   j : u32;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var m1 : mat2x4<f32>;
   m1[uniforms.i] = vec4<f32>(1.0);
diff --git a/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_x.wgsl b/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_x.wgsl
index d12c19c..ed33805 100644
--- a/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_x.wgsl
+++ b/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_x.wgsl
@@ -3,11 +3,11 @@
   j : u32;

 };

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

 

 var<private> m1 : mat2x4<f32>;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   m1[uniforms.i][0] = 1.0;

 }

diff --git a/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_x.wgsl.expected.wgsl b/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_x.wgsl.expected.wgsl
index bc312b2..8f5c87a 100644
--- a/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_x.wgsl.expected.wgsl
+++ b/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_x.wgsl.expected.wgsl
@@ -3,11 +3,11 @@
   j : u32;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
 var<private> m1 : mat2x4<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   m1[uniforms.i][0] = 1.0;
 }
diff --git a/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_xy.wgsl b/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_xy.wgsl
index 40b2bbb..c7e750e 100644
--- a/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_xy.wgsl
+++ b/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_xy.wgsl
@@ -3,11 +3,11 @@
   j : u32;

 };

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

 

 var<private> m1 : mat2x4<f32>;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   m1[uniforms.i][uniforms.j] = 1.0;

 }

diff --git a/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_xy.wgsl.expected.wgsl b/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_xy.wgsl.expected.wgsl
index f706b60..6419eb2 100644
--- a/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_xy.wgsl.expected.wgsl
+++ b/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_xy.wgsl.expected.wgsl
@@ -3,11 +3,11 @@
   j : u32;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
 var<private> m1 : mat2x4<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   m1[uniforms.i][uniforms.j] = 1.0;
 }
diff --git a/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_y.wgsl b/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_y.wgsl
index f893f32..87d95ad 100644
--- a/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_y.wgsl
+++ b/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_y.wgsl
@@ -3,11 +3,11 @@
   j : u32;

 };

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

 

 var<private> m1 : mat2x4<f32>;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   m1[0][uniforms.j] = 1.0;

 }

diff --git a/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_y.wgsl.expected.wgsl b/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_y.wgsl.expected.wgsl
index 031f689..0bf7965 100644
--- a/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_y.wgsl.expected.wgsl
+++ b/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_scalar_y.wgsl.expected.wgsl
@@ -3,11 +3,11 @@
   j : u32;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
 var<private> m1 : mat2x4<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   m1[0][uniforms.j] = 1.0;
 }
diff --git a/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_vector.wgsl b/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_vector.wgsl
index de3bcaa..88338a5 100644
--- a/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_vector.wgsl
+++ b/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_vector.wgsl
@@ -3,11 +3,11 @@
   j : u32;

 };

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

 

 var<private> m1 : mat2x4<f32>;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   m1[uniforms.i] = vec4<f32>(1.0);

 }

diff --git a/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_vector.wgsl.expected.wgsl b/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_vector.wgsl.expected.wgsl
index b1c7255..3642ca8 100644
--- a/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_vector.wgsl.expected.wgsl
+++ b/test/bug/fxc/matrix_assignment_dynamic_index/module_assign_vector.wgsl.expected.wgsl
@@ -3,11 +3,11 @@
   j : u32;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
 var<private> m1 : mat2x4<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   m1[uniforms.i] = vec4<f32>(1.0);
 }
diff --git a/test/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl b/test/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl
index a684c56..82fdac2 100644
--- a/test/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl
+++ b/test/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl
@@ -12,7 +12,7 @@
   }
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
 
   for (var i : i32 = 0; i < 2; i = i + 1) {
diff --git a/test/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl.expected.wgsl b/test/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl.expected.wgsl
index def10cb..be75b18 100644
--- a/test/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl.expected.wgsl
+++ b/test/bug/fxc/vector_assignment_in_loop/loop_call_with_loop.wgsl.expected.wgsl
@@ -15,7 +15,7 @@
   }
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   for(var i : i32 = 0; (i < 2); i = (i + 1)) {
     foo();
diff --git a/test/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl b/test/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl
index c85e301..f7d64cd 100644
--- a/test/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl
+++ b/test/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl
@@ -11,7 +11,7 @@
   v2b[i] = true;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
 
   for (var i : i32 = 0; i < 2; i = i + 1) {
diff --git a/test/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl.expected.wgsl b/test/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl.expected.wgsl
index 21db9dd..8b055f2 100644
--- a/test/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl.expected.wgsl
+++ b/test/bug/fxc/vector_assignment_in_loop/loop_call_with_no_loop.wgsl.expected.wgsl
@@ -14,7 +14,7 @@
   v2b[i] = true;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   for(var i : i32 = 0; (i < 2); i = (i + 1)) {
     foo();
diff --git a/test/bug/fxc/vector_assignment_in_loop/loop_types_all.wgsl b/test/bug/fxc/vector_assignment_in_loop/loop_types_all.wgsl
index 5d42838..51460eb 100644
--- a/test/bug/fxc/vector_assignment_in_loop/loop_types_all.wgsl
+++ b/test/bug/fxc/vector_assignment_in_loop/loop_types_all.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   var v2f : vec2<f32>;
   var v3f : vec3<f32>;
diff --git a/test/bug/fxc/vector_assignment_in_loop/loop_types_all.wgsl.expected.wgsl b/test/bug/fxc/vector_assignment_in_loop/loop_types_all.wgsl.expected.wgsl
index 9f8f2e0..45acb5d 100644
--- a/test/bug/fxc/vector_assignment_in_loop/loop_types_all.wgsl.expected.wgsl
+++ b/test/bug/fxc/vector_assignment_in_loop/loop_types_all.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   var v2f : vec2<f32>;
   var v3f : vec3<f32>;
diff --git a/test/bug/fxc/vector_assignment_in_loop/loop_types_repeated.wgsl b/test/bug/fxc/vector_assignment_in_loop/loop_types_repeated.wgsl
index 7b91e48..beeaa2c 100644
--- a/test/bug/fxc/vector_assignment_in_loop/loop_types_repeated.wgsl
+++ b/test/bug/fxc/vector_assignment_in_loop/loop_types_repeated.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   var v2f : vec2<f32>;
   var v2f_2 : vec2<f32>;
diff --git a/test/bug/fxc/vector_assignment_in_loop/loop_types_repeated.wgsl.expected.wgsl b/test/bug/fxc/vector_assignment_in_loop/loop_types_repeated.wgsl.expected.wgsl
index 74950ca..659db49 100644
--- a/test/bug/fxc/vector_assignment_in_loop/loop_types_repeated.wgsl.expected.wgsl
+++ b/test/bug/fxc/vector_assignment_in_loop/loop_types_repeated.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   var v2f : vec2<f32>;
   var v2f_2 : vec2<f32>;
diff --git a/test/bug/fxc/vector_assignment_in_loop/loop_types_some.wgsl b/test/bug/fxc/vector_assignment_in_loop/loop_types_some.wgsl
index d255bcc..c48c1a8 100644
--- a/test/bug/fxc/vector_assignment_in_loop/loop_types_some.wgsl
+++ b/test/bug/fxc/vector_assignment_in_loop/loop_types_some.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   var v2f : vec2<f32>;
   var v3f : vec3<f32>;
diff --git a/test/bug/fxc/vector_assignment_in_loop/loop_types_some.wgsl.expected.wgsl b/test/bug/fxc/vector_assignment_in_loop/loop_types_some.wgsl.expected.wgsl
index 1fada75..01115a6 100644
--- a/test/bug/fxc/vector_assignment_in_loop/loop_types_some.wgsl.expected.wgsl
+++ b/test/bug/fxc/vector_assignment_in_loop/loop_types_some.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   var v2f : vec2<f32>;
   var v3f : vec3<f32>;
diff --git a/test/bug/fxc/vector_assignment_in_loop/no_loop.wgsl b/test/bug/fxc/vector_assignment_in_loop/no_loop.wgsl
index 276355c..2ff69eb 100644
--- a/test/bug/fxc/vector_assignment_in_loop/no_loop.wgsl
+++ b/test/bug/fxc/vector_assignment_in_loop/no_loop.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   var v2f : vec2<f32>;
   var v3f : vec3<f32>;
diff --git a/test/bug/fxc/vector_assignment_in_loop/no_loop.wgsl.expected.wgsl b/test/bug/fxc/vector_assignment_in_loop/no_loop.wgsl.expected.wgsl
index 2d26774..72a4494 100644
--- a/test/bug/fxc/vector_assignment_in_loop/no_loop.wgsl.expected.wgsl
+++ b/test/bug/fxc/vector_assignment_in_loop/no_loop.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   var v2f : vec2<f32>;
   var v3f : vec3<f32>;
diff --git a/test/bug/tint/1046.wgsl b/test/bug/tint/1046.wgsl
index 8fdfe17..a294edf 100644
--- a/test/bug/tint/1046.wgsl
+++ b/test/bug/tint/1046.wgsl
@@ -4,7 +4,7 @@
 };
 
  struct PointLights {
-    values : [[stride(16)]] array<PointLight>;
+    values : @stride(16) array<PointLight>;
 };
 
  struct Uniforms {
@@ -15,21 +15,21 @@
     color : vec4<f32>;
 };
 
-[[binding(0), group(0)]] var<uniform> uniforms : Uniforms;
-[[binding(1), group(0)]] var<storage_buffer, read> pointLights : PointLights;
-[[binding(2), group(0)]] var mySampler: sampler;
-[[binding(3), group(0)]] var myTexture: texture_2d<f32>;
+@binding(0) @group(0) var<uniform> uniforms : Uniforms;
+@binding(1) @group(0) var<storage_buffer, read> pointLights : PointLights;
+@binding(2) @group(0) var mySampler: sampler;
+@binding(3) @group(0) var myTexture: texture_2d<f32>;
 
 struct FragmentInput {
-    [[builtin(position)]] position  : vec4<f32>;
-    [[location(0)]] view_position   : vec4<f32>;
-    [[location(1)]] normal          : vec4<f32>;
-    [[location(2)]] uv              : vec2<f32>;
-    [[location(3)]] color           : vec4<f32>;
+    @builtin(position) position  : vec4<f32>;
+    @location(0) view_position   : vec4<f32>;
+    @location(1) normal          : vec4<f32>;
+    @location(2) uv              : vec2<f32>;
+    @location(3) color           : vec4<f32>;
 };
 
 struct FragmentOutput {
-    [[location(0)]] color : vec4<f32>;
+    @location(0) color : vec4<f32>;
 };
 
 fn getColor(fragment : FragmentInput) -> vec4<f32>{
@@ -63,7 +63,7 @@
     return color;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main(fragment : FragmentInput) -> FragmentOutput {
 
     var output : FragmentOutput;
diff --git a/test/bug/tint/1046.wgsl.expected.wgsl b/test/bug/tint/1046.wgsl.expected.wgsl
index d67947b..b7000e6 100644
--- a/test/bug/tint/1046.wgsl.expected.wgsl
+++ b/test/bug/tint/1046.wgsl.expected.wgsl
@@ -3,7 +3,7 @@
 }
 
 struct PointLights {
-  values : [[stride(16)]] array<PointLight>;
+  values : @stride(16) array<PointLight>;
 }
 
 struct Uniforms {
@@ -14,29 +14,29 @@
   color : vec4<f32>;
 }
 
-[[binding(0), group(0)]] var<uniform> uniforms : Uniforms;
+@binding(0) @group(0) var<uniform> uniforms : Uniforms;
 
-[[binding(1), group(0)]] var<storage, read> pointLights : PointLights;
+@binding(1) @group(0) var<storage, read> pointLights : PointLights;
 
-[[binding(2), group(0)]] var mySampler : sampler;
+@binding(2) @group(0) var mySampler : sampler;
 
-[[binding(3), group(0)]] var myTexture : texture_2d<f32>;
+@binding(3) @group(0) var myTexture : texture_2d<f32>;
 
 struct FragmentInput {
-  [[builtin(position)]]
+  @builtin(position)
   position : vec4<f32>;
-  [[location(0)]]
+  @location(0)
   view_position : vec4<f32>;
-  [[location(1)]]
+  @location(1)
   normal : vec4<f32>;
-  [[location(2)]]
+  @location(2)
   uv : vec2<f32>;
-  [[location(3)]]
+  @location(3)
   color : vec4<f32>;
 }
 
 struct FragmentOutput {
-  [[location(0)]]
+  @location(0)
   color : vec4<f32>;
 }
 
@@ -55,7 +55,7 @@
   return color;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main(fragment : FragmentInput) -> FragmentOutput {
   var output : FragmentOutput;
   output.color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
diff --git a/test/bug/tint/1064.wgsl b/test/bug/tint/1064.wgsl
index 782a564..4ab5117 100644
--- a/test/bug/tint/1064.wgsl
+++ b/test/bug/tint/1064.wgsl
@@ -1,4 +1,4 @@
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   loop {
     if (false) {
diff --git a/test/bug/tint/1064.wgsl.expected.wgsl b/test/bug/tint/1064.wgsl.expected.wgsl
index 27842dc..581cb90 100644
--- a/test/bug/tint/1064.wgsl.expected.wgsl
+++ b/test/bug/tint/1064.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   loop {
     if (false) {
diff --git a/test/bug/tint/1076.wgsl b/test/bug/tint/1076.wgsl
index b854b18..efa85b8 100644
--- a/test/bug/tint/1076.wgsl
+++ b/test/bug/tint/1076.wgsl
@@ -1,10 +1,10 @@
 struct FragIn {
-  [[location(0)]] a : f32;
-  [[builtin(sample_mask)]] mask : u32;
+  @location(0) a : f32;
+  @builtin(sample_mask) mask : u32;
 };
 
-[[stage(fragment)]]
-fn main(in : FragIn, [[location(1)]] b : f32) -> FragIn {
+@stage(fragment)
+fn main(in : FragIn, @location(1) b : f32) -> FragIn {
   if (in.mask == 0u) {
     return in;
   }
diff --git a/test/bug/tint/1076.wgsl.expected.wgsl b/test/bug/tint/1076.wgsl.expected.wgsl
index 8a91c08..4be185f 100644
--- a/test/bug/tint/1076.wgsl.expected.wgsl
+++ b/test/bug/tint/1076.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
 struct FragIn {
-  [[location(0)]]
+  @location(0)
   a : f32;
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   mask : u32;
 }
 
-[[stage(fragment)]]
-fn main(in : FragIn, [[location(1)]] b : f32) -> FragIn {
+@stage(fragment)
+fn main(in : FragIn, @location(1) b : f32) -> FragIn {
   if ((in.mask == 0u)) {
     return in;
   }
diff --git a/test/bug/tint/1081.wgsl b/test/bug/tint/1081.wgsl
index 7350e4c..591fb04 100644
--- a/test/bug/tint/1081.wgsl
+++ b/test/bug/tint/1081.wgsl
@@ -5,8 +5,8 @@
   return x;
 }
 
-[[stage(fragment)]]
-fn main([[location(1)]] x: vec3<i32>) -> [[location(2)]] i32 {
+@stage(fragment)
+fn main(@location(1) x: vec3<i32>) -> @location(2) i32 {
   var y = x.x;
   loop {
     let r = f(y);
diff --git a/test/bug/tint/1081.wgsl.expected.glsl b/test/bug/tint/1081.wgsl.expected.glsl
index f86361a..dda1d6b 100644
--- a/test/bug/tint/1081.wgsl.expected.glsl
+++ b/test/bug/tint/1081.wgsl.expected.glsl
@@ -1,7 +1,7 @@
 SKIP: FAILED
 
 bug/tint/1081.wgsl:9:25 warning: integral user-defined fragment inputs must have a flat interpolation attribute
-fn main([[location(1)]] x: vec3<i32>) -> [[location(2)]] i32 {
+fn main(@location(1) x: vec3<i32>) -> @location(2) i32 {
                         ^
 
 #version 310 es
@@ -51,7 +51,7 @@
 
 Error parsing GLSL shader:
 ERROR: 0:35: 'int' : must be qualified as flat in
-ERROR: 0:35: '' : compilation terminated 
+ERROR: 0:35: '' : compilation terminated
 ERROR: 2 compilation errors.  No code generated.
 
 
diff --git a/test/bug/tint/1081.wgsl.expected.hlsl b/test/bug/tint/1081.wgsl.expected.hlsl
index 1aba907..73e2830 100644
--- a/test/bug/tint/1081.wgsl.expected.hlsl
+++ b/test/bug/tint/1081.wgsl.expected.hlsl
@@ -1,6 +1,6 @@
-bug/tint/1081.wgsl:9:25 warning: integral user-defined fragment inputs must have a flat interpolation attribute
-fn main([[location(1)]] x: vec3<i32>) -> [[location(2)]] i32 {
-                        ^
+bug/tint/1081.wgsl:9:22 warning: integral user-defined fragment inputs must have a flat interpolation attribute
+fn main(@location(1) x: vec3<i32>) -> @location(2) i32 {
+                     ^
 
 int f(int x) {
   if (true) {
diff --git a/test/bug/tint/1081.wgsl.expected.msl b/test/bug/tint/1081.wgsl.expected.msl
index 0d57311..478e1a5 100644
--- a/test/bug/tint/1081.wgsl.expected.msl
+++ b/test/bug/tint/1081.wgsl.expected.msl
@@ -1,6 +1,6 @@
-bug/tint/1081.wgsl:9:25 warning: integral user-defined fragment inputs must have a flat interpolation attribute
-fn main([[location(1)]] x: vec3<i32>) -> [[location(2)]] i32 {
-                        ^
+bug/tint/1081.wgsl:9:22 warning: integral user-defined fragment inputs must have a flat interpolation attribute
+fn main(@location(1) x: vec3<i32>) -> @location(2) i32 {
+                     ^
 
 #include <metal_stdlib>
 
diff --git a/test/bug/tint/1081.wgsl.expected.spvasm b/test/bug/tint/1081.wgsl.expected.spvasm
index 58810de..b17a7e6 100644
--- a/test/bug/tint/1081.wgsl.expected.spvasm
+++ b/test/bug/tint/1081.wgsl.expected.spvasm
@@ -1,6 +1,6 @@
-bug/tint/1081.wgsl:9:25 warning: integral user-defined fragment inputs must have a flat interpolation attribute
-fn main([[location(1)]] x: vec3<i32>) -> [[location(2)]] i32 {
-                        ^
+bug/tint/1081.wgsl:9:22 warning: integral user-defined fragment inputs must have a flat interpolation attribute
+fn main(@location(1) x: vec3<i32>) -> @location(2) i32 {
+                     ^
 
 ; SPIR-V
 ; Version: 1.3
diff --git a/test/bug/tint/1081.wgsl.expected.wgsl b/test/bug/tint/1081.wgsl.expected.wgsl
index ab2a38d..34d78e1 100644
--- a/test/bug/tint/1081.wgsl.expected.wgsl
+++ b/test/bug/tint/1081.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-bug/tint/1081.wgsl:9:25 warning: integral user-defined fragment inputs must have a flat interpolation attribute
-fn main([[location(1)]] x: vec3<i32>) -> [[location(2)]] i32 {
-                        ^
+bug/tint/1081.wgsl:9:22 warning: integral user-defined fragment inputs must have a flat interpolation attribute
+fn main(@location(1) x: vec3<i32>) -> @location(2) i32 {
+                     ^
 
 fn f(x : i32) -> i32 {
   if ((x == 10)) {
@@ -9,8 +9,8 @@
   return x;
 }
 
-[[stage(fragment)]]
-fn main([[location(1)]] x : vec3<i32>) -> [[location(2)]] i32 {
+@stage(fragment)
+fn main(@location(1) x : vec3<i32>) -> @location(2) i32 {
   var y = x.x;
   loop {
     let r = f(y);
diff --git a/test/bug/tint/1083.wgsl b/test/bug/tint/1083.wgsl
index 3dc8fb2..12e985f 100644
--- a/test/bug/tint/1083.wgsl
+++ b/test/bug/tint/1083.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1;
     let b = 0;
diff --git a/test/bug/tint/1083.wgsl.expected.wgsl b/test/bug/tint/1083.wgsl.expected.wgsl
index 57303cb..4d2024c 100644
--- a/test/bug/tint/1083.wgsl.expected.wgsl
+++ b/test/bug/tint/1083.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1;
   let b = 0;
diff --git a/test/bug/tint/1086.wgsl b/test/bug/tint/1086.wgsl
index 6273135..a5c2982 100644
--- a/test/bug/tint/1086.wgsl
+++ b/test/bug/tint/1086.wgsl
@@ -8,7 +8,7 @@
   x(&v);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn f() {
   g();
 }
diff --git a/test/bug/tint/1086.wgsl.expected.wgsl b/test/bug/tint/1086.wgsl.expected.wgsl
index dbc74be..9c7a8fc 100644
--- a/test/bug/tint/1086.wgsl.expected.wgsl
+++ b/test/bug/tint/1086.wgsl.expected.wgsl
@@ -8,7 +8,7 @@
   x(&(v));
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn f() {
   g();
 }
diff --git a/test/bug/tint/1088.spvasm.expected.wgsl b/test/bug/tint/1088.spvasm.expected.wgsl
index d31ca16..c67da67 100644
--- a/test/bug/tint/1088.spvasm.expected.wgsl
+++ b/test/bug/tint/1088.spvasm.expected.wgsl
@@ -1,11 +1,11 @@
-type Arr = [[stride(64)]] array<mat4x4<f32>, 2u>;
+type Arr = @stride(64) array<mat4x4<f32>, 2u>;
 
-type Arr_1 = [[stride(16)]] array<f32, 4u>;
+type Arr_1 = @stride(16) array<f32, 4u>;
 
 struct LeftOver {
   worldViewProjection : mat4x4<f32>;
   time : f32;
-  [[size(12)]]
+  @size(12)
   padding : u32;
   test2 : Arr;
   test : Arr_1;
@@ -13,7 +13,7 @@
 
 var<private> position : vec3<f32>;
 
-[[group(2), binding(2)]] var<uniform> x_14 : LeftOver;
+@group(2) @binding(2) var<uniform> x_14 : LeftOver;
 
 var<private> vUV : vec2<f32>;
 
@@ -49,14 +49,14 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
-  [[location(0)]]
+  @location(0)
   vUV_1 : vec2<f32>;
 }
 
-[[stage(vertex)]]
-fn main([[location(0)]] position_param : vec3<f32>, [[location(2)]] uv_param : vec2<f32>, [[location(1)]] normal_param : vec3<f32>) -> main_out {
+@stage(vertex)
+fn main(@location(0) position_param : vec3<f32>, @location(2) uv_param : vec2<f32>, @location(1) normal_param : vec3<f32>) -> main_out {
   position = position_param;
   uv = uv_param;
   normal = normal_param;
diff --git a/test/bug/tint/1113.wgsl b/test/bug/tint/1113.wgsl
index 0e7874d..f3a080a 100644
--- a/test/bug/tint/1113.wgsl
+++ b/test/bug/tint/1113.wgsl
@@ -23,23 +23,23 @@
     value_f32_3 : f32;
 };
 
- struct F32s { values : [[stride(4)]] array<f32>; };
- struct U32s { values : [[stride(4)]] array<u32>; };
- struct I32s { values : [[stride(4)]] array<i32>; };
- struct AU32s { values : [[stride(4)]] array<atomic<u32>>; };
- struct AI32s { values : [[stride(4)]] array<atomic<i32>>; };
+ struct F32s { values : @stride(4) array<f32>; };
+ struct U32s { values : @stride(4) array<u32>; };
+ struct I32s { values : @stride(4) array<i32>; };
+ struct AU32s { values : @stride(4) array<atomic<u32>>; };
+ struct AI32s { values : @stride(4) array<atomic<i32>>; };
 
 // IN
-[[binding(0), group(0)]] var<uniform> uniforms : Uniforms;
-[[binding(10), group(0)]] var<storage, read_write> indices : U32s;
-[[binding(11), group(0)]] var<storage, read_write> positions : F32s;
+@binding(0) @group(0) var<uniform> uniforms : Uniforms;
+@binding(10) @group(0) var<storage, read_write> indices : U32s;
+@binding(11) @group(0) var<storage, read_write> positions : F32s;
 
 // OUT
-[[binding(20), group(0)]] var<storage, read_write> counters : AU32s;
-[[binding(21), group(0)]] var<storage, read_write> LUT : AI32s;
+@binding(20) @group(0) var<storage, read_write> counters : AU32s;
+@binding(21) @group(0) var<storage, read_write> LUT : AI32s;
 
 // DEBUG
-[[binding(50), group(0)]] var<storage, read_write> dbg : Dbg;
+@binding(50) @group(0) var<storage, read_write> dbg : Dbg;
 
 fn toVoxelPos(position : vec3<f32>) -> vec3<f32>{
 
@@ -95,8 +95,8 @@
 
 }
 
-[[stage(compute), workgroup_size(128)]]
-fn main_count([[builtin(global_invocation_id)]] GlobalInvocationID : vec3<u32>) {
+@stage(compute) @workgroup_size(128)
+fn main_count(@builtin(global_invocation_id) GlobalInvocationID : vec3<u32>) {
 
     var triangleIndex = GlobalInvocationID.x;
 
@@ -132,8 +132,8 @@
 
 }
 
-[[stage(compute), workgroup_size(128)]]
-fn main_create_lut([[builtin(global_invocation_id)]] GlobalInvocationID : vec3<u32>) {
+@stage(compute) @workgroup_size(128)
+fn main_create_lut(@builtin(global_invocation_id) GlobalInvocationID : vec3<u32>) {
 
     var voxelIndex = GlobalInvocationID.x;
 
@@ -155,8 +155,8 @@
 
 }
 
-[[stage(compute), workgroup_size(128)]]
-fn main_sort_triangles([[builtin(global_invocation_id)]] GlobalInvocationID : vec3<u32>) {
+@stage(compute) @workgroup_size(128)
+fn main_sort_triangles(@builtin(global_invocation_id) GlobalInvocationID : vec3<u32>) {
 
     var triangleIndex = GlobalInvocationID.x;
 
diff --git a/test/bug/tint/1113.wgsl.expected.wgsl b/test/bug/tint/1113.wgsl.expected.wgsl
index ce45595..9eeb16c 100644
--- a/test/bug/tint/1113.wgsl.expected.wgsl
+++ b/test/bug/tint/1113.wgsl.expected.wgsl
@@ -23,36 +23,36 @@
 }
 
 struct F32s {
-  values : [[stride(4)]] array<f32>;
+  values : @stride(4) array<f32>;
 }
 
 struct U32s {
-  values : [[stride(4)]] array<u32>;
+  values : @stride(4) array<u32>;
 }
 
 struct I32s {
-  values : [[stride(4)]] array<i32>;
+  values : @stride(4) array<i32>;
 }
 
 struct AU32s {
-  values : [[stride(4)]] array<atomic<u32>>;
+  values : @stride(4) array<atomic<u32>>;
 }
 
 struct AI32s {
-  values : [[stride(4)]] array<atomic<i32>>;
+  values : @stride(4) array<atomic<i32>>;
 }
 
-[[binding(0), group(0)]] var<uniform> uniforms : Uniforms;
+@binding(0) @group(0) var<uniform> uniforms : Uniforms;
 
-[[binding(10), group(0)]] var<storage, read_write> indices : U32s;
+@binding(10) @group(0) var<storage, read_write> indices : U32s;
 
-[[binding(11), group(0)]] var<storage, read_write> positions : F32s;
+@binding(11) @group(0) var<storage, read_write> positions : F32s;
 
-[[binding(20), group(0)]] var<storage, read_write> counters : AU32s;
+@binding(20) @group(0) var<storage, read_write> counters : AU32s;
 
-[[binding(21), group(0)]] var<storage, read_write> LUT : AI32s;
+@binding(21) @group(0) var<storage, read_write> LUT : AI32s;
 
-[[binding(50), group(0)]] var<storage, read_write> dbg : Dbg;
+@binding(50) @group(0) var<storage, read_write> dbg : Dbg;
 
 fn toVoxelPos(position : vec3<f32>) -> vec3<f32> {
   var bbMin = vec3<f32>(uniforms.bbMin.x, uniforms.bbMin.y, uniforms.bbMin.z);
@@ -92,8 +92,8 @@
   var g55 = atomicLoad(&(LUT.values[0]));
 }
 
-[[stage(compute), workgroup_size(128)]]
-fn main_count([[builtin(global_invocation_id)]] GlobalInvocationID : vec3<u32>) {
+@stage(compute) @workgroup_size(128)
+fn main_count(@builtin(global_invocation_id) GlobalInvocationID : vec3<u32>) {
   var triangleIndex = GlobalInvocationID.x;
   if ((triangleIndex >= uniforms.numTriangles)) {
     return;
@@ -117,8 +117,8 @@
   }
 }
 
-[[stage(compute), workgroup_size(128)]]
-fn main_create_lut([[builtin(global_invocation_id)]] GlobalInvocationID : vec3<u32>) {
+@stage(compute) @workgroup_size(128)
+fn main_create_lut(@builtin(global_invocation_id) GlobalInvocationID : vec3<u32>) {
   var voxelIndex = GlobalInvocationID.x;
   doIgnore();
   var maxVoxels = ((uniforms.gridSize * uniforms.gridSize) * uniforms.gridSize);
@@ -133,8 +133,8 @@
   atomicStore(&(LUT.values[voxelIndex]), offset);
 }
 
-[[stage(compute), workgroup_size(128)]]
-fn main_sort_triangles([[builtin(global_invocation_id)]] GlobalInvocationID : vec3<u32>) {
+@stage(compute) @workgroup_size(128)
+fn main_sort_triangles(@builtin(global_invocation_id) GlobalInvocationID : vec3<u32>) {
   var triangleIndex = GlobalInvocationID.x;
   doIgnore();
   if ((triangleIndex >= uniforms.numTriangles)) {
diff --git a/test/bug/tint/1121.wgsl b/test/bug/tint/1121.wgsl
index c7fba35..24a125b 100644
--- a/test/bug/tint/1121.wgsl
+++ b/test/bug/tint/1121.wgsl
@@ -15,7 +15,7 @@
  struct LightsBuffer {
     lights: array<LightData>;
 };
-[[group(0), binding(0)]] var<storage, read_write> lightsBuffer: LightsBuffer;
+@group(0) @binding(0) var<storage, read_write> lightsBuffer: LightsBuffer;
 struct TileLightIdData {
     count: atomic<u32>;
     lightId: array<u32, 64>;
@@ -23,8 +23,8 @@
  struct Tiles {
     data: array<TileLightIdData, 4>;
 };
-[[group(1), binding(0)]] var<storage, read_write> tileLightId: Tiles;
-  
+@group(1) @binding(0) var<storage, read_write> tileLightId: Tiles;
+
  struct Config {
     numLights : u32;
     numTiles : u32;
@@ -33,7 +33,7 @@
     numTileLightSlot : u32;
     tileSize : u32;
 };
-[[group(2), binding(0)]] var<uniform> config: Config;
+@group(2) @binding(0) var<uniform> config: Config;
  struct Uniforms {
     min : vec4<f32>;
     max : vec4<f32>;
@@ -43,16 +43,16 @@
     // Tile info
     fullScreenSize : vec4<f32>;    // width, height
 };
-[[group(3), binding(0)]] var<uniform> uniforms: Uniforms;
-[[stage(compute), workgroup_size(64, 1, 1)]]
-fn main([[builtin(global_invocation_id)]] GlobalInvocationID : vec3<u32>) {
+@group(3) @binding(0) var<uniform> uniforms: Uniforms;
+@stage(compute) @workgroup_size(64, 1, 1)
+fn main(@builtin(global_invocation_id) GlobalInvocationID : vec3<u32>) {
     var index = GlobalInvocationID.x;
     if (index >= config.numLights) {
         return;
     }
     // Light position updating
     lightsBuffer.lights[index].position.y = lightsBuffer.lights[index].position.y - 0.1 + 0.001 * (f32(index) - 64.0 * floor(f32(index) / 64.0));
-  
+
     if (lightsBuffer.lights[index].position.y < uniforms.min.y) {
         lightsBuffer.lights[index].position.y = uniforms.max.y;
     }
diff --git a/test/bug/tint/1121.wgsl.expected.wgsl b/test/bug/tint/1121.wgsl.expected.wgsl
index 2620967..61d81e5 100644
--- a/test/bug/tint/1121.wgsl.expected.wgsl
+++ b/test/bug/tint/1121.wgsl.expected.wgsl
@@ -8,7 +8,7 @@
   lights : array<LightData>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> lightsBuffer : LightsBuffer;
+@group(0) @binding(0) var<storage, read_write> lightsBuffer : LightsBuffer;
 
 struct TileLightIdData {
   count : atomic<u32>;
@@ -19,7 +19,7 @@
   data : array<TileLightIdData, 4>;
 }
 
-[[group(1), binding(0)]] var<storage, read_write> tileLightId : Tiles;
+@group(1) @binding(0) var<storage, read_write> tileLightId : Tiles;
 
 struct Config {
   numLights : u32;
@@ -30,7 +30,7 @@
   tileSize : u32;
 }
 
-[[group(2), binding(0)]] var<uniform> config : Config;
+@group(2) @binding(0) var<uniform> config : Config;
 
 struct Uniforms {
   min : vec4<f32>;
@@ -40,10 +40,10 @@
   fullScreenSize : vec4<f32>;
 }
 
-[[group(3), binding(0)]] var<uniform> uniforms : Uniforms;
+@group(3) @binding(0) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(64, 1, 1)]]
-fn main([[builtin(global_invocation_id)]] GlobalInvocationID : vec3<u32>) {
+@stage(compute) @workgroup_size(64, 1, 1)
+fn main(@builtin(global_invocation_id) GlobalInvocationID : vec3<u32>) {
   var index = GlobalInvocationID.x;
   if ((index >= config.numLights)) {
     return;
diff --git a/test/bug/tint/1136.wgsl b/test/bug/tint/1136.wgsl
index ee73478..2fd739e 100644
--- a/test/bug/tint/1136.wgsl
+++ b/test/bug/tint/1136.wgsl
@@ -1,3 +1,3 @@
  struct Buffer { data: u32; };
-[[group(0), binding(0)]] var<storage, read_write> buffer: Buffer;
+@group(0) @binding(0) var<storage, read_write> buffer: Buffer;
 fn main() { buffer.data = buffer.data + 1u;  }
diff --git a/test/bug/tint/1136.wgsl.expected.wgsl b/test/bug/tint/1136.wgsl.expected.wgsl
index 7bf2195..d17771a 100644
--- a/test/bug/tint/1136.wgsl.expected.wgsl
+++ b/test/bug/tint/1136.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   data : u32;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> buffer : Buffer;
+@group(0) @binding(0) var<storage, read_write> buffer : Buffer;
 
 fn main() {
   buffer.data = (buffer.data + 1u);
diff --git a/test/bug/tint/1321.wgsl b/test/bug/tint/1321.wgsl
index 0c2d7ec..1ab9e23 100644
--- a/test/bug/tint/1321.wgsl
+++ b/test/bug/tint/1321.wgsl
@@ -2,7 +2,7 @@
   return 1;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var arr = array<f32, 4>();
   for (let a = &arr[foo()]; ;) {
diff --git a/test/bug/tint/1321.wgsl.expected.wgsl b/test/bug/tint/1321.wgsl.expected.wgsl
index 8f7d2f7..2117393 100644
--- a/test/bug/tint/1321.wgsl.expected.wgsl
+++ b/test/bug/tint/1321.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   return 1;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var arr = array<f32, 4>();
   for(let a = &(arr[foo()]); ; ) {
diff --git a/test/bug/tint/1369.wgsl b/test/bug/tint/1369.wgsl
index 434bb2b..b90b8e3 100644
--- a/test/bug/tint/1369.wgsl
+++ b/test/bug/tint/1369.wgsl
@@ -3,7 +3,7 @@
   return true;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn f() {
     var v = call_discard();
     var also_unreachable : bool;
diff --git a/test/bug/tint/1369.wgsl.expected.wgsl b/test/bug/tint/1369.wgsl.expected.wgsl
index eb44227..2da3171 100644
--- a/test/bug/tint/1369.wgsl.expected.wgsl
+++ b/test/bug/tint/1369.wgsl.expected.wgsl
@@ -11,7 +11,7 @@
   return true;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn f() {
   var v = call_discard();
   var also_unreachable : bool;
diff --git a/test/bug/tint/1385.wgsl b/test/bug/tint/1385.wgsl
index 6b4154a..78f402e 100644
--- a/test/bug/tint/1385.wgsl
+++ b/test/bug/tint/1385.wgsl
@@ -1,11 +1,11 @@
-[[group(0), binding(1)]]
+@group(0) @binding(1)
 var<storage, read> data : array<i32>;
 
 fn foo() -> i32 {
   return data[0];
 }
 
-[[stage(compute), workgroup_size(16, 16, 1)]]
+@stage(compute) @workgroup_size(16, 16, 1)
 fn main() {
   foo();
 }
diff --git a/test/bug/tint/1385.wgsl.expected.wgsl b/test/bug/tint/1385.wgsl.expected.wgsl
index 98c9e90..3e522fd 100644
--- a/test/bug/tint/1385.wgsl.expected.wgsl
+++ b/test/bug/tint/1385.wgsl.expected.wgsl
@@ -1,10 +1,10 @@
-[[group(0), binding(1)]] var<storage, read> data : array<i32>;
+@group(0) @binding(1) var<storage, read> data : array<i32>;
 
 fn foo() -> i32 {
   return data[0];
 }
 
-[[stage(compute), workgroup_size(16, 16, 1)]]
+@stage(compute) @workgroup_size(16, 16, 1)
 fn main() {
   foo();
 }
diff --git a/test/bug/tint/219.spvasm.expected.wgsl b/test/bug/tint/219.spvasm.expected.wgsl
index 0932553..3bc5263 100644
--- a/test/bug/tint/219.spvasm.expected.wgsl
+++ b/test/bug/tint/219.spvasm.expected.wgsl
@@ -9,7 +9,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/bug/tint/221.wgsl b/test/bug/tint/221.wgsl
index 9c6a70f..e38a666 100644
--- a/test/bug/tint/221.wgsl
+++ b/test/bug/tint/221.wgsl
@@ -5,9 +5,9 @@
   data : Arr;
 };
 
-[[group(0), binding (0)]] var<storage, read_write> b : Buf;
+@group(0) @binding(0) var<storage, read_write> b : Buf;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var i : u32 = 0u;
   loop {
diff --git a/test/bug/tint/221.wgsl.expected.wgsl b/test/bug/tint/221.wgsl.expected.wgsl
index 6173b61..a0e5251 100644
--- a/test/bug/tint/221.wgsl.expected.wgsl
+++ b/test/bug/tint/221.wgsl.expected.wgsl
@@ -5,9 +5,9 @@
   data : Arr;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> b : Buf;
+@group(0) @binding(0) var<storage, read_write> b : Buf;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var i : u32 = 0u;
   loop {
diff --git a/test/bug/tint/292.wgsl b/test/bug/tint/292.wgsl
index 78f469c..daebb4f 100644
--- a/test/bug/tint/292.wgsl
+++ b/test/bug/tint/292.wgsl
@@ -1,5 +1,5 @@
-[[stage(vertex)]]
-fn main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main() -> @builtin(position) vec4<f32> {
   var light : vec3<f32> = vec3<f32>(1.2, 1., 2.);
   var negative_light : vec3<f32> = -light;
   return vec4<f32>();
diff --git a/test/bug/tint/292.wgsl.expected.wgsl b/test/bug/tint/292.wgsl.expected.wgsl
index 08967d9..071b9da 100644
--- a/test/bug/tint/292.wgsl.expected.wgsl
+++ b/test/bug/tint/292.wgsl.expected.wgsl
@@ -1,5 +1,5 @@
-[[stage(vertex)]]
-fn main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main() -> @builtin(position) vec4<f32> {
   var light : vec3<f32> = vec3<f32>(1.200000048, 1.0, 2.0);
   var negative_light : vec3<f32> = -(light);
   return vec4<f32>();
diff --git a/test/bug/tint/294.wgsl b/test/bug/tint/294.wgsl
index 83831c7..4917c47 100644
--- a/test/bug/tint/294.wgsl
+++ b/test/bug/tint/294.wgsl
@@ -3,6 +3,6 @@
   colour : vec3<f32>;
 };
  struct Lights {
-  light : [[stride(32)]] array<Light>;
+  light : @stride(32) array<Light>;
 };
-[[group(0), binding(1)]] var<storage, read> lights : Lights;
+@group(0) @binding(1) var<storage, read> lights : Lights;
diff --git a/test/bug/tint/294.wgsl.expected.wgsl b/test/bug/tint/294.wgsl.expected.wgsl
index f4c1358..87f08de 100644
--- a/test/bug/tint/294.wgsl.expected.wgsl
+++ b/test/bug/tint/294.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
 }
 
 struct Lights {
-  light : [[stride(32)]] array<Light>;
+  light : @stride(32) array<Light>;
 }
 
-[[group(0), binding(1)]] var<storage, read> lights : Lights;
+@group(0) @binding(1) var<storage, read> lights : Lights;
diff --git a/test/bug/tint/369.wgsl b/test/bug/tint/369.wgsl
index 05386cb..00383ab 100644
--- a/test/bug/tint/369.wgsl
+++ b/test/bug/tint/369.wgsl
@@ -2,5 +2,5 @@
     m : mat2x2<f32>;
 };
 
-[[group(0), binding(0)]] var<storage> SSBO : S;
-[[group(0), binding(0)]] var<uniform> UBO : S;
+@group(0) @binding(0) var<storage> SSBO : S;
+@group(0) @binding(0) var<uniform> UBO : S;
diff --git a/test/bug/tint/369.wgsl.expected.wgsl b/test/bug/tint/369.wgsl.expected.wgsl
index f4192a7..b361b1f 100644
--- a/test/bug/tint/369.wgsl.expected.wgsl
+++ b/test/bug/tint/369.wgsl.expected.wgsl
@@ -2,6 +2,6 @@
   m : mat2x2<f32>;
 }
 
-[[group(0), binding(0)]] var<storage> SSBO : S;
+@group(0) @binding(0) var<storage> SSBO : S;
 
-[[group(0), binding(0)]] var<uniform> UBO : S;
+@group(0) @binding(0) var<uniform> UBO : S;
diff --git a/test/bug/tint/403.wgsl b/test/bug/tint/403.wgsl
index 011fbf0..82d5e91 100644
--- a/test/bug/tint/403.wgsl
+++ b/test/bug/tint/403.wgsl
@@ -6,12 +6,12 @@
   transform2 : mat2x2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_20 : vertexUniformBuffer1;
-[[group(1), binding(0)]] var<uniform> x_26 : vertexUniformBuffer2;
+@group(0) @binding(0) var<uniform> x_20 : vertexUniformBuffer1;
+@group(1) @binding(0) var<uniform> x_26 : vertexUniformBuffer2;
 
 
-[[stage(vertex)]]
-fn main([[builtin(vertex_index)]] gl_VertexIndex : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(@builtin(vertex_index) gl_VertexIndex : u32) -> @builtin(position) vec4<f32> {
   var indexable : array<vec2<f32>, 3>;
   let x_23 : mat2x2<f32> = x_20.transform1;
   let x_28 : mat2x2<f32> = x_26.transform2;
diff --git a/test/bug/tint/403.wgsl.expected.wgsl b/test/bug/tint/403.wgsl.expected.wgsl
index 2fa1f18..025e4a5 100644
--- a/test/bug/tint/403.wgsl.expected.wgsl
+++ b/test/bug/tint/403.wgsl.expected.wgsl
@@ -6,12 +6,12 @@
   transform2 : mat2x2<f32>;
 }
 
-[[group(0), binding(0)]] var<uniform> x_20 : vertexUniformBuffer1;
+@group(0) @binding(0) var<uniform> x_20 : vertexUniformBuffer1;
 
-[[group(1), binding(0)]] var<uniform> x_26 : vertexUniformBuffer2;
+@group(1) @binding(0) var<uniform> x_26 : vertexUniformBuffer2;
 
-[[stage(vertex)]]
-fn main([[builtin(vertex_index)]] gl_VertexIndex : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(@builtin(vertex_index) gl_VertexIndex : u32) -> @builtin(position) vec4<f32> {
   var indexable : array<vec2<f32>, 3>;
   let x_23 : mat2x2<f32> = x_20.transform1;
   let x_28 : mat2x2<f32> = x_26.transform2;
diff --git a/test/bug/tint/413.spvasm.expected.wgsl b/test/bug/tint/413.spvasm.expected.wgsl
index 6ca1a05..a9318dc 100644
--- a/test/bug/tint/413.spvasm.expected.wgsl
+++ b/test/bug/tint/413.spvasm.expected.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var Src : texture_2d<u32>;
+@group(0) @binding(0) var Src : texture_2d<u32>;
 
-[[group(0), binding(1)]] var Dst : texture_storage_2d<r32uint, write>;
+@group(0) @binding(1) var Dst : texture_storage_2d<r32uint, write>;
 
 fn main_1() {
   var srcValue : vec4<u32>;
@@ -13,7 +13,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/bug/tint/453.wgsl b/test/bug/tint/453.wgsl
index 588e7c2..99e53b4 100644
--- a/test/bug/tint/453.wgsl
+++ b/test/bug/tint/453.wgsl
@@ -1,7 +1,7 @@
-[[group(0), binding(0)]] var Src : texture_2d<u32>;
-[[group(0), binding(1)]] var Dst : texture_storage_2d<r32uint, write>;
+@group(0) @binding(0) var Src : texture_2d<u32>;
+@group(0) @binding(1) var Dst : texture_storage_2d<r32uint, write>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var srcValue : vec4<u32>;
   let x_22 : vec4<u32> = textureLoad(Src, vec2<i32>(0, 0), 0);
diff --git a/test/bug/tint/453.wgsl.expected.wgsl b/test/bug/tint/453.wgsl.expected.wgsl
index 92c30e7..8fe5795 100644
--- a/test/bug/tint/453.wgsl.expected.wgsl
+++ b/test/bug/tint/453.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(0), binding(0)]] var Src : texture_2d<u32>;
+@group(0) @binding(0) var Src : texture_2d<u32>;
 
-[[group(0), binding(1)]] var Dst : texture_storage_2d<r32uint, write>;
+@group(0) @binding(1) var Dst : texture_storage_2d<r32uint, write>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var srcValue : vec4<u32>;
   let x_22 : vec4<u32> = textureLoad(Src, vec2<i32>(0, 0), 0);
diff --git a/test/bug/tint/492.wgsl b/test/bug/tint/492.wgsl
index bbba0aa..48ae3df 100644
--- a/test/bug/tint/492.wgsl
+++ b/test/bug/tint/492.wgsl
@@ -1,7 +1,7 @@
  struct S { a : i32; };
-[[group(0), binding(0)]] var<storage, read_write> buf : S;
+@group(0) @binding(0) var<storage, read_write> buf : S;
 
-[[stage(compute), workgroup_size(1)]] fn main() {
+@stage(compute) @workgroup_size(1) fn main() {
   let p : ptr<storage, i32, read_write> = &buf.a;
   *p = 12;
 }
diff --git a/test/bug/tint/492.wgsl.expected.wgsl b/test/bug/tint/492.wgsl.expected.wgsl
index 6563f70..181e7e6 100644
--- a/test/bug/tint/492.wgsl.expected.wgsl
+++ b/test/bug/tint/492.wgsl.expected.wgsl
@@ -2,9 +2,9 @@
   a : i32;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> buf : S;
+@group(0) @binding(0) var<storage, read_write> buf : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let p : ptr<storage, i32, read_write> = &(buf.a);
   *(p) = 12;
diff --git a/test/bug/tint/534.wgsl b/test/bug/tint/534.wgsl
index 1aaf535..782f193 100644
--- a/test/bug/tint/534.wgsl
+++ b/test/bug/tint/534.wgsl
@@ -5,21 +5,21 @@
     channelCount : u32;

 };

  struct OutputBuf {

-    result : [[stride(4)]] array<u32>;

+    result : @stride(4) array<u32>;

 };

-[[group(0), binding(0)]] var src : texture_2d<f32>;

-[[group(0), binding(1)]] var dst : texture_2d<f32>;

-[[group(0), binding(2)]] var<storage_buffer, read_write> output : OutputBuf;

-[[group(0), binding(3)]] var<uniform> uniforms : Uniforms;

-//[[builtin(global_invocation_id)]] var<in> GlobalInvocationID : vec3<u32>;

+@group(0) @binding(0) var src : texture_2d<f32>;

+@group(0) @binding(1) var dst : texture_2d<f32>;

+@group(0) @binding(2) var<storage_buffer, read_write> output : OutputBuf;

+@group(0) @binding(3) var<uniform> uniforms : Uniforms;

+//@builtin(global_invocation_id) var<in> GlobalInvocationID : vec3<u32>;

 // Fp16 logic

 // Infinity and NaN won't happen in this test case.

 fn ConvertToFp16FloatValue(fp32 : f32) -> u32 {

     return 1u;

 }

 

-[[stage(compute), workgroup_size(1, 1, 1)]]

-fn main([[builtin(global_invocation_id)]] GlobalInvocationID : vec3<u32>) {

+@stage(compute) @workgroup_size(1, 1, 1)

+fn main(@builtin(global_invocation_id) GlobalInvocationID : vec3<u32>) {

     var size : vec2<i32> = textureDimensions(src);

     var dstTexCoord : vec2<i32> = vec2<i32>(GlobalInvocationID.xy);

     var srcTexCoord : vec2<i32> = dstTexCoord;

diff --git a/test/bug/tint/534.wgsl.expected.wgsl b/test/bug/tint/534.wgsl.expected.wgsl
index bc45f8a..dfd0f17 100644
--- a/test/bug/tint/534.wgsl.expected.wgsl
+++ b/test/bug/tint/534.wgsl.expected.wgsl
@@ -6,23 +6,23 @@
 }
 
 struct OutputBuf {
-  result : [[stride(4)]] array<u32>;
+  result : @stride(4) array<u32>;
 }
 
-[[group(0), binding(0)]] var src : texture_2d<f32>;
+@group(0) @binding(0) var src : texture_2d<f32>;
 
-[[group(0), binding(1)]] var dst : texture_2d<f32>;
+@group(0) @binding(1) var dst : texture_2d<f32>;
 
-[[group(0), binding(2)]] var<storage, read_write> output : OutputBuf;
+@group(0) @binding(2) var<storage, read_write> output : OutputBuf;
 
-[[group(0), binding(3)]] var<uniform> uniforms : Uniforms;
+@group(0) @binding(3) var<uniform> uniforms : Uniforms;
 
 fn ConvertToFp16FloatValue(fp32 : f32) -> u32 {
   return 1u;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
-fn main([[builtin(global_invocation_id)]] GlobalInvocationID : vec3<u32>) {
+@stage(compute) @workgroup_size(1, 1, 1)
+fn main(@builtin(global_invocation_id) GlobalInvocationID : vec3<u32>) {
   var size : vec2<i32> = textureDimensions(src);
   var dstTexCoord : vec2<i32> = vec2<i32>(GlobalInvocationID.xy);
   var srcTexCoord : vec2<i32> = dstTexCoord;
diff --git a/test/bug/tint/744.wgsl b/test/bug/tint/744.wgsl
index c8c8cd2..31daa13 100644
--- a/test/bug/tint/744.wgsl
+++ b/test/bug/tint/744.wgsl
@@ -7,13 +7,13 @@
     numbers: array<u32>;
 };
 
-[[group(0), binding(0)]] var<storage, read> firstMatrix : Matrix;
-[[group(0), binding(1)]] var<storage, read> secondMatrix : Matrix;
-[[group(0), binding(2)]] var<storage, write> resultMatrix : Matrix;
-[[group(0), binding(3)]] var<uniform> uniforms : Uniforms;
+@group(0) @binding(0) var<storage, read> firstMatrix : Matrix;
+@group(0) @binding(1) var<storage, read> secondMatrix : Matrix;
+@group(0) @binding(2) var<storage, write> resultMatrix : Matrix;
+@group(0) @binding(3) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(2,2,1)]]
-fn main([[builtin(global_invocation_id)]] global_id  : vec3<u32>) {
+@stage(compute) @workgroup_size(2,2,1)
+fn main(@builtin(global_invocation_id) global_id  : vec3<u32>) {
     let resultCell : vec2<u32> = vec2<u32>(global_id.y, global_id.x);
     let dimInner : u32 = uniforms.aShape.y;
     let dimOutter: u32 = uniforms.outShape.y;
diff --git a/test/bug/tint/744.wgsl.expected.wgsl b/test/bug/tint/744.wgsl.expected.wgsl
index 001dd88..e670d80 100644
--- a/test/bug/tint/744.wgsl.expected.wgsl
+++ b/test/bug/tint/744.wgsl.expected.wgsl
@@ -8,16 +8,16 @@
   numbers : array<u32>;
 }
 
-[[group(0), binding(0)]] var<storage, read> firstMatrix : Matrix;
+@group(0) @binding(0) var<storage, read> firstMatrix : Matrix;
 
-[[group(0), binding(1)]] var<storage, read> secondMatrix : Matrix;
+@group(0) @binding(1) var<storage, read> secondMatrix : Matrix;
 
-[[group(0), binding(2)]] var<storage, write> resultMatrix : Matrix;
+@group(0) @binding(2) var<storage, write> resultMatrix : Matrix;
 
-[[group(0), binding(3)]] var<uniform> uniforms : Uniforms;
+@group(0) @binding(3) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(2, 2, 1)]]
-fn main([[builtin(global_invocation_id)]] global_id : vec3<u32>) {
+@stage(compute) @workgroup_size(2, 2, 1)
+fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
   let resultCell : vec2<u32> = vec2<u32>(global_id.y, global_id.x);
   let dimInner : u32 = uniforms.aShape.y;
   let dimOutter : u32 = uniforms.outShape.y;
diff --git a/test/bug/tint/749.spvasm.expected.wgsl b/test/bug/tint/749.spvasm.expected.wgsl
index 59e1920..f23b495 100644
--- a/test/bug/tint/749.spvasm.expected.wgsl
+++ b/test/bug/tint/749.spvasm.expected.wgsl
@@ -10,7 +10,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_188 : buf0;
+@group(0) @binding(0) var<uniform> x_188 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -1474,12 +1474,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 }
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/bug/tint/757.wgsl b/test/bug/tint/757.wgsl
index c5aca24..b2a05de 100644
--- a/test/bug/tint/757.wgsl
+++ b/test/bug/tint/757.wgsl
@@ -3,16 +3,16 @@
   level : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> constants : Constants;
-[[group(0), binding(1)]] var myTexture : texture_2d_array<f32>;
+@group(0) @binding(0) var<uniform> constants : Constants;
+@group(0) @binding(1) var myTexture : texture_2d_array<f32>;
 
  struct Result {
-  values : [[stride(4)]] array<f32>;
+  values : @stride(4) array<f32>;
 };
-[[group(0), binding(3)]] var<storage, read_write> result : Result;
+@group(0) @binding(3) var<storage, read_write> result : Result;
 
-[[stage(compute), workgroup_size(1)]]
-fn main([[builtin(global_invocation_id)]] GlobalInvocationID : vec3<u32>) {
+@stage(compute) @workgroup_size(1)
+fn main(@builtin(global_invocation_id) GlobalInvocationID : vec3<u32>) {
   var flatIndex : u32 =
     2u * 2u * GlobalInvocationID.z +
     2u * GlobalInvocationID.y +
diff --git a/test/bug/tint/757.wgsl.expected.wgsl b/test/bug/tint/757.wgsl.expected.wgsl
index b19bb0c..b237cd5 100644
--- a/test/bug/tint/757.wgsl.expected.wgsl
+++ b/test/bug/tint/757.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   level : i32;
 }
 
-[[group(0), binding(0)]] var<uniform> constants : Constants;
+@group(0) @binding(0) var<uniform> constants : Constants;
 
-[[group(0), binding(1)]] var myTexture : texture_2d_array<f32>;
+@group(0) @binding(1) var myTexture : texture_2d_array<f32>;
 
 struct Result {
-  values : [[stride(4)]] array<f32>;
+  values : @stride(4) array<f32>;
 }
 
-[[group(0), binding(3)]] var<storage, read_write> result : Result;
+@group(0) @binding(3) var<storage, read_write> result : Result;
 
-[[stage(compute), workgroup_size(1)]]
-fn main([[builtin(global_invocation_id)]] GlobalInvocationID : vec3<u32>) {
+@stage(compute) @workgroup_size(1)
+fn main(@builtin(global_invocation_id) GlobalInvocationID : vec3<u32>) {
   var flatIndex : u32 = ((((2u * 2u) * GlobalInvocationID.z) + (2u * GlobalInvocationID.y)) + GlobalInvocationID.x);
   flatIndex = (flatIndex * 1u);
   var texel : vec4<f32> = textureLoad(myTexture, vec2<i32>(GlobalInvocationID.xy), 0, 0);
diff --git a/test/bug/tint/782.wgsl b/test/bug/tint/782.wgsl
index dbfcb00..3fe1f23 100644
--- a/test/bug/tint/782.wgsl
+++ b/test/bug/tint/782.wgsl
@@ -1,4 +1,4 @@
-type ArrayExplicitStride = [[stride(4)]] array<i32, 2>;
+type ArrayExplicitStride = @stride(4) array<i32, 2>;
 type ArrayImplicitStride =               array<i32, 2>;
 
 fn foo() {
diff --git a/test/bug/tint/782.wgsl.expected.wgsl b/test/bug/tint/782.wgsl.expected.wgsl
index 2719237..a4f37bc 100644
--- a/test/bug/tint/782.wgsl.expected.wgsl
+++ b/test/bug/tint/782.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-type ArrayExplicitStride = [[stride(4)]] array<i32, 2>;
+type ArrayExplicitStride = @stride(4) array<i32, 2>;
 
 type ArrayImplicitStride = array<i32, 2>;
 
diff --git a/test/bug/tint/804.spv.expected.glsl b/test/bug/tint/804.spv.expected.glsl
index f94b4a6..85b35ec 100644
--- a/test/bug/tint/804.spv.expected.glsl
+++ b/test/bug/tint/804.spv.expected.glsl
@@ -10,7 +10,7 @@
   field1 : u32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_75 : buf0;
+@group(0) @binding(0) var<uniform> x_75 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
diff --git a/test/bug/tint/804.spv.expected.hlsl b/test/bug/tint/804.spv.expected.hlsl
index f94b4a6..85b35ec 100644
--- a/test/bug/tint/804.spv.expected.hlsl
+++ b/test/bug/tint/804.spv.expected.hlsl
@@ -10,7 +10,7 @@
   field1 : u32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_75 : buf0;
+@group(0) @binding(0) var<uniform> x_75 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
diff --git a/test/bug/tint/824.wgsl b/test/bug/tint/824.wgsl
index ed907e3..68a7b66 100644
--- a/test/bug/tint/824.wgsl
+++ b/test/bug/tint/824.wgsl
@@ -1,10 +1,10 @@
 struct Output {
-    [[builtin(position)]] Position : vec4<f32>;
-    [[location(0)]] color : vec4<f32>;
+    @builtin(position) Position : vec4<f32>;
+    @location(0) color : vec4<f32>;
 };
-[[stage(vertex)]] fn main(
-    [[builtin(vertex_index)]] VertexIndex : u32,
-    [[builtin(instance_index)]] InstanceIndex : u32) -> Output {
+@stage(vertex) fn main(
+    @builtin(vertex_index) VertexIndex : u32,
+    @builtin(instance_index) InstanceIndex : u32) -> Output {
     // TODO: remove workaround for Tint unary array access broke
     let zv : array<vec2<f32>, 4> = array<vec2<f32>, 4>(
         vec2<f32>(0.2, 0.2),
diff --git a/test/bug/tint/824.wgsl.expected.wgsl b/test/bug/tint/824.wgsl.expected.wgsl
index 2c795fe..cb77758 100644
--- a/test/bug/tint/824.wgsl.expected.wgsl
+++ b/test/bug/tint/824.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
 struct Output {
-  [[builtin(position)]]
+  @builtin(position)
   Position : vec4<f32>;
-  [[location(0)]]
+  @location(0)
   color : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main([[builtin(vertex_index)]] VertexIndex : u32, [[builtin(instance_index)]] InstanceIndex : u32) -> Output {
+@stage(vertex)
+fn main(@builtin(vertex_index) VertexIndex : u32, @builtin(instance_index) InstanceIndex : u32) -> Output {
   let zv : array<vec2<f32>, 4> = array<vec2<f32>, 4>(vec2<f32>(0.200000003, 0.200000003), vec2<f32>(0.300000012, 0.300000012), vec2<f32>(-0.100000001, -0.100000001), vec2<f32>(1.100000024, 1.100000024));
   let z : f32 = zv[InstanceIndex].x;
   var output : Output;
diff --git a/test/bug/tint/827.wgsl b/test/bug/tint/827.wgsl
index 35fa8db..8a1bbe8 100644
--- a/test/bug/tint/827.wgsl
+++ b/test/bug/tint/827.wgsl
@@ -4,11 +4,11 @@
 
 let width : u32 = 128u;
 
-[[group(0), binding(0)]] var tex : texture_depth_2d;
-[[group(0), binding(1)]] var<storage, read_write> result : Result;
+@group(0) @binding(0) var tex : texture_depth_2d;
+@group(0) @binding(1) var<storage, read_write> result : Result;
 
-[[stage(compute), workgroup_size(1)]] fn main(
-    [[builtin(global_invocation_id)]] GlobalInvocationId : vec3<u32>
+@stage(compute) @workgroup_size(1) fn main(
+    @builtin(global_invocation_id) GlobalInvocationId : vec3<u32>
 ) {
     result.values[GlobalInvocationId.y * width + GlobalInvocationId.x] = textureLoad(
         tex, vec2<i32>(i32(GlobalInvocationId.x), i32(GlobalInvocationId.y)), 0);
diff --git a/test/bug/tint/827.wgsl.expected.wgsl b/test/bug/tint/827.wgsl.expected.wgsl
index af06757..2f7d250 100644
--- a/test/bug/tint/827.wgsl.expected.wgsl
+++ b/test/bug/tint/827.wgsl.expected.wgsl
@@ -4,11 +4,11 @@
 
 let width : u32 = 128u;
 
-[[group(0), binding(0)]] var tex : texture_depth_2d;
+@group(0) @binding(0) var tex : texture_depth_2d;
 
-[[group(0), binding(1)]] var<storage, read_write> result : Result;
+@group(0) @binding(1) var<storage, read_write> result : Result;
 
-[[stage(compute), workgroup_size(1)]]
-fn main([[builtin(global_invocation_id)]] GlobalInvocationId : vec3<u32>) {
+@stage(compute) @workgroup_size(1)
+fn main(@builtin(global_invocation_id) GlobalInvocationId : vec3<u32>) {
   result.values[((GlobalInvocationId.y * width) + GlobalInvocationId.x)] = textureLoad(tex, vec2<i32>(i32(GlobalInvocationId.x), i32(GlobalInvocationId.y)), 0);
 }
diff --git a/test/bug/tint/870.spvasm.expected.wgsl b/test/bug/tint/870.spvasm.expected.wgsl
index 73a04d4..4af74ac 100644
--- a/test/bug/tint/870.spvasm.expected.wgsl
+++ b/test/bug/tint/870.spvasm.expected.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(4)]] array<i32, 6u>;
+type Arr = @stride(4) array<i32, 6u>;
 
 struct sspp962805860buildInformationS {
   footprint : vec4<f32>;
@@ -11,7 +11,7 @@
   passthru : sspp962805860buildInformationS;
 }
 
-[[group(0), binding(2)]] var<storage, read> sspp962805860buildInformation : x_B4_BuildInformation;
+@group(0) @binding(2) var<storage, read> sspp962805860buildInformation : x_B4_BuildInformation;
 
 fn main_1() {
   var orientation : array<i32, 6u>;
@@ -25,7 +25,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/bug/tint/913.wgsl b/test/bug/tint/913.wgsl
index 2df489f..8a49ced 100644
--- a/test/bug/tint/913.wgsl
+++ b/test/bug/tint/913.wgsl
@@ -8,16 +8,16 @@
  struct OutputBuf {
     result : array<u32>;
 };
-[[group(0), binding(0)]] var src : texture_2d<f32>;
-[[group(0), binding(1)]] var dst : texture_2d<f32>;
-[[group(0), binding(2)]] var<storage, read_write> output : OutputBuf;
-[[group(0), binding(3)]] var<uniform> uniforms : Uniforms;
+@group(0) @binding(0) var src : texture_2d<f32>;
+@group(0) @binding(1) var dst : texture_2d<f32>;
+@group(0) @binding(2) var<storage, read_write> output : OutputBuf;
+@group(0) @binding(3) var<uniform> uniforms : Uniforms;
 fn aboutEqual(value : f32, expect : f32) -> bool {
     // The value diff should be smaller than the hard coded tolerance.
     return abs(value - expect) < 0.001;
 }
-[[stage(compute), workgroup_size(1, 1, 1)]]
-fn main([[builtin(global_invocation_id)]] GlobalInvocationID : vec3<u32>) {
+@stage(compute) @workgroup_size(1, 1, 1)
+fn main(@builtin(global_invocation_id) GlobalInvocationID : vec3<u32>) {
     let srcSize : vec2<i32> = textureDimensions(src);
     let dstSize : vec2<i32> = textureDimensions(dst);
     let dstTexCoord : vec2<u32> = vec2<u32>(GlobalInvocationID.xy);
@@ -67,4 +67,4 @@
     } else {
         output.result[outputIndex] = 0u;
     }
-}
\ No newline at end of file
+}
diff --git a/test/bug/tint/913.wgsl.expected.wgsl b/test/bug/tint/913.wgsl.expected.wgsl
index 322d0b1..9c30250 100644
--- a/test/bug/tint/913.wgsl.expected.wgsl
+++ b/test/bug/tint/913.wgsl.expected.wgsl
@@ -10,20 +10,20 @@
   result : array<u32>;
 }
 
-[[group(0), binding(0)]] var src : texture_2d<f32>;
+@group(0) @binding(0) var src : texture_2d<f32>;
 
-[[group(0), binding(1)]] var dst : texture_2d<f32>;
+@group(0) @binding(1) var dst : texture_2d<f32>;
 
-[[group(0), binding(2)]] var<storage, read_write> output : OutputBuf;
+@group(0) @binding(2) var<storage, read_write> output : OutputBuf;
 
-[[group(0), binding(3)]] var<uniform> uniforms : Uniforms;
+@group(0) @binding(3) var<uniform> uniforms : Uniforms;
 
 fn aboutEqual(value : f32, expect : f32) -> bool {
   return (abs((value - expect)) < 0.001);
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
-fn main([[builtin(global_invocation_id)]] GlobalInvocationID : vec3<u32>) {
+@stage(compute) @workgroup_size(1, 1, 1)
+fn main(@builtin(global_invocation_id) GlobalInvocationID : vec3<u32>) {
   let srcSize : vec2<i32> = textureDimensions(src);
   let dstSize : vec2<i32> = textureDimensions(dst);
   let dstTexCoord : vec2<u32> = vec2<u32>(GlobalInvocationID.xy);
diff --git a/test/bug/tint/914.wgsl b/test/bug/tint/914.wgsl
index 372e0d1..655c3ab 100644
--- a/test/bug/tint/914.wgsl
+++ b/test/bug/tint/914.wgsl
@@ -7,10 +7,10 @@
     numbers: array<f32>;
 };
 
-[[group(0), binding(0)]] var<storage, read> firstMatrix : Matrix;
-[[group(0), binding(1)]] var<storage, read> secondMatrix : Matrix;
-[[group(0), binding(2)]] var<storage, write> resultMatrix : Matrix;
-[[group(0), binding(3)]] var<uniform> uniforms : Uniforms;
+@group(0) @binding(0) var<storage, read> firstMatrix : Matrix;
+@group(0) @binding(1) var<storage, read> secondMatrix : Matrix;
+@group(0) @binding(2) var<storage, write> resultMatrix : Matrix;
+@group(0) @binding(3) var<uniform> uniforms : Uniforms;
 
 fn mm_readA(row : u32, col : u32) -> f32  {
     if (row < uniforms.dimAOuter && col < uniforms.dimInner)
@@ -45,9 +45,9 @@
 let TileInner : u32 = 64u;
 var<workgroup> mm_Asub : array<array<f32, 64>, 64>;
 var<workgroup> mm_Bsub : array<array<f32, 64>, 64>;
-[[stage(compute), workgroup_size(16, 16, 1)]]
-fn main([[builtin(local_invocation_id)]] local_id : vec3<u32>,
-        [[builtin(global_invocation_id)]] global_id  : vec3<u32>) {
+@stage(compute) @workgroup_size(16, 16, 1)
+fn main(@builtin(local_invocation_id) local_id : vec3<u32>,
+        @builtin(global_invocation_id) global_id  : vec3<u32>) {
     let tileRow : u32 = local_id.y * RowPerThread;
     let tileCol : u32 = local_id.x * ColPerThread;
 
@@ -120,4 +120,4 @@
                     acc[index]);
     }
     }
-}
\ No newline at end of file
+}
diff --git a/test/bug/tint/914.wgsl.expected.wgsl b/test/bug/tint/914.wgsl.expected.wgsl
index bfa7c61..7d88d77 100644
--- a/test/bug/tint/914.wgsl.expected.wgsl
+++ b/test/bug/tint/914.wgsl.expected.wgsl
@@ -8,13 +8,13 @@
   numbers : array<f32>;
 }
 
-[[group(0), binding(0)]] var<storage, read> firstMatrix : Matrix;
+@group(0) @binding(0) var<storage, read> firstMatrix : Matrix;
 
-[[group(0), binding(1)]] var<storage, read> secondMatrix : Matrix;
+@group(0) @binding(1) var<storage, read> secondMatrix : Matrix;
 
-[[group(0), binding(2)]] var<storage, write> resultMatrix : Matrix;
+@group(0) @binding(2) var<storage, write> resultMatrix : Matrix;
 
-[[group(0), binding(3)]] var<uniform> uniforms : Uniforms;
+@group(0) @binding(3) var<uniform> uniforms : Uniforms;
 
 fn mm_readA(row : u32, col : u32) -> f32 {
   if (((row < uniforms.dimAOuter) && (col < uniforms.dimInner))) {
@@ -53,8 +53,8 @@
 
 var<workgroup> mm_Bsub : array<array<f32, 64>, 64>;
 
-[[stage(compute), workgroup_size(16, 16, 1)]]
-fn main([[builtin(local_invocation_id)]] local_id : vec3<u32>, [[builtin(global_invocation_id)]] global_id : vec3<u32>) {
+@stage(compute) @workgroup_size(16, 16, 1)
+fn main(@builtin(local_invocation_id) local_id : vec3<u32>, @builtin(global_invocation_id) global_id : vec3<u32>) {
   let tileRow : u32 = (local_id.y * RowPerThread);
   let tileCol : u32 = (local_id.x * ColPerThread);
   let globalRow : u32 = (global_id.y * RowPerThread);
diff --git a/test/bug/tint/922.wgsl b/test/bug/tint/922.wgsl
index 0d334f2..450aba1 100644
--- a/test/bug/tint/922.wgsl
+++ b/test/bug/tint/922.wgsl
@@ -21,25 +21,25 @@
 };
 
 struct ub_MaterialParams {
-    u_TexMtx: [[stride(32)]] array<Mat4x2_,1>;
+    u_TexMtx: @stride(32) array<Mat4x2_,1>;
     u_Misc0_: vec4<f32>;
 };
 
 struct ub_PacketParams {
-    u_PosMtx: [[stride(48)]] array<Mat4x3_,32>;
+    u_PosMtx: @stride(48) array<Mat4x3_,32>;
 };
 
 struct VertexOutput {
-    [[location(0)]] v_Color: vec4<f32>;
-    [[location(1)]] v_TexCoord: vec2<f32>;
-    [[builtin(position)]] member: vec4<f32>;
+    @location(0) v_Color: vec4<f32>;
+    @location(1) v_TexCoord: vec2<f32>;
+    @builtin(position) member: vec4<f32>;
 };
 
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> global: ub_SceneParams;
-[[group(0), binding(1)]]
+@group(0) @binding(1)
 var<uniform> global1: ub_MaterialParams;
-[[group(0), binding(2)]]
+@group(0) @binding(2)
 var<uniform> global2: ub_PacketParams;
 var<private> a_Position1: vec3<f32>;
 var<private> a_UV1: vec2<f32>;
@@ -283,8 +283,8 @@
     }
 }
 
-[[stage(vertex)]]
-fn main([[location(0)]] a_Position: vec3<f32>, [[location(1)]] a_UV: vec2<f32>, [[location(2)]] a_Color: vec4<f32>, [[location(3)]] a_Normal: vec3<f32>, [[location(4)]] a_PosMtxIdx: f32) -> VertexOutput {
+@stage(vertex)
+fn main(@location(0) a_Position: vec3<f32>, @location(1) a_UV: vec2<f32>, @location(2) a_Color: vec4<f32>, @location(3) a_Normal: vec3<f32>, @location(4) a_PosMtxIdx: f32) -> VertexOutput {
     a_Position1 = a_Position;
     a_UV1 = a_UV;
     a_Color1 = a_Color;
diff --git a/test/bug/tint/922.wgsl.expected.wgsl b/test/bug/tint/922.wgsl.expected.wgsl
index 82929da..ac8b48c 100644
--- a/test/bug/tint/922.wgsl.expected.wgsl
+++ b/test/bug/tint/922.wgsl.expected.wgsl
@@ -21,28 +21,28 @@
 }
 
 struct ub_MaterialParams {
-  u_TexMtx : [[stride(32)]] array<Mat4x2_, 1>;
+  u_TexMtx : @stride(32) array<Mat4x2_, 1>;
   u_Misc0_ : vec4<f32>;
 }
 
 struct ub_PacketParams {
-  u_PosMtx : [[stride(48)]] array<Mat4x3_, 32>;
+  u_PosMtx : @stride(48) array<Mat4x3_, 32>;
 }
 
 struct VertexOutput {
-  [[location(0)]]
+  @location(0)
   v_Color : vec4<f32>;
-  [[location(1)]]
+  @location(1)
   v_TexCoord : vec2<f32>;
-  [[builtin(position)]]
+  @builtin(position)
   member : vec4<f32>;
 }
 
-[[group(0), binding(0)]] var<uniform> global : ub_SceneParams;
+@group(0) @binding(0) var<uniform> global : ub_SceneParams;
 
-[[group(0), binding(1)]] var<uniform> global1 : ub_MaterialParams;
+@group(0) @binding(1) var<uniform> global1 : ub_MaterialParams;
 
-[[group(0), binding(2)]] var<uniform> global2 : ub_PacketParams;
+@group(0) @binding(2) var<uniform> global2 : ub_PacketParams;
 
 var<private> a_Position1 : vec3<f32>;
 
@@ -279,8 +279,8 @@
   }
 }
 
-[[stage(vertex)]]
-fn main([[location(0)]] a_Position : vec3<f32>, [[location(1)]] a_UV : vec2<f32>, [[location(2)]] a_Color : vec4<f32>, [[location(3)]] a_Normal : vec3<f32>, [[location(4)]] a_PosMtxIdx : f32) -> VertexOutput {
+@stage(vertex)
+fn main(@location(0) a_Position : vec3<f32>, @location(1) a_UV : vec2<f32>, @location(2) a_Color : vec4<f32>, @location(3) a_Normal : vec3<f32>, @location(4) a_PosMtxIdx : f32) -> VertexOutput {
   a_Position1 = a_Position;
   a_UV1 = a_UV;
   a_Color1 = a_Color;
diff --git a/test/bug/tint/926.wgsl b/test/bug/tint/926.wgsl
index b308f5a..652d196 100644
--- a/test/bug/tint/926.wgsl
+++ b/test/bug/tint/926.wgsl
@@ -1,12 +1,12 @@
  struct DrawIndirectArgs {
   vertexCount : atomic<u32>;
 };
-[[group(0), binding(5)]] var<storage, read_write> drawOut : DrawIndirectArgs;
+@group(0) @binding(5) var<storage, read_write> drawOut : DrawIndirectArgs;
 
 var<private> cubeVerts : u32 = 0u;
 
-[[stage(compute), workgroup_size(1)]]
-fn computeMain([[builtin(global_invocation_id)]] global_id : vec3<u32>) {
+@stage(compute) @workgroup_size(1)
+fn computeMain(@builtin(global_invocation_id) global_id : vec3<u32>) {
   // Increment cubeVerts based on some criteria...
 
   // This fails SPIR-V validation
diff --git a/test/bug/tint/926.wgsl.expected.wgsl b/test/bug/tint/926.wgsl.expected.wgsl
index 978979b..6af7afb 100644
--- a/test/bug/tint/926.wgsl.expected.wgsl
+++ b/test/bug/tint/926.wgsl.expected.wgsl
@@ -2,11 +2,11 @@
   vertexCount : atomic<u32>;
 }
 
-[[group(0), binding(5)]] var<storage, read_write> drawOut : DrawIndirectArgs;
+@group(0) @binding(5) var<storage, read_write> drawOut : DrawIndirectArgs;
 
 var<private> cubeVerts : u32 = 0u;
 
-[[stage(compute), workgroup_size(1)]]
-fn computeMain([[builtin(global_invocation_id)]] global_id : vec3<u32>) {
+@stage(compute) @workgroup_size(1)
+fn computeMain(@builtin(global_invocation_id) global_id : vec3<u32>) {
   let firstVertex : u32 = atomicAdd(&(drawOut.vertexCount), cubeVerts);
 }
diff --git a/test/bug/tint/942.wgsl b/test/bug/tint/942.wgsl
index eb2ae53..273dc53 100644
--- a/test/bug/tint/942.wgsl
+++ b/test/bug/tint/942.wgsl
@@ -3,15 +3,15 @@
   blockDim : u32;
 };
 
-[[group(0), binding(0)]] var samp : sampler;
-[[group(0), binding(1)]] var<uniform> params : Params;
-[[group(1), binding(1)]] var inputTex : texture_2d<f32>;
-[[group(1), binding(2)]] var outputTex : texture_storage_2d<rgba8unorm, write>;
+@group(0) @binding(0) var samp : sampler;
+@group(0) @binding(1) var<uniform> params : Params;
+@group(1) @binding(1) var inputTex : texture_2d<f32>;
+@group(1) @binding(2) var outputTex : texture_storage_2d<rgba8unorm, write>;
 
  struct Flip {
   value : u32;
 };
-[[group(1), binding(3)]] var<uniform> flip : Flip;
+@group(1) @binding(3) var<uniform> flip : Flip;
 
 // This shader blurs the input texture in one direction, depending on whether
 // |flip.value| is 0 or 1.
@@ -29,10 +29,10 @@
 
 var<workgroup> tile : array<array<vec3<f32>, 256>, 4>;
 
-[[stage(compute), workgroup_size(64, 1, 1)]]
+@stage(compute) @workgroup_size(64, 1, 1)
 fn main(
-  [[builtin(workgroup_id)]] WorkGroupID : vec3<u32>,
-  [[builtin(local_invocation_id)]] LocalInvocationID : vec3<u32>
+  @builtin(workgroup_id) WorkGroupID : vec3<u32>,
+  @builtin(local_invocation_id) LocalInvocationID : vec3<u32>
 ) {
   let filterOffset : u32 = (params.filterDim - 1u) / 2u;
   let dims : vec2<i32> = textureDimensions(inputTex, 0);
diff --git a/test/bug/tint/942.wgsl.expected.wgsl b/test/bug/tint/942.wgsl.expected.wgsl
index 827326f..5fb7d1b 100644
--- a/test/bug/tint/942.wgsl.expected.wgsl
+++ b/test/bug/tint/942.wgsl.expected.wgsl
@@ -3,24 +3,24 @@
   blockDim : u32;
 }
 
-[[group(0), binding(0)]] var samp : sampler;
+@group(0) @binding(0) var samp : sampler;
 
-[[group(0), binding(1)]] var<uniform> params : Params;
+@group(0) @binding(1) var<uniform> params : Params;
 
-[[group(1), binding(1)]] var inputTex : texture_2d<f32>;
+@group(1) @binding(1) var inputTex : texture_2d<f32>;
 
-[[group(1), binding(2)]] var outputTex : texture_storage_2d<rgba8unorm, write>;
+@group(1) @binding(2) var outputTex : texture_storage_2d<rgba8unorm, write>;
 
 struct Flip {
   value : u32;
 }
 
-[[group(1), binding(3)]] var<uniform> flip : Flip;
+@group(1) @binding(3) var<uniform> flip : Flip;
 
 var<workgroup> tile : array<array<vec3<f32>, 256>, 4>;
 
-[[stage(compute), workgroup_size(64, 1, 1)]]
-fn main([[builtin(workgroup_id)]] WorkGroupID : vec3<u32>, [[builtin(local_invocation_id)]] LocalInvocationID : vec3<u32>) {
+@stage(compute) @workgroup_size(64, 1, 1)
+fn main(@builtin(workgroup_id) WorkGroupID : vec3<u32>, @builtin(local_invocation_id) LocalInvocationID : vec3<u32>) {
   let filterOffset : u32 = ((params.filterDim - 1u) / 2u);
   let dims : vec2<i32> = textureDimensions(inputTex, 0);
   let baseIndex = (vec2<i32>(((WorkGroupID.xy * vec2<u32>(params.blockDim, 4u)) + (LocalInvocationID.xy * vec2<u32>(4u, 1u)))) - vec2<i32>(i32(filterOffset), 0));
diff --git a/test/bug/tint/943.spvasm.expected.wgsl b/test/bug/tint/943.spvasm.expected.wgsl
index 04699dd..ea2d6ad 100644
--- a/test/bug/tint/943.spvasm.expected.wgsl
+++ b/test/bug/tint/943.spvasm.expected.wgsl
@@ -1,28 +1,28 @@
 struct Uniforms {
   NAN : f32;
-  [[size(12)]]
+  @size(12)
   padding : u32;
   aShape : vec3<i32>;
-  [[size(4)]]
+  @size(4)
   padding_1 : u32;
   bShape : vec3<i32>;
-  [[size(4)]]
+  @size(4)
   padding_2 : u32;
   outShape : vec3<i32>;
-  [[size(4)]]
+  @size(4)
   padding_3 : u32;
   outShapeStrides : vec2<i32>;
 }
 
-type RTArr = [[stride(4)]] array<f32>;
+type RTArr = @stride(4) array<f32>;
 
-type RTArr_1 = [[stride(4)]] array<f32>;
+type RTArr_1 = @stride(4) array<f32>;
 
 struct ssbOut {
   result : RTArr_1;
 }
 
-type RTArr_2 = [[stride(4)]] array<f32>;
+type RTArr_2 = @stride(4) array<f32>;
 
 struct ssbA {
   A : RTArr_1;
@@ -34,13 +34,13 @@
 
 var<private> dimAOuter_1 : i32;
 
-[[group(0), binding(3)]] var<uniform> x_48 : Uniforms;
+@group(0) @binding(3) var<uniform> x_48 : Uniforms;
 
 var<private> dimInner_1 : i32;
 
 var<private> dimBOuter_1 : i32;
 
-[[group(0), binding(0)]] var<storage, read_write> x_54 : ssbOut;
+@group(0) @binding(0) var<storage, read_write> x_54 : ssbOut;
 
 var<private> gl_LocalInvocationID : vec3<u32>;
 
@@ -50,11 +50,11 @@
 
 var<workgroup> mm_Bsub : array<array<f32, 1u>, 64u>;
 
-[[group(0), binding(1)]] var<storage, read> x_165 : ssbA;
+@group(0) @binding(1) var<storage, read> x_165 : ssbA;
 
 var<private> batch : i32;
 
-[[group(0), binding(2)]] var<storage, read> x_185 : ssbB;
+@group(0) @binding(2) var<storage, read> x_185 : ssbB;
 
 fn coordsInBounds_vi2_vi2_(coord : ptr<function, vec2<i32>>, shape : ptr<function, vec2<i32>>) -> bool {
   var x_87 : bool;
@@ -514,8 +514,8 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 64, 1)]]
-fn main([[builtin(local_invocation_id)]] gl_LocalInvocationID_param : vec3<u32>, [[builtin(global_invocation_id)]] gl_GlobalInvocationID_param : vec3<u32>) {
+@stage(compute) @workgroup_size(1, 64, 1)
+fn main(@builtin(local_invocation_id) gl_LocalInvocationID_param : vec3<u32>, @builtin(global_invocation_id) gl_GlobalInvocationID_param : vec3<u32>) {
   gl_LocalInvocationID = gl_LocalInvocationID_param;
   gl_GlobalInvocationID = gl_GlobalInvocationID_param;
   main_1();
diff --git a/test/bug/tint/948.wgsl b/test/bug/tint/948.wgsl
index 99056b4..e07fab9 100644
--- a/test/bug/tint/948.wgsl
+++ b/test/bug/tint/948.wgsl
@@ -1,6 +1,6 @@
 struct LeftOver {
   time : f32;
-  [[size(12)]]
+  @size(12)
   padding : u32;
   worldViewProjection : mat4x4<f32>;
   outputSize : vec2<f32>;
@@ -11,29 +11,29 @@
   colorMul : vec3<f32>;
 };
 
-[[group(2), binding(9)]] var<uniform> x_20 : LeftOver;
+@group(2) @binding(9) var<uniform> x_20 : LeftOver;
 
-[[group(2), binding(3)]] var frameMapTexture : texture_2d<f32>;
+@group(2) @binding(3) var frameMapTexture : texture_2d<f32>;
 
-[[group(2), binding(2)]] var frameMapSampler : sampler;
+@group(2) @binding(2) var frameMapSampler : sampler;
 
 var<private> tUV : vec2<f32>;
 
-[[group(2), binding(5)]] var tileMapsTexture0 : texture_2d<f32>;
+@group(2) @binding(5) var tileMapsTexture0 : texture_2d<f32>;
 
-[[group(2), binding(4)]] var tileMapsSampler : sampler;
+@group(2) @binding(4) var tileMapsSampler : sampler;
 
-[[group(2), binding(6)]] var tileMapsTexture1 : texture_2d<f32>;
+@group(2) @binding(6) var tileMapsTexture1 : texture_2d<f32>;
 
-[[group(2), binding(8)]] var animationMapTexture : texture_2d<f32>;
+@group(2) @binding(8) var animationMapTexture : texture_2d<f32>;
 
-[[group(2), binding(7)]] var animationMapSampler : sampler;
+@group(2) @binding(7) var animationMapSampler : sampler;
 
 var<private> mt : f32;
 
-[[group(2), binding(1)]] var spriteSheetTexture : texture_2d<f32>;
+@group(2) @binding(1) var spriteSheetTexture : texture_2d<f32>;
 
-[[group(2), binding(0)]] var spriteSheetSampler : sampler;
+@group(2) @binding(0) var spriteSheetSampler : sampler;
 
 var<private> glFragColor : vec4<f32>;
 
@@ -211,12 +211,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   glFragColor_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[location(2)]] tUV_param : vec2<f32>, [[location(5)]] tileID_1_param : vec2<f32>, [[location(4)]] levelUnits_param : vec2<f32>, [[location(3)]] stageUnits_1_param : vec2<f32>, [[location(0)]] vPosition_param : vec3<f32>, [[location(1)]] vUV_param : vec2<f32>) -> main_out {
+@stage(fragment)
+fn main(@location(2) tUV_param : vec2<f32>, @location(5) tileID_1_param : vec2<f32>, @location(4) levelUnits_param : vec2<f32>, @location(3) stageUnits_1_param : vec2<f32>, @location(0) vPosition_param : vec3<f32>, @location(1) vUV_param : vec2<f32>) -> main_out {
   tUV = tUV_param;
   tileID_1 = tileID_1_param;
   levelUnits = levelUnits_param;
@@ -225,4 +225,4 @@
   vUV = vUV_param;
   main_1();
   return main_out(glFragColor);
-}
\ No newline at end of file
+}
diff --git a/test/bug/tint/948.wgsl.expected.wgsl b/test/bug/tint/948.wgsl.expected.wgsl
index d6a66db..8a4fc7e 100644
--- a/test/bug/tint/948.wgsl.expected.wgsl
+++ b/test/bug/tint/948.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
 struct LeftOver {
   time : f32;
-  [[size(12)]]
+  @size(12)
   padding : u32;
   worldViewProjection : mat4x4<f32>;
   outputSize : vec2<f32>;
@@ -11,29 +11,29 @@
   colorMul : vec3<f32>;
 }
 
-[[group(2), binding(9)]] var<uniform> x_20 : LeftOver;
+@group(2) @binding(9) var<uniform> x_20 : LeftOver;
 
-[[group(2), binding(3)]] var frameMapTexture : texture_2d<f32>;
+@group(2) @binding(3) var frameMapTexture : texture_2d<f32>;
 
-[[group(2), binding(2)]] var frameMapSampler : sampler;
+@group(2) @binding(2) var frameMapSampler : sampler;
 
 var<private> tUV : vec2<f32>;
 
-[[group(2), binding(5)]] var tileMapsTexture0 : texture_2d<f32>;
+@group(2) @binding(5) var tileMapsTexture0 : texture_2d<f32>;
 
-[[group(2), binding(4)]] var tileMapsSampler : sampler;
+@group(2) @binding(4) var tileMapsSampler : sampler;
 
-[[group(2), binding(6)]] var tileMapsTexture1 : texture_2d<f32>;
+@group(2) @binding(6) var tileMapsTexture1 : texture_2d<f32>;
 
-[[group(2), binding(8)]] var animationMapTexture : texture_2d<f32>;
+@group(2) @binding(8) var animationMapTexture : texture_2d<f32>;
 
-[[group(2), binding(7)]] var animationMapSampler : sampler;
+@group(2) @binding(7) var animationMapSampler : sampler;
 
 var<private> mt : f32;
 
-[[group(2), binding(1)]] var spriteSheetTexture : texture_2d<f32>;
+@group(2) @binding(1) var spriteSheetTexture : texture_2d<f32>;
 
-[[group(2), binding(0)]] var spriteSheetSampler : sampler;
+@group(2) @binding(0) var spriteSheetSampler : sampler;
 
 var<private> glFragColor : vec4<f32>;
 
@@ -211,12 +211,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   glFragColor_1 : vec4<f32>;
 }
 
-[[stage(fragment)]]
-fn main([[location(2)]] tUV_param : vec2<f32>, [[location(5)]] tileID_1_param : vec2<f32>, [[location(4)]] levelUnits_param : vec2<f32>, [[location(3)]] stageUnits_1_param : vec2<f32>, [[location(0)]] vPosition_param : vec3<f32>, [[location(1)]] vUV_param : vec2<f32>) -> main_out {
+@stage(fragment)
+fn main(@location(2) tUV_param : vec2<f32>, @location(5) tileID_1_param : vec2<f32>, @location(4) levelUnits_param : vec2<f32>, @location(3) stageUnits_1_param : vec2<f32>, @location(0) vPosition_param : vec3<f32>, @location(1) vUV_param : vec2<f32>) -> main_out {
   tUV = tUV_param;
   tileID_1 = tileID_1_param;
   levelUnits = levelUnits_param;
diff --git a/test/bug/tint/949.wgsl b/test/bug/tint/949.wgsl
index 2d52b91..86ca7fc 100644
--- a/test/bug/tint/949.wgsl
+++ b/test/bug/tint/949.wgsl
@@ -8,12 +8,12 @@
   u_World : mat4x4<f32>;
   u_ViewProjection : mat4x4<f32>;
   u_bumpStrength : f32;
-  [[size(12)]]
+  @size(12)
   padding : u32;
   u_cameraPosition : vec3<f32>;
   u_parallaxScale : f32;
   textureInfoName : f32;
-  [[size(4)]]
+  @size(4)
   padding_1 : u32;
   tangentSpaceParameter0 : vec2<f32>;
 };
@@ -23,7 +23,7 @@
   vLightDiffuse : vec4<f32>;
   vLightSpecular : vec4<f32>;
   vLightGround : vec3<f32>;
-  [[size(4)]]
+  @size(4)
   padding_2 : u32;
   shadowsInfo : vec4<f32>;
   depthValues : vec2<f32>;
@@ -33,13 +33,13 @@
 
 var<private> u_Color : vec3<f32>;
 
-[[group(2), binding(1)]] var TextureSamplerTexture : texture_2d<f32>;
+@group(2) @binding(1) var TextureSamplerTexture : texture_2d<f32>;
 
-[[group(2), binding(0)]] var TextureSamplerSampler : sampler;
+@group(2) @binding(0) var TextureSamplerSampler : sampler;
 
 var<private> vMainuv : vec2<f32>;
 
-[[group(2), binding(6)]] var<uniform> x_269 : LeftOver;
+@group(2) @binding(6) var<uniform> x_269 : LeftOver;
 
 var<private> v_output1 : vec4<f32>;
 
@@ -49,17 +49,17 @@
 
 var<private> v_output2 : vec4<f32>;
 
-[[group(2), binding(3)]] var TextureSampler1Texture : texture_2d<f32>;
+@group(2) @binding(3) var TextureSampler1Texture : texture_2d<f32>;
 
-[[group(2), binding(2)]] var TextureSampler1Sampler : sampler;
+@group(2) @binding(2) var TextureSampler1Sampler : sampler;
 
-[[group(0), binding(5)]] var<uniform> light0 : Light0;
+@group(0) @binding(5) var<uniform> light0 : Light0;
 
 var<private> glFragColor : vec4<f32>;
 
-[[group(2), binding(4)]] var bumpSamplerSampler : sampler;
+@group(2) @binding(4) var bumpSamplerSampler : sampler;
 
-[[group(2), binding(5)]] var bumpSamplerTexture : texture_2d<f32>;
+@group(2) @binding(5) var bumpSamplerTexture : texture_2d<f32>;
 
 fn cotangent_frame_vf3_vf3_vf2_vf2_(normal_1 : ptr<function, vec3<f32>>, p : ptr<function, vec3<f32>>, uv : ptr<function, vec2<f32>>, tangentSpaceParams : ptr<function, vec2<f32>>) -> mat3x3<f32> {
   var dp1 : vec3<f32>;
@@ -437,12 +437,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   glFragColor_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[location(1)]] vMainuv_param : vec2<f32>, [[location(0)]] v_output1_param : vec4<f32>, [[builtin(front_facing)]] gl_FrontFacing_param : bool, [[location(3)]] v_uv_param : vec2<f32>, [[location(2)]] v_output2_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@location(1) vMainuv_param : vec2<f32>, @location(0) v_output1_param : vec4<f32>, @builtin(front_facing) gl_FrontFacing_param : bool, @location(3) v_uv_param : vec2<f32>, @location(2) v_output2_param : vec4<f32>) -> main_out {
   vMainuv = vMainuv_param;
   v_output1 = v_output1_param;
   gl_FrontFacing = gl_FrontFacing_param;
@@ -450,4 +450,4 @@
   v_output2 = v_output2_param;
   main_1();
   return main_out(glFragColor);
-}
\ No newline at end of file
+}
diff --git a/test/bug/tint/949.wgsl.expected.wgsl b/test/bug/tint/949.wgsl.expected.wgsl
index 8bbc807..e374119 100644
--- a/test/bug/tint/949.wgsl.expected.wgsl
+++ b/test/bug/tint/949.wgsl.expected.wgsl
@@ -7,12 +7,12 @@
   u_World : mat4x4<f32>;
   u_ViewProjection : mat4x4<f32>;
   u_bumpStrength : f32;
-  [[size(12)]]
+  @size(12)
   padding : u32;
   u_cameraPosition : vec3<f32>;
   u_parallaxScale : f32;
   textureInfoName : f32;
-  [[size(4)]]
+  @size(4)
   padding_1 : u32;
   tangentSpaceParameter0 : vec2<f32>;
 }
@@ -22,7 +22,7 @@
   vLightDiffuse : vec4<f32>;
   vLightSpecular : vec4<f32>;
   vLightGround : vec3<f32>;
-  [[size(4)]]
+  @size(4)
   padding_2 : u32;
   shadowsInfo : vec4<f32>;
   depthValues : vec2<f32>;
@@ -32,13 +32,13 @@
 
 var<private> u_Color : vec3<f32>;
 
-[[group(2), binding(1)]] var TextureSamplerTexture : texture_2d<f32>;
+@group(2) @binding(1) var TextureSamplerTexture : texture_2d<f32>;
 
-[[group(2), binding(0)]] var TextureSamplerSampler : sampler;
+@group(2) @binding(0) var TextureSamplerSampler : sampler;
 
 var<private> vMainuv : vec2<f32>;
 
-[[group(2), binding(6)]] var<uniform> x_269 : LeftOver;
+@group(2) @binding(6) var<uniform> x_269 : LeftOver;
 
 var<private> v_output1 : vec4<f32>;
 
@@ -48,17 +48,17 @@
 
 var<private> v_output2 : vec4<f32>;
 
-[[group(2), binding(3)]] var TextureSampler1Texture : texture_2d<f32>;
+@group(2) @binding(3) var TextureSampler1Texture : texture_2d<f32>;
 
-[[group(2), binding(2)]] var TextureSampler1Sampler : sampler;
+@group(2) @binding(2) var TextureSampler1Sampler : sampler;
 
-[[group(0), binding(5)]] var<uniform> light0 : Light0;
+@group(0) @binding(5) var<uniform> light0 : Light0;
 
 var<private> glFragColor : vec4<f32>;
 
-[[group(2), binding(4)]] var bumpSamplerSampler : sampler;
+@group(2) @binding(4) var bumpSamplerSampler : sampler;
 
-[[group(2), binding(5)]] var bumpSamplerTexture : texture_2d<f32>;
+@group(2) @binding(5) var bumpSamplerTexture : texture_2d<f32>;
 
 fn cotangent_frame_vf3_vf3_vf2_vf2_(normal_1 : ptr<function, vec3<f32>>, p : ptr<function, vec3<f32>>, uv : ptr<function, vec2<f32>>, tangentSpaceParams : ptr<function, vec2<f32>>) -> mat3x3<f32> {
   var dp1 : vec3<f32>;
@@ -436,12 +436,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   glFragColor_1 : vec4<f32>;
 }
 
-[[stage(fragment)]]
-fn main([[location(1)]] vMainuv_param : vec2<f32>, [[location(0)]] v_output1_param : vec4<f32>, [[builtin(front_facing)]] gl_FrontFacing_param : bool, [[location(3)]] v_uv_param : vec2<f32>, [[location(2)]] v_output2_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@location(1) vMainuv_param : vec2<f32>, @location(0) v_output1_param : vec4<f32>, @builtin(front_facing) gl_FrontFacing_param : bool, @location(3) v_uv_param : vec2<f32>, @location(2) v_output2_param : vec4<f32>) -> main_out {
   vMainuv = vMainuv_param;
   v_output1 = v_output1_param;
   gl_FrontFacing = gl_FrontFacing_param;
diff --git a/test/bug/tint/951.spvasm.expected.wgsl b/test/bug/tint/951.spvasm.expected.wgsl
index f80adea..63fd79e 100644
--- a/test/bug/tint/951.spvasm.expected.wgsl
+++ b/test/bug/tint/951.spvasm.expected.wgsl
@@ -1,6 +1,6 @@
-type RTArr = [[stride(4)]] array<f32>;
+type RTArr = @stride(4) array<f32>;
 
-type RTArr_1 = [[stride(4)]] array<f32>;
+type RTArr_1 = @stride(4) array<f32>;
 
 struct ssbOut {
   result : RTArr_1;
@@ -18,13 +18,13 @@
   size : i32;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> x_16 : ssbOut;
+@group(0) @binding(0) var<storage, read_write> x_16 : ssbOut;
 
-[[group(0), binding(1)]] var<storage, read> x_20 : ssbA;
+@group(0) @binding(1) var<storage, read> x_20 : ssbA;
 
 var<private> gl_GlobalInvocationID : vec3<u32>;
 
-[[group(0), binding(2)]] var<uniform> x_24 : Uniforms;
+@group(0) @binding(2) var<uniform> x_24 : Uniforms;
 
 fn getAAtOutCoords_() -> f32 {
   let x_42 : u32 = gl_GlobalInvocationID.x;
@@ -72,8 +72,8 @@
   return;
 }
 
-[[stage(compute), workgroup_size(128, 1, 1)]]
-fn main([[builtin(global_invocation_id)]] gl_GlobalInvocationID_param : vec3<u32>) {
+@stage(compute) @workgroup_size(128, 1, 1)
+fn main(@builtin(global_invocation_id) gl_GlobalInvocationID_param : vec3<u32>) {
   gl_GlobalInvocationID = gl_GlobalInvocationID_param;
   main_1();
 }
diff --git a/test/bug/tint/959.wgsl b/test/bug/tint/959.wgsl
index f8feea2..244775a 100644
--- a/test/bug/tint/959.wgsl
+++ b/test/bug/tint/959.wgsl
@@ -7,58 +7,58 @@
   a : f32;
 };
 
-[[group(0),  binding(0)]] var<storage> b0  : S;
-[[group(1),  binding(0)]] var<storage> b1  : S;
-[[group(2),  binding(0)]] var<storage> b2  : S;
-[[group(3),  binding(0)]] var<storage> b3  : S;
-[[group(4),  binding(0)]] var<storage> b4  : S;
-[[group(5),  binding(0)]] var<storage> b5  : S;
-[[group(6),  binding(0)]] var<storage> b6  : S;
-[[group(7),  binding(0)]] var<storage> b7  : S;
-[[group(9),  binding(1)]] var<uniform> b8  : S;
-[[group(8),  binding(1)]] var<uniform> b9  : S;
-[[group(10), binding(1)]] var<uniform> b10 : S;
-[[group(11), binding(1)]] var<uniform> b11 : S;
-[[group(12), binding(1)]] var<uniform> b12 : S;
-[[group(13), binding(1)]] var<uniform> b13 : S;
-[[group(14), binding(1)]] var<uniform> b14 : S;
-[[group(15), binding(1)]] var<uniform> b15 : S;
+@group(0)  @binding(0) var<storage> b0  : S;
+@group(1)  @binding(0) var<storage> b1  : S;
+@group(2)  @binding(0) var<storage> b2  : S;
+@group(3)  @binding(0) var<storage> b3  : S;
+@group(4)  @binding(0) var<storage> b4  : S;
+@group(5)  @binding(0) var<storage> b5  : S;
+@group(6)  @binding(0) var<storage> b6  : S;
+@group(7)  @binding(0) var<storage> b7  : S;
+@group(9)  @binding(1) var<uniform> b8  : S;
+@group(8)  @binding(1) var<uniform> b9  : S;
+@group(10) @binding(1) var<uniform> b10 : S;
+@group(11) @binding(1) var<uniform> b11 : S;
+@group(12) @binding(1) var<uniform> b12 : S;
+@group(13) @binding(1) var<uniform> b13 : S;
+@group(14) @binding(1) var<uniform> b14 : S;
+@group(15) @binding(1) var<uniform> b15 : S;
 
-[[group(0),  binding(1)]] var t0  : texture_2d<f32>;
-[[group(1),  binding(1)]] var t1  : texture_2d<f32>;
-[[group(2),  binding(1)]] var t2  : texture_2d<f32>;
-[[group(3),  binding(1)]] var t3  : texture_2d<f32>;
-[[group(4),  binding(1)]] var t4  : texture_2d<f32>;
-[[group(5),  binding(1)]] var t5  : texture_2d<f32>;
-[[group(6),  binding(1)]] var t6  : texture_2d<f32>;
-[[group(7),  binding(1)]] var t7  : texture_2d<f32>;
-[[group(8),  binding(200)]] var t8  : texture_depth_2d;
-[[group(9),  binding(200)]] var t9  : texture_depth_2d;
-[[group(10), binding(200)]] var t10 : texture_depth_2d;
-[[group(11), binding(200)]] var t11 : texture_depth_2d;
-[[group(12), binding(200)]] var t12 : texture_depth_2d;
-[[group(13), binding(200)]] var t13 : texture_depth_2d;
-[[group(14), binding(200)]] var t14 : texture_depth_2d;
-[[group(15), binding(200)]] var t15 : texture_depth_2d;
+@group(0)  @binding(1) var t0  : texture_2d<f32>;
+@group(1)  @binding(1) var t1  : texture_2d<f32>;
+@group(2)  @binding(1) var t2  : texture_2d<f32>;
+@group(3)  @binding(1) var t3  : texture_2d<f32>;
+@group(4)  @binding(1) var t4  : texture_2d<f32>;
+@group(5)  @binding(1) var t5  : texture_2d<f32>;
+@group(6)  @binding(1) var t6  : texture_2d<f32>;
+@group(7)  @binding(1) var t7  : texture_2d<f32>;
+@group(8)  @binding(200) var t8  : texture_depth_2d;
+@group(9)  @binding(200) var t9  : texture_depth_2d;
+@group(10) @binding(200) var t10 : texture_depth_2d;
+@group(11) @binding(200) var t11 : texture_depth_2d;
+@group(12) @binding(200) var t12 : texture_depth_2d;
+@group(13) @binding(200) var t13 : texture_depth_2d;
+@group(14) @binding(200) var t14 : texture_depth_2d;
+@group(15) @binding(200) var t15 : texture_depth_2d;
 
-[[group(0),  binding(200)]] var s0 : sampler;
-[[group(1),  binding(200)]] var s1 : sampler;
-[[group(2),  binding(200)]] var s2 : sampler;
-[[group(3),  binding(200)]] var s3 : sampler;
-[[group(4),  binding(200)]] var s4 : sampler;
-[[group(5),  binding(200)]] var s5 : sampler;
-[[group(6),  binding(200)]] var s6 : sampler;
-[[group(7),  binding(200)]] var s7 : sampler;
-[[group(8),  binding(300)]] var s8 : sampler_comparison;
-[[group(9),  binding(300)]] var s9 : sampler_comparison;
-[[group(10), binding(300)]] var s10 : sampler_comparison;
-[[group(11), binding(300)]] var s11 : sampler_comparison;
-[[group(12), binding(300)]] var s12 : sampler_comparison;
-[[group(13), binding(300)]] var s13 : sampler_comparison;
-[[group(14), binding(300)]] var s14 : sampler_comparison;
-[[group(15), binding(300)]] var s15 : sampler_comparison;
+@group(0)  @binding(200) var s0 : sampler;
+@group(1)  @binding(200) var s1 : sampler;
+@group(2)  @binding(200) var s2 : sampler;
+@group(3)  @binding(200) var s3 : sampler;
+@group(4)  @binding(200) var s4 : sampler;
+@group(5)  @binding(200) var s5 : sampler;
+@group(6)  @binding(200) var s6 : sampler;
+@group(7)  @binding(200) var s7 : sampler;
+@group(8)  @binding(300) var s8 : sampler_comparison;
+@group(9)  @binding(300) var s9 : sampler_comparison;
+@group(10) @binding(300) var s10 : sampler_comparison;
+@group(11) @binding(300) var s11 : sampler_comparison;
+@group(12) @binding(300) var s12 : sampler_comparison;
+@group(13) @binding(300) var s13 : sampler_comparison;
+@group(14) @binding(300) var s14 : sampler_comparison;
+@group(15) @binding(300) var s15 : sampler_comparison;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   _ = b0;
   _ = b1;
diff --git a/test/bug/tint/959.wgsl.expected.wgsl b/test/bug/tint/959.wgsl.expected.wgsl
index 4e4ecf0..7ccfbb9 100644
--- a/test/bug/tint/959.wgsl.expected.wgsl
+++ b/test/bug/tint/959.wgsl.expected.wgsl
@@ -2,103 +2,103 @@
   a : f32;
 }
 
-[[group(0), binding(0)]] var<storage> b0 : S;
+@group(0) @binding(0) var<storage> b0 : S;
 
-[[group(1), binding(0)]] var<storage> b1 : S;
+@group(1) @binding(0) var<storage> b1 : S;
 
-[[group(2), binding(0)]] var<storage> b2 : S;
+@group(2) @binding(0) var<storage> b2 : S;
 
-[[group(3), binding(0)]] var<storage> b3 : S;
+@group(3) @binding(0) var<storage> b3 : S;
 
-[[group(4), binding(0)]] var<storage> b4 : S;
+@group(4) @binding(0) var<storage> b4 : S;
 
-[[group(5), binding(0)]] var<storage> b5 : S;
+@group(5) @binding(0) var<storage> b5 : S;
 
-[[group(6), binding(0)]] var<storage> b6 : S;
+@group(6) @binding(0) var<storage> b6 : S;
 
-[[group(7), binding(0)]] var<storage> b7 : S;
+@group(7) @binding(0) var<storage> b7 : S;
 
-[[group(9), binding(1)]] var<uniform> b8 : S;
+@group(9) @binding(1) var<uniform> b8 : S;
 
-[[group(8), binding(1)]] var<uniform> b9 : S;
+@group(8) @binding(1) var<uniform> b9 : S;
 
-[[group(10), binding(1)]] var<uniform> b10 : S;
+@group(10) @binding(1) var<uniform> b10 : S;
 
-[[group(11), binding(1)]] var<uniform> b11 : S;
+@group(11) @binding(1) var<uniform> b11 : S;
 
-[[group(12), binding(1)]] var<uniform> b12 : S;
+@group(12) @binding(1) var<uniform> b12 : S;
 
-[[group(13), binding(1)]] var<uniform> b13 : S;
+@group(13) @binding(1) var<uniform> b13 : S;
 
-[[group(14), binding(1)]] var<uniform> b14 : S;
+@group(14) @binding(1) var<uniform> b14 : S;
 
-[[group(15), binding(1)]] var<uniform> b15 : S;
+@group(15) @binding(1) var<uniform> b15 : S;
 
-[[group(0), binding(1)]] var t0 : texture_2d<f32>;
+@group(0) @binding(1) var t0 : texture_2d<f32>;
 
-[[group(1), binding(1)]] var t1 : texture_2d<f32>;
+@group(1) @binding(1) var t1 : texture_2d<f32>;
 
-[[group(2), binding(1)]] var t2 : texture_2d<f32>;
+@group(2) @binding(1) var t2 : texture_2d<f32>;
 
-[[group(3), binding(1)]] var t3 : texture_2d<f32>;
+@group(3) @binding(1) var t3 : texture_2d<f32>;
 
-[[group(4), binding(1)]] var t4 : texture_2d<f32>;
+@group(4) @binding(1) var t4 : texture_2d<f32>;
 
-[[group(5), binding(1)]] var t5 : texture_2d<f32>;
+@group(5) @binding(1) var t5 : texture_2d<f32>;
 
-[[group(6), binding(1)]] var t6 : texture_2d<f32>;
+@group(6) @binding(1) var t6 : texture_2d<f32>;
 
-[[group(7), binding(1)]] var t7 : texture_2d<f32>;
+@group(7) @binding(1) var t7 : texture_2d<f32>;
 
-[[group(8), binding(200)]] var t8 : texture_depth_2d;
+@group(8) @binding(200) var t8 : texture_depth_2d;
 
-[[group(9), binding(200)]] var t9 : texture_depth_2d;
+@group(9) @binding(200) var t9 : texture_depth_2d;
 
-[[group(10), binding(200)]] var t10 : texture_depth_2d;
+@group(10) @binding(200) var t10 : texture_depth_2d;
 
-[[group(11), binding(200)]] var t11 : texture_depth_2d;
+@group(11) @binding(200) var t11 : texture_depth_2d;
 
-[[group(12), binding(200)]] var t12 : texture_depth_2d;
+@group(12) @binding(200) var t12 : texture_depth_2d;
 
-[[group(13), binding(200)]] var t13 : texture_depth_2d;
+@group(13) @binding(200) var t13 : texture_depth_2d;
 
-[[group(14), binding(200)]] var t14 : texture_depth_2d;
+@group(14) @binding(200) var t14 : texture_depth_2d;
 
-[[group(15), binding(200)]] var t15 : texture_depth_2d;
+@group(15) @binding(200) var t15 : texture_depth_2d;
 
-[[group(0), binding(200)]] var s0 : sampler;
+@group(0) @binding(200) var s0 : sampler;
 
-[[group(1), binding(200)]] var s1 : sampler;
+@group(1) @binding(200) var s1 : sampler;
 
-[[group(2), binding(200)]] var s2 : sampler;
+@group(2) @binding(200) var s2 : sampler;
 
-[[group(3), binding(200)]] var s3 : sampler;
+@group(3) @binding(200) var s3 : sampler;
 
-[[group(4), binding(200)]] var s4 : sampler;
+@group(4) @binding(200) var s4 : sampler;
 
-[[group(5), binding(200)]] var s5 : sampler;
+@group(5) @binding(200) var s5 : sampler;
 
-[[group(6), binding(200)]] var s6 : sampler;
+@group(6) @binding(200) var s6 : sampler;
 
-[[group(7), binding(200)]] var s7 : sampler;
+@group(7) @binding(200) var s7 : sampler;
 
-[[group(8), binding(300)]] var s8 : sampler_comparison;
+@group(8) @binding(300) var s8 : sampler_comparison;
 
-[[group(9), binding(300)]] var s9 : sampler_comparison;
+@group(9) @binding(300) var s9 : sampler_comparison;
 
-[[group(10), binding(300)]] var s10 : sampler_comparison;
+@group(10) @binding(300) var s10 : sampler_comparison;
 
-[[group(11), binding(300)]] var s11 : sampler_comparison;
+@group(11) @binding(300) var s11 : sampler_comparison;
 
-[[group(12), binding(300)]] var s12 : sampler_comparison;
+@group(12) @binding(300) var s12 : sampler_comparison;
 
-[[group(13), binding(300)]] var s13 : sampler_comparison;
+@group(13) @binding(300) var s13 : sampler_comparison;
 
-[[group(14), binding(300)]] var s14 : sampler_comparison;
+@group(14) @binding(300) var s14 : sampler_comparison;
 
-[[group(15), binding(300)]] var s15 : sampler_comparison;
+@group(15) @binding(300) var s15 : sampler_comparison;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   _ = b0;
   _ = b1;
diff --git a/test/bug/tint/977.spvasm.expected.wgsl b/test/bug/tint/977.spvasm.expected.wgsl
index 69bc7aa..8b5ad53 100644
--- a/test/bug/tint/977.spvasm.expected.wgsl
+++ b/test/bug/tint/977.spvasm.expected.wgsl
@@ -1,12 +1,12 @@
-type RTArr = [[stride(4)]] array<f32>;
+type RTArr = @stride(4) array<f32>;
 
-type RTArr_1 = [[stride(4)]] array<f32>;
+type RTArr_1 = @stride(4) array<f32>;
 
 struct ResultMatrix {
   numbers : RTArr_1;
 }
 
-type RTArr_2 = [[stride(4)]] array<f32>;
+type RTArr_2 = @stride(4) array<f32>;
 
 struct FirstMatrix {
   numbers : RTArr_1;
@@ -24,13 +24,13 @@
 
 var<private> gl_GlobalInvocationID : vec3<u32>;
 
-[[group(0), binding(2)]] var<storage, read_write> resultMatrix : ResultMatrix;
+@group(0) @binding(2) var<storage, read_write> resultMatrix : ResultMatrix;
 
-[[group(0), binding(0)]] var<storage, read> firstMatrix : FirstMatrix;
+@group(0) @binding(0) var<storage, read> firstMatrix : FirstMatrix;
 
-[[group(0), binding(1)]] var<storage, read> secondMatrix : SecondMatrix;
+@group(0) @binding(1) var<storage, read> secondMatrix : SecondMatrix;
 
-[[group(0), binding(3)]] var<uniform> x_46 : Uniforms;
+@group(0) @binding(3) var<uniform> x_46 : Uniforms;
 
 fn binaryOperation_f1_f1_(a : ptr<function, f32>, b : ptr<function, f32>) -> f32 {
   var x_26 : f32;
@@ -69,8 +69,8 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
-fn main([[builtin(global_invocation_id)]] gl_GlobalInvocationID_param : vec3<u32>) {
+@stage(compute) @workgroup_size(1, 1, 1)
+fn main(@builtin(global_invocation_id) gl_GlobalInvocationID_param : vec3<u32>) {
   gl_GlobalInvocationID = gl_GlobalInvocationID_param;
   main_1();
 }
diff --git a/test/bug/tint/978.wgsl b/test/bug/tint/978.wgsl
index 278655e..c4b25a1 100644
--- a/test/bug/tint/978.wgsl
+++ b/test/bug/tint/978.wgsl
@@ -1,20 +1,20 @@
 
 struct FragmentInput
 {
-	[[ location( 2 ) ]] vUv : vec2<f32>;
+	@location(2) vUv : vec2<f32>;
 };
 
 struct FragmentOutput
 {
-	[[ location( 0 ) ]] color : vec4<f32>;
+	@location(0) color : vec4<f32>;
 };
 
-[[ binding( 5 ), group( 1 ) ]] var depthMap : texture_depth_2d;
+@binding(5) @group(1) var depthMap : texture_depth_2d;
 
-[[ binding( 3 ), group( 1 ) ]] var texSampler : sampler;
+@binding(3) @group(1) var texSampler : sampler;
 
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main( fIn : FragmentInput ) -> FragmentOutput
 {
     let sample : f32 = textureSample( depthMap , texSampler, fIn.vUv );
diff --git a/test/bug/tint/978.wgsl.expected.wgsl b/test/bug/tint/978.wgsl.expected.wgsl
index b73a26e..8588fe7 100644
--- a/test/bug/tint/978.wgsl.expected.wgsl
+++ b/test/bug/tint/978.wgsl.expected.wgsl
@@ -1,18 +1,18 @@
 struct FragmentInput {
-  [[location(2)]]
+  @location(2)
   vUv : vec2<f32>;
 }
 
 struct FragmentOutput {
-  [[location(0)]]
+  @location(0)
   color : vec4<f32>;
 }
 
-[[binding(5), group(1)]] var depthMap : texture_depth_2d;
+@binding(5) @group(1) var depthMap : texture_depth_2d;
 
-[[binding(3), group(1)]] var texSampler : sampler;
+@binding(3) @group(1) var texSampler : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main(fIn : FragmentInput) -> FragmentOutput {
   let sample : f32 = textureSample(depthMap, texSampler, fIn.vUv);
   let color : vec3<f32> = vec3<f32>(sample, sample, sample);
diff --git a/test/bug/tint/980.wgsl b/test/bug/tint/980.wgsl
index bd82785..3f399b0 100644
--- a/test/bug/tint/980.wgsl
+++ b/test/bug/tint/980.wgsl
@@ -6,8 +6,8 @@
 }
 
  struct S { v : vec3<f32>; i : u32; };
-[[binding(0), group(0)]] var<storage, read_write> io : S;
-[[stage(compute), workgroup_size(1)]]
-fn main([[builtin(local_invocation_index)]] idx : u32) {
+@binding(0) @group(0) var<storage, read_write> io : S;
+@stage(compute) @workgroup_size(1)
+fn main(@builtin(local_invocation_index) idx : u32) {
     io.v = Bad(io.i, io.v);
 }
diff --git a/test/bug/tint/980.wgsl.expected.wgsl b/test/bug/tint/980.wgsl.expected.wgsl
index b74a7cb..ef89fd0 100644
--- a/test/bug/tint/980.wgsl.expected.wgsl
+++ b/test/bug/tint/980.wgsl.expected.wgsl
@@ -9,9 +9,9 @@
   i : u32;
 }
 
-[[binding(0), group(0)]] var<storage, read_write> io : S;
+@binding(0) @group(0) var<storage, read_write> io : S;
 
-[[stage(compute), workgroup_size(1)]]
-fn main([[builtin(local_invocation_index)]] idx : u32) {
+@stage(compute) @workgroup_size(1)
+fn main(@builtin(local_invocation_index) idx : u32) {
   io.v = Bad(io.i, io.v);
 }
diff --git a/test/bug/tint/992.wgsl b/test/bug/tint/992.wgsl
index e60c597..461e17c 100644
--- a/test/bug/tint/992.wgsl
+++ b/test/bug/tint/992.wgsl
@@ -1,5 +1,5 @@
-[[stage(fragment)]]
-fn frag_main() -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn frag_main() -> @location(0) vec4<f32> {
     var b: f32 = 0.0;
     var v: vec3<f32> = vec3<f32>(b);
     return vec4<f32>(v, 1.0);
diff --git a/test/bug/tint/992.wgsl.expected.wgsl b/test/bug/tint/992.wgsl.expected.wgsl
index 7354604..1742838 100644
--- a/test/bug/tint/992.wgsl.expected.wgsl
+++ b/test/bug/tint/992.wgsl.expected.wgsl
@@ -1,5 +1,5 @@
-[[stage(fragment)]]
-fn frag_main() -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn frag_main() -> @location(0) vec4<f32> {
   var b : f32 = 0.0;
   var v : vec3<f32> = vec3<f32>(b);
   return vec4<f32>(v, 1.0);
diff --git a/test/bug/tint/993.wgsl b/test/bug/tint/993.wgsl
index cf774f7..b5ebe30 100644
--- a/test/bug/tint/993.wgsl
+++ b/test/bug/tint/993.wgsl
@@ -2,23 +2,23 @@
  struct Constants {
   zero: u32;
 };
-[[group(1), binding(0)]] var<uniform> constants: Constants;
+@group(1) @binding(0) var<uniform> constants: Constants;
 
  struct Result {
   value: u32;
 };
-[[group(1), binding(1)]] var<storage, write> result: Result;
+@group(1) @binding(1) var<storage, write> result: Result;
 
  struct TestData {
   data: array<atomic<i32>,3>;
 };
-[[group(0), binding(0)]] var<storage, read_write> s: TestData;
+@group(0) @binding(0) var<storage, read_write> s: TestData;
 
 fn runTest() -> i32 {
   return atomicLoad(&s.data[(0u) + u32(constants.zero)]);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   result.value = u32(runTest());
-}
\ No newline at end of file
+}
diff --git a/test/bug/tint/993.wgsl.expected.wgsl b/test/bug/tint/993.wgsl.expected.wgsl
index 12eb2ae..5d0863d 100644
--- a/test/bug/tint/993.wgsl.expected.wgsl
+++ b/test/bug/tint/993.wgsl.expected.wgsl
@@ -2,25 +2,25 @@
   zero : u32;
 }
 
-[[group(1), binding(0)]] var<uniform> constants : Constants;
+@group(1) @binding(0) var<uniform> constants : Constants;
 
 struct Result {
   value : u32;
 }
 
-[[group(1), binding(1)]] var<storage, write> result : Result;
+@group(1) @binding(1) var<storage, write> result : Result;
 
 struct TestData {
   data : array<atomic<i32>, 3>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> s : TestData;
+@group(0) @binding(0) var<storage, read_write> s : TestData;
 
 fn runTest() -> i32 {
   return atomicLoad(&(s.data[(0u + u32(constants.zero))]));
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   result.value = u32(runTest());
 }
diff --git a/test/bug/tint/998.wgsl b/test/bug/tint/998.wgsl
index 39357d6..3186b30 100644
--- a/test/bug/tint/998.wgsl
+++ b/test/bug/tint/998.wgsl
@@ -1,19 +1,19 @@
  struct Constants {
   zero: u32;
 };
-[[group(1), binding(0)]] var<uniform> constants: Constants;
+@group(1) @binding(0) var<uniform> constants: Constants;
 
  struct Result {
   value: u32;
 };
-[[group(1), binding(1)]] var<storage, write> result: Result;
+@group(1) @binding(1) var<storage, write> result: Result;
 
 struct S {
   data: array<u32, 3>;
 };
 var<private> s: S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   s.data[constants.zero] = 0u;
-}
\ No newline at end of file
+}
diff --git a/test/bug/tint/998.wgsl.expected.wgsl b/test/bug/tint/998.wgsl.expected.wgsl
index e7abd6d..35ed13f 100644
--- a/test/bug/tint/998.wgsl.expected.wgsl
+++ b/test/bug/tint/998.wgsl.expected.wgsl
@@ -2,13 +2,13 @@
   zero : u32;
 }
 
-[[group(1), binding(0)]] var<uniform> constants : Constants;
+@group(1) @binding(0) var<uniform> constants : Constants;
 
 struct Result {
   value : u32;
 }
 
-[[group(1), binding(1)]] var<storage, write> result : Result;
+@group(1) @binding(1) var<storage, write> result : Result;
 
 struct S {
   data : array<u32, 3>;
@@ -16,7 +16,7 @@
 
 var<private> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   s.data[constants.zero] = 0u;
 }
diff --git a/test/expressions/binary/add/mat3x3-mat3x3/f32.wgsl b/test/expressions/binary/add/mat3x3-mat3x3/f32.wgsl
index 403b87f..eac9ef6 100644
--- a/test/expressions/binary/add/mat3x3-mat3x3/f32.wgsl
+++ b/test/expressions/binary/add/mat3x3-mat3x3/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = mat3x3<f32>(vec3<f32>( 1.,  2.,  3.), vec3<f32>( 4.,  5.,  6.), vec3<f32>( 7.,  8.,  9.));
     let b = mat3x3<f32>(vec3<f32>(-1., -2., -3.), vec3<f32>(-4., -5., -6.), vec3<f32>(-7., -8., -9.));
diff --git a/test/expressions/binary/add/mat3x3-mat3x3/f32.wgsl.expected.wgsl b/test/expressions/binary/add/mat3x3-mat3x3/f32.wgsl.expected.wgsl
index 9113851..2dfb7c8 100644
--- a/test/expressions/binary/add/mat3x3-mat3x3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/add/mat3x3-mat3x3/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = mat3x3<f32>(vec3<f32>(1.0, 2.0, 3.0), vec3<f32>(4.0, 5.0, 6.0), vec3<f32>(7.0, 8.0, 9.0));
   let b = mat3x3<f32>(vec3<f32>(-1.0, -2.0, -3.0), vec3<f32>(-4.0, -5.0, -6.0), vec3<f32>(-7.0, -8.0, -9.0));
diff --git a/test/expressions/binary/add/scalar-scalar/f32.wgsl b/test/expressions/binary/add/scalar-scalar/f32.wgsl
index 25bf677..6dcc653 100644
--- a/test/expressions/binary/add/scalar-scalar/f32.wgsl
+++ b/test/expressions/binary/add/scalar-scalar/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1.;
     let b = 2.;
diff --git a/test/expressions/binary/add/scalar-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/add/scalar-scalar/f32.wgsl.expected.wgsl
index 3db4790..0997a1a 100644
--- a/test/expressions/binary/add/scalar-scalar/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/add/scalar-scalar/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1.0;
   let b = 2.0;
diff --git a/test/expressions/binary/add/scalar-scalar/i32.wgsl b/test/expressions/binary/add/scalar-scalar/i32.wgsl
index bb39f2e..93e8a35 100644
--- a/test/expressions/binary/add/scalar-scalar/i32.wgsl
+++ b/test/expressions/binary/add/scalar-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1;
     let b = 2;
diff --git a/test/expressions/binary/add/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/add/scalar-scalar/i32.wgsl.expected.wgsl
index 7022af1..46fe066 100644
--- a/test/expressions/binary/add/scalar-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/add/scalar-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1;
   let b = 2;
diff --git a/test/expressions/binary/add/scalar-scalar/u32.wgsl b/test/expressions/binary/add/scalar-scalar/u32.wgsl
index 9f5be35..cf3c56d 100644
--- a/test/expressions/binary/add/scalar-scalar/u32.wgsl
+++ b/test/expressions/binary/add/scalar-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1u;
     let b = 2u;
diff --git a/test/expressions/binary/add/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/add/scalar-scalar/u32.wgsl.expected.wgsl
index fc83a3e..c052925 100644
--- a/test/expressions/binary/add/scalar-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/add/scalar-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1u;
   let b = 2u;
diff --git a/test/expressions/binary/add/scalar-vec3/f32.wgsl b/test/expressions/binary/add/scalar-vec3/f32.wgsl
index 8adb291..8467ba6 100644
--- a/test/expressions/binary/add/scalar-vec3/f32.wgsl
+++ b/test/expressions/binary/add/scalar-vec3/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 4.;
     let b = vec3<f32>(1., 2., 3.);
diff --git a/test/expressions/binary/add/scalar-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/add/scalar-vec3/f32.wgsl.expected.wgsl
index f113f0e..95a584b 100644
--- a/test/expressions/binary/add/scalar-vec3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/add/scalar-vec3/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 4.0;
   let b = vec3<f32>(1.0, 2.0, 3.0);
diff --git a/test/expressions/binary/add/scalar-vec3/i32.wgsl b/test/expressions/binary/add/scalar-vec3/i32.wgsl
index 327473e..a61cd74 100644
--- a/test/expressions/binary/add/scalar-vec3/i32.wgsl
+++ b/test/expressions/binary/add/scalar-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 4;
     let b = vec3<i32>(1, 2, 3);
diff --git a/test/expressions/binary/add/scalar-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/add/scalar-vec3/i32.wgsl.expected.wgsl
index 6123ca1..c1193c6 100644
--- a/test/expressions/binary/add/scalar-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/add/scalar-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 4;
   let b = vec3<i32>(1, 2, 3);
diff --git a/test/expressions/binary/add/scalar-vec3/u32.wgsl b/test/expressions/binary/add/scalar-vec3/u32.wgsl
index e36d881..0fb18d4 100644
--- a/test/expressions/binary/add/scalar-vec3/u32.wgsl
+++ b/test/expressions/binary/add/scalar-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 4u;
     let b = vec3<u32>(1u, 2u, 3u);
diff --git a/test/expressions/binary/add/scalar-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/add/scalar-vec3/u32.wgsl.expected.wgsl
index 457841e..2ec0595 100644
--- a/test/expressions/binary/add/scalar-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/add/scalar-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 4u;
   let b = vec3<u32>(1u, 2u, 3u);
diff --git a/test/expressions/binary/add/vec3-scalar/f32.wgsl b/test/expressions/binary/add/vec3-scalar/f32.wgsl
index dd38642..38320af 100644
--- a/test/expressions/binary/add/vec3-scalar/f32.wgsl
+++ b/test/expressions/binary/add/vec3-scalar/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<f32>(1., 2., 3.);
     let b = 4.;
diff --git a/test/expressions/binary/add/vec3-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/add/vec3-scalar/f32.wgsl.expected.wgsl
index 62aa160..86904e5 100644
--- a/test/expressions/binary/add/vec3-scalar/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/add/vec3-scalar/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<f32>(1.0, 2.0, 3.0);
   let b = 4.0;
diff --git a/test/expressions/binary/add/vec3-scalar/i32.wgsl b/test/expressions/binary/add/vec3-scalar/i32.wgsl
index 1e4324a..eacbc3b 100644
--- a/test/expressions/binary/add/vec3-scalar/i32.wgsl
+++ b/test/expressions/binary/add/vec3-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<i32>(1, 2, 3);
     let b = 4;
diff --git a/test/expressions/binary/add/vec3-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/add/vec3-scalar/i32.wgsl.expected.wgsl
index 378b1d2..e4775e1 100644
--- a/test/expressions/binary/add/vec3-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/add/vec3-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<i32>(1, 2, 3);
   let b = 4;
diff --git a/test/expressions/binary/add/vec3-scalar/u32.wgsl b/test/expressions/binary/add/vec3-scalar/u32.wgsl
index cfff6f1..50ceead 100644
--- a/test/expressions/binary/add/vec3-scalar/u32.wgsl
+++ b/test/expressions/binary/add/vec3-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<u32>(1u, 2u, 3u);
     let b = 4u;
diff --git a/test/expressions/binary/add/vec3-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/add/vec3-scalar/u32.wgsl.expected.wgsl
index df0f990..8f0116a 100644
--- a/test/expressions/binary/add/vec3-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/add/vec3-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<u32>(1u, 2u, 3u);
   let b = 4u;
diff --git a/test/expressions/binary/add/vec3-vec3/f32.wgsl b/test/expressions/binary/add/vec3-vec3/f32.wgsl
index 4f71797..5658e4e 100644
--- a/test/expressions/binary/add/vec3-vec3/f32.wgsl
+++ b/test/expressions/binary/add/vec3-vec3/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<f32>(1., 2., 3.);
     let b = vec3<f32>(4., 5., 6.);
diff --git a/test/expressions/binary/add/vec3-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/add/vec3-vec3/f32.wgsl.expected.wgsl
index 54d52b1..b18ded4 100644
--- a/test/expressions/binary/add/vec3-vec3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/add/vec3-vec3/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<f32>(1.0, 2.0, 3.0);
   let b = vec3<f32>(4.0, 5.0, 6.0);
diff --git a/test/expressions/binary/add/vec3-vec3/i32.wgsl b/test/expressions/binary/add/vec3-vec3/i32.wgsl
index dd170f5..98ca5c2 100644
--- a/test/expressions/binary/add/vec3-vec3/i32.wgsl
+++ b/test/expressions/binary/add/vec3-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<i32>(1, 2, 3);
     let b = vec3<i32>(4, 5, 6);
diff --git a/test/expressions/binary/add/vec3-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/add/vec3-vec3/i32.wgsl.expected.wgsl
index 5f1226d..58712ea 100644
--- a/test/expressions/binary/add/vec3-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/add/vec3-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<i32>(1, 2, 3);
   let b = vec3<i32>(4, 5, 6);
diff --git a/test/expressions/binary/add/vec3-vec3/u32.wgsl b/test/expressions/binary/add/vec3-vec3/u32.wgsl
index 433e52d..f6d72ce 100644
--- a/test/expressions/binary/add/vec3-vec3/u32.wgsl
+++ b/test/expressions/binary/add/vec3-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<u32>(1u, 2u, 3u);
     let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/binary/add/vec3-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/add/vec3-vec3/u32.wgsl.expected.wgsl
index 85dad76..db61dda 100644
--- a/test/expressions/binary/add/vec3-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/add/vec3-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<u32>(1u, 2u, 3u);
   let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/binary/bit-and/scalar-scalar/i32.wgsl b/test/expressions/binary/bit-and/scalar-scalar/i32.wgsl
index 9ad0a83..e4d1a86 100644
--- a/test/expressions/binary/bit-and/scalar-scalar/i32.wgsl
+++ b/test/expressions/binary/bit-and/scalar-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1;
     let b = 2;
diff --git a/test/expressions/binary/bit-and/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/bit-and/scalar-scalar/i32.wgsl.expected.wgsl
index ce96c2d..24bab02 100644
--- a/test/expressions/binary/bit-and/scalar-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/bit-and/scalar-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1;
   let b = 2;
diff --git a/test/expressions/binary/bit-and/scalar-scalar/u32.wgsl b/test/expressions/binary/bit-and/scalar-scalar/u32.wgsl
index ee0fb0a..c297f9d 100644
--- a/test/expressions/binary/bit-and/scalar-scalar/u32.wgsl
+++ b/test/expressions/binary/bit-and/scalar-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1u;
     let b = 2u;
diff --git a/test/expressions/binary/bit-and/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/bit-and/scalar-scalar/u32.wgsl.expected.wgsl
index e5c60f1..a158e4c 100644
--- a/test/expressions/binary/bit-and/scalar-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/bit-and/scalar-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1u;
   let b = 2u;
diff --git a/test/expressions/binary/bit-and/vec3-vec3/i32.wgsl b/test/expressions/binary/bit-and/vec3-vec3/i32.wgsl
index 5dc71ef..c2be41d 100644
--- a/test/expressions/binary/bit-and/vec3-vec3/i32.wgsl
+++ b/test/expressions/binary/bit-and/vec3-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<i32>(1, 2, 3);
     let b = vec3<i32>(4, 5, 6);
diff --git a/test/expressions/binary/bit-and/vec3-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/bit-and/vec3-vec3/i32.wgsl.expected.wgsl
index a30b1f5..334474a 100644
--- a/test/expressions/binary/bit-and/vec3-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/bit-and/vec3-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<i32>(1, 2, 3);
   let b = vec3<i32>(4, 5, 6);
diff --git a/test/expressions/binary/bit-and/vec3-vec3/u32.wgsl b/test/expressions/binary/bit-and/vec3-vec3/u32.wgsl
index c520bc3..8383a86 100644
--- a/test/expressions/binary/bit-and/vec3-vec3/u32.wgsl
+++ b/test/expressions/binary/bit-and/vec3-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<u32>(1u, 2u, 3u);
     let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/binary/bit-and/vec3-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/bit-and/vec3-vec3/u32.wgsl.expected.wgsl
index b9c2d80..7a95503 100644
--- a/test/expressions/binary/bit-and/vec3-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/bit-and/vec3-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<u32>(1u, 2u, 3u);
   let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/binary/bit-or/scalar-scalar/i32.wgsl b/test/expressions/binary/bit-or/scalar-scalar/i32.wgsl
index 9e2d99c..e0c227d 100644
--- a/test/expressions/binary/bit-or/scalar-scalar/i32.wgsl
+++ b/test/expressions/binary/bit-or/scalar-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1;
     let b = 2;
diff --git a/test/expressions/binary/bit-or/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/bit-or/scalar-scalar/i32.wgsl.expected.wgsl
index 3a13163..65617cb 100644
--- a/test/expressions/binary/bit-or/scalar-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/bit-or/scalar-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1;
   let b = 2;
diff --git a/test/expressions/binary/bit-or/scalar-scalar/u32.wgsl b/test/expressions/binary/bit-or/scalar-scalar/u32.wgsl
index edf8a70..c8d4257 100644
--- a/test/expressions/binary/bit-or/scalar-scalar/u32.wgsl
+++ b/test/expressions/binary/bit-or/scalar-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1u;
     let b = 2u;
diff --git a/test/expressions/binary/bit-or/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/bit-or/scalar-scalar/u32.wgsl.expected.wgsl
index 231ecb5..3c9bed3 100644
--- a/test/expressions/binary/bit-or/scalar-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/bit-or/scalar-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1u;
   let b = 2u;
diff --git a/test/expressions/binary/bit-or/vec3-vec3/i32.wgsl b/test/expressions/binary/bit-or/vec3-vec3/i32.wgsl
index dc5ed1c..d5f6036 100644
--- a/test/expressions/binary/bit-or/vec3-vec3/i32.wgsl
+++ b/test/expressions/binary/bit-or/vec3-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<i32>(1, 2, 3);
     let b = vec3<i32>(4, 5, 6);
diff --git a/test/expressions/binary/bit-or/vec3-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/bit-or/vec3-vec3/i32.wgsl.expected.wgsl
index 8941e04..ffc87a0 100644
--- a/test/expressions/binary/bit-or/vec3-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/bit-or/vec3-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<i32>(1, 2, 3);
   let b = vec3<i32>(4, 5, 6);
diff --git a/test/expressions/binary/bit-or/vec3-vec3/u32.wgsl b/test/expressions/binary/bit-or/vec3-vec3/u32.wgsl
index e1adda8..cac160f 100644
--- a/test/expressions/binary/bit-or/vec3-vec3/u32.wgsl
+++ b/test/expressions/binary/bit-or/vec3-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<u32>(1u, 2u, 3u);
     let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/binary/bit-or/vec3-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/bit-or/vec3-vec3/u32.wgsl.expected.wgsl
index 800d5d0..580a328 100644
--- a/test/expressions/binary/bit-or/vec3-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/bit-or/vec3-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<u32>(1u, 2u, 3u);
   let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/binary/bit-xor/scalar-scalar/i32.wgsl b/test/expressions/binary/bit-xor/scalar-scalar/i32.wgsl
index c0112a3..9844c80 100644
--- a/test/expressions/binary/bit-xor/scalar-scalar/i32.wgsl
+++ b/test/expressions/binary/bit-xor/scalar-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1;
     let b = 2;
diff --git a/test/expressions/binary/bit-xor/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/bit-xor/scalar-scalar/i32.wgsl.expected.wgsl
index 860a11d..dc73ec6 100644
--- a/test/expressions/binary/bit-xor/scalar-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/bit-xor/scalar-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1;
   let b = 2;
diff --git a/test/expressions/binary/bit-xor/scalar-scalar/u32.wgsl b/test/expressions/binary/bit-xor/scalar-scalar/u32.wgsl
index 32d3b95..f0f7a54 100644
--- a/test/expressions/binary/bit-xor/scalar-scalar/u32.wgsl
+++ b/test/expressions/binary/bit-xor/scalar-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1u;
     let b = 2u;
diff --git a/test/expressions/binary/bit-xor/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/bit-xor/scalar-scalar/u32.wgsl.expected.wgsl
index 26dda45..930b21f 100644
--- a/test/expressions/binary/bit-xor/scalar-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/bit-xor/scalar-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1u;
   let b = 2u;
diff --git a/test/expressions/binary/bit-xor/vec3-vec3/i32.wgsl b/test/expressions/binary/bit-xor/vec3-vec3/i32.wgsl
index c4972f7..0a5f1c2 100644
--- a/test/expressions/binary/bit-xor/vec3-vec3/i32.wgsl
+++ b/test/expressions/binary/bit-xor/vec3-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<i32>(1, 2, 3);
     let b = vec3<i32>(4, 5, 6);
diff --git a/test/expressions/binary/bit-xor/vec3-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/bit-xor/vec3-vec3/i32.wgsl.expected.wgsl
index 2811f15..de62f80 100644
--- a/test/expressions/binary/bit-xor/vec3-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/bit-xor/vec3-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<i32>(1, 2, 3);
   let b = vec3<i32>(4, 5, 6);
diff --git a/test/expressions/binary/bit-xor/vec3-vec3/u32.wgsl b/test/expressions/binary/bit-xor/vec3-vec3/u32.wgsl
index 2e62570..ce705f6 100644
--- a/test/expressions/binary/bit-xor/vec3-vec3/u32.wgsl
+++ b/test/expressions/binary/bit-xor/vec3-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<u32>(1u, 2u, 3u);
     let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/binary/bit-xor/vec3-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/bit-xor/vec3-vec3/u32.wgsl.expected.wgsl
index 4ba52c5..044e138 100644
--- a/test/expressions/binary/bit-xor/vec3-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/bit-xor/vec3-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<u32>(1u, 2u, 3u);
   let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/binary/div/scalar-scalar/f32.wgsl b/test/expressions/binary/div/scalar-scalar/f32.wgsl
index 50cabd0..025664d 100644
--- a/test/expressions/binary/div/scalar-scalar/f32.wgsl
+++ b/test/expressions/binary/div/scalar-scalar/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1.;
     let b = 2.;
diff --git a/test/expressions/binary/div/scalar-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/div/scalar-scalar/f32.wgsl.expected.wgsl
index 5bc760d..4f2fc18 100644
--- a/test/expressions/binary/div/scalar-scalar/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div/scalar-scalar/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1.0;
   let b = 2.0;
diff --git a/test/expressions/binary/div/scalar-scalar/i32.wgsl b/test/expressions/binary/div/scalar-scalar/i32.wgsl
index 1192d80..cba5901 100644
--- a/test/expressions/binary/div/scalar-scalar/i32.wgsl
+++ b/test/expressions/binary/div/scalar-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1;
     let b = 2;
diff --git a/test/expressions/binary/div/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/div/scalar-scalar/i32.wgsl.expected.wgsl
index 6ecb865..8f7e574 100644
--- a/test/expressions/binary/div/scalar-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div/scalar-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1;
   let b = 2;
diff --git a/test/expressions/binary/div/scalar-scalar/u32.wgsl b/test/expressions/binary/div/scalar-scalar/u32.wgsl
index 6e18ad7..441f376 100644
--- a/test/expressions/binary/div/scalar-scalar/u32.wgsl
+++ b/test/expressions/binary/div/scalar-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1u;
     let b = 2u;
diff --git a/test/expressions/binary/div/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/div/scalar-scalar/u32.wgsl.expected.wgsl
index b5d2f7e..cff0385 100644
--- a/test/expressions/binary/div/scalar-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div/scalar-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1u;
   let b = 2u;
diff --git a/test/expressions/binary/div/scalar-vec3/f32.wgsl b/test/expressions/binary/div/scalar-vec3/f32.wgsl
index a9cab92..f43e97c 100644
--- a/test/expressions/binary/div/scalar-vec3/f32.wgsl
+++ b/test/expressions/binary/div/scalar-vec3/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 4.;
     let b = vec3<f32>(1., 2., 3.);
diff --git a/test/expressions/binary/div/scalar-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/div/scalar-vec3/f32.wgsl.expected.wgsl
index bd9de59..b8f74f4 100644
--- a/test/expressions/binary/div/scalar-vec3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div/scalar-vec3/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 4.0;
   let b = vec3<f32>(1.0, 2.0, 3.0);
diff --git a/test/expressions/binary/div/scalar-vec3/i32.wgsl b/test/expressions/binary/div/scalar-vec3/i32.wgsl
index ae9daea..071efcf 100644
--- a/test/expressions/binary/div/scalar-vec3/i32.wgsl
+++ b/test/expressions/binary/div/scalar-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 4;
     let b = vec3<i32>(1, 2, 3);
diff --git a/test/expressions/binary/div/scalar-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/div/scalar-vec3/i32.wgsl.expected.wgsl
index 6d7e7a4..1a8cb05 100644
--- a/test/expressions/binary/div/scalar-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div/scalar-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 4;
   let b = vec3<i32>(1, 2, 3);
diff --git a/test/expressions/binary/div/scalar-vec3/u32.wgsl b/test/expressions/binary/div/scalar-vec3/u32.wgsl
index 0923fb2..5ad53ee 100644
--- a/test/expressions/binary/div/scalar-vec3/u32.wgsl
+++ b/test/expressions/binary/div/scalar-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 4u;
     let b = vec3<u32>(1u, 2u, 3u);
diff --git a/test/expressions/binary/div/scalar-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/div/scalar-vec3/u32.wgsl.expected.wgsl
index 5c678e8..ffe6412 100644
--- a/test/expressions/binary/div/scalar-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div/scalar-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 4u;
   let b = vec3<u32>(1u, 2u, 3u);
diff --git a/test/expressions/binary/div/vec3-scalar/f32.wgsl b/test/expressions/binary/div/vec3-scalar/f32.wgsl
index 247abdf..087c0d3 100644
--- a/test/expressions/binary/div/vec3-scalar/f32.wgsl
+++ b/test/expressions/binary/div/vec3-scalar/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<f32>(1., 2., 3.);
     let b = 4.;
diff --git a/test/expressions/binary/div/vec3-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/div/vec3-scalar/f32.wgsl.expected.wgsl
index df8a3df..70432db 100644
--- a/test/expressions/binary/div/vec3-scalar/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div/vec3-scalar/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<f32>(1.0, 2.0, 3.0);
   let b = 4.0;
diff --git a/test/expressions/binary/div/vec3-scalar/i32.wgsl b/test/expressions/binary/div/vec3-scalar/i32.wgsl
index 7e730df..890b125 100644
--- a/test/expressions/binary/div/vec3-scalar/i32.wgsl
+++ b/test/expressions/binary/div/vec3-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<i32>(1, 2, 3);
     let b = 4;
diff --git a/test/expressions/binary/div/vec3-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/div/vec3-scalar/i32.wgsl.expected.wgsl
index fa76ca6..f3a1164 100644
--- a/test/expressions/binary/div/vec3-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div/vec3-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<i32>(1, 2, 3);
   let b = 4;
diff --git a/test/expressions/binary/div/vec3-scalar/u32.wgsl b/test/expressions/binary/div/vec3-scalar/u32.wgsl
index 5eadf33..7ab6dd5 100644
--- a/test/expressions/binary/div/vec3-scalar/u32.wgsl
+++ b/test/expressions/binary/div/vec3-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<u32>(1u, 2u, 3u);
     let b = 4u;
diff --git a/test/expressions/binary/div/vec3-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/div/vec3-scalar/u32.wgsl.expected.wgsl
index 8e60c28..2f64dd9 100644
--- a/test/expressions/binary/div/vec3-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div/vec3-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<u32>(1u, 2u, 3u);
   let b = 4u;
diff --git a/test/expressions/binary/div/vec3-vec3/f32.wgsl b/test/expressions/binary/div/vec3-vec3/f32.wgsl
index f779554..1f253ea 100644
--- a/test/expressions/binary/div/vec3-vec3/f32.wgsl
+++ b/test/expressions/binary/div/vec3-vec3/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<f32>(1., 2., 3.);
     let b = vec3<f32>(4., 5., 6.);
diff --git a/test/expressions/binary/div/vec3-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/div/vec3-vec3/f32.wgsl.expected.wgsl
index e824aa5..c3129a9 100644
--- a/test/expressions/binary/div/vec3-vec3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div/vec3-vec3/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<f32>(1.0, 2.0, 3.0);
   let b = vec3<f32>(4.0, 5.0, 6.0);
diff --git a/test/expressions/binary/div/vec3-vec3/i32.wgsl b/test/expressions/binary/div/vec3-vec3/i32.wgsl
index 40e6d7a..68d844f 100644
--- a/test/expressions/binary/div/vec3-vec3/i32.wgsl
+++ b/test/expressions/binary/div/vec3-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<i32>(1, 2, 3);
     let b = vec3<i32>(4, 5, 6);
diff --git a/test/expressions/binary/div/vec3-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/div/vec3-vec3/i32.wgsl.expected.wgsl
index 940e6d9..a601fa0 100644
--- a/test/expressions/binary/div/vec3-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div/vec3-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<i32>(1, 2, 3);
   let b = vec3<i32>(4, 5, 6);
diff --git a/test/expressions/binary/div/vec3-vec3/u32.wgsl b/test/expressions/binary/div/vec3-vec3/u32.wgsl
index 39fdc1d..9215590 100644
--- a/test/expressions/binary/div/vec3-vec3/u32.wgsl
+++ b/test/expressions/binary/div/vec3-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<u32>(1u, 2u, 3u);
     let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/binary/div/vec3-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/div/vec3-vec3/u32.wgsl.expected.wgsl
index cbf76b7..66261d5 100644
--- a/test/expressions/binary/div/vec3-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div/vec3-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<u32>(1u, 2u, 3u);
   let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/f32.wgsl b/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/f32.wgsl
index 7ce4276..9503e44 100644
--- a/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/f32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1.;
     let b = 0.;
diff --git a/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/f32.wgsl.expected.wgsl
index da2c352..8036fce 100644
--- a/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1.0;
   let b = 0.0;
diff --git a/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/i32.wgsl b/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/i32.wgsl
index 7c980aa..73f03b7 100644
--- a/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/i32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1;
     let b = 0;
diff --git a/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/i32.wgsl.expected.wgsl
index 63bdb5a..5284d7d 100644
--- a/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1;
   let b = 0;
diff --git a/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/u32.wgsl b/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/u32.wgsl
index e31e484..38b3d24 100644
--- a/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/u32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1u;
     let b = 0u;
diff --git a/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/u32.wgsl.expected.wgsl
index 3b06f40..8c8f7ae 100644
--- a/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/scalar-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1u;
   let b = 0u;
diff --git a/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/f32.wgsl b/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/f32.wgsl
index 83e438c..0db5465 100644
--- a/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/f32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 4.;
     let b = vec3<f32>(0., 2., 0.);
diff --git a/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/f32.wgsl.expected.wgsl
index 040875e..24d6132 100644
--- a/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 4.0;
   let b = vec3<f32>(0.0, 2.0, 0.0);
diff --git a/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/i32.wgsl b/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/i32.wgsl
index b981e35..2b6ef48 100644
--- a/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/i32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 4;
     let b = vec3<i32>(0, 2, 0);
diff --git a/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/i32.wgsl.expected.wgsl
index 34804c3..58c1887 100644
--- a/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 4;
   let b = vec3<i32>(0, 2, 0);
diff --git a/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/u32.wgsl b/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/u32.wgsl
index ae85d37..a0a8fe6 100644
--- a/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/u32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 4u;
     let b = vec3<u32>(0u, 2u, 0u);
diff --git a/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/u32.wgsl.expected.wgsl
index a20cb6a..bb436e1 100644
--- a/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/scalar-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 4u;
   let b = vec3<u32>(0u, 2u, 0u);
diff --git a/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/f32.wgsl b/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/f32.wgsl
index 0a15e5b..b83333f 100644
--- a/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/f32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<f32>(1., 2., 3.);
     let b = 0.;
diff --git a/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/f32.wgsl.expected.wgsl
index 7396529..f48af63 100644
--- a/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<f32>(1.0, 2.0, 3.0);
   let b = 0.0;
diff --git a/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/i32.wgsl b/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/i32.wgsl
index 93243bc..f9291d5 100644
--- a/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/i32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<i32>(1, 2, 3);
     let b = 0;
diff --git a/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/i32.wgsl.expected.wgsl
index c15fc0d..c7f11a1 100644
--- a/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<i32>(1, 2, 3);
   let b = 0;
diff --git a/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/u32.wgsl b/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/u32.wgsl
index e4cc9f0..5446b2a 100644
--- a/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/u32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<u32>(1u, 2u, 3u);
     let b = 0u;
diff --git a/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/u32.wgsl.expected.wgsl
index a7aaf27..5ead983 100644
--- a/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/vec3-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<u32>(1u, 2u, 3u);
   let b = 0u;
diff --git a/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/f32.wgsl b/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/f32.wgsl
index 3800a7b..6db41a4 100644
--- a/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/f32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<f32>(1., 2., 3.);
     let b = vec3<f32>(0., 5., 0.);
diff --git a/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/f32.wgsl.expected.wgsl
index b7be414..6f4aa8c 100644
--- a/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<f32>(1.0, 2.0, 3.0);
   let b = vec3<f32>(0.0, 5.0, 0.0);
diff --git a/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/i32.wgsl b/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/i32.wgsl
index 6f5bac7..5d583e6 100644
--- a/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/i32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<i32>(1, 2, 3);
     let b = vec3<i32>(0, 5, 0);
diff --git a/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/i32.wgsl.expected.wgsl
index 72c4004..76bf812 100644
--- a/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<i32>(1, 2, 3);
   let b = vec3<i32>(0, 5, 0);
diff --git a/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/u32.wgsl b/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/u32.wgsl
index 4d73587..16a0dd0 100644
--- a/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/u32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<u32>(1u, 2u, 3u);
     let b = vec3<u32>(0u, 5u, 0u);
diff --git a/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/u32.wgsl.expected.wgsl
index 03c8910..eb849bd 100644
--- a/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_constant/vec3-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<u32>(1u, 2u, 3u);
   let b = vec3<u32>(0u, 5u, 0u);
diff --git a/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/f32.wgsl b/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/f32.wgsl
index 12f1a15..55c73c5 100644
--- a/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/f32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = 1.;
     var b = 0.;
diff --git a/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/f32.wgsl.expected.wgsl
index 6c35a6e..8b3d931 100644
--- a/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = 1.0;
   var b = 0.0;
diff --git a/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/i32.wgsl b/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/i32.wgsl
index 35b4427..016e7a8 100644
--- a/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/i32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = 1;
     var b = 0;
diff --git a/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.wgsl
index 6680c0b..c762d02 100644
--- a/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = 1;
   var b = 0;
diff --git a/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/u32.wgsl b/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/u32.wgsl
index 1add65a..a265dd0 100644
--- a/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/u32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = 1u;
     var b = 0u;
diff --git a/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/u32.wgsl.expected.wgsl
index ef947c3..ad82462 100644
--- a/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/scalar-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = 1u;
   var b = 0u;
diff --git a/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/f32.wgsl b/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/f32.wgsl
index bc06d3b..ba92b62 100644
--- a/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/f32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = 4.;
     var b = vec3<f32>(0., 2., 0.);
diff --git a/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/f32.wgsl.expected.wgsl
index 6c0a259..c7a6ac1 100644
--- a/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = 4.0;
   var b = vec3<f32>(0.0, 2.0, 0.0);
diff --git a/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/i32.wgsl b/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/i32.wgsl
index 7625e4c..9dc07d5 100644
--- a/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/i32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = 4;
     var b = vec3<i32>(0, 2, 0);
diff --git a/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.wgsl
index 58c7456..e4dd4b4 100644
--- a/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = 4;
   var b = vec3<i32>(0, 2, 0);
diff --git a/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/u32.wgsl b/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/u32.wgsl
index 86989de..0547691 100644
--- a/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/u32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = 4u;
     var b = vec3<u32>(0u, 2u, 0u);
diff --git a/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/u32.wgsl.expected.wgsl
index 563beef..9f103fb 100644
--- a/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/scalar-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = 4u;
   var b = vec3<u32>(0u, 2u, 0u);
diff --git a/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/f32.wgsl b/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/f32.wgsl
index 6e95ded..98ff5f0 100644
--- a/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/f32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = vec3<f32>(1., 2., 3.);
     var b = 0.;
diff --git a/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/f32.wgsl.expected.wgsl
index 27f709e..f0df1be 100644
--- a/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = vec3<f32>(1.0, 2.0, 3.0);
   var b = 0.0;
diff --git a/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/i32.wgsl b/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/i32.wgsl
index c04ada0..b792c3a 100644
--- a/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/i32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = vec3<i32>(1, 2, 3);
     var b = 0;
diff --git a/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.wgsl
index 6bd3b6d..6bbc51b 100644
--- a/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = vec3<i32>(1, 2, 3);
   var b = 0;
diff --git a/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/u32.wgsl b/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/u32.wgsl
index eef2625..4e4eacb 100644
--- a/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/u32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = vec3<u32>(1u, 2u, 3u);
     var b = 0u;
diff --git a/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/u32.wgsl.expected.wgsl
index 31867ef..2387364 100644
--- a/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/vec3-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = vec3<u32>(1u, 2u, 3u);
   var b = 0u;
diff --git a/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/f32.wgsl b/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/f32.wgsl
index 351527d..69761db 100644
--- a/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/f32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = vec3<f32>(1., 2., 3.);
     var b = vec3<f32>(0., 5., 0.);
diff --git a/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/f32.wgsl.expected.wgsl
index f3eb992..2e518af 100644
--- a/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = vec3<f32>(1.0, 2.0, 3.0);
   var b = vec3<f32>(0.0, 5.0, 0.0);
diff --git a/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/i32.wgsl b/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/i32.wgsl
index ab6ecd4..65e13dc 100644
--- a/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/i32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = vec3<i32>(1, 2, 3);
     var b = vec3<i32>(0, 5, 0);
diff --git a/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.wgsl
index 0e81db7..3700b57 100644
--- a/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = vec3<i32>(1, 2, 3);
   var b = vec3<i32>(0, 5, 0);
diff --git a/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/u32.wgsl b/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/u32.wgsl
index f55edd5..d2e0417 100644
--- a/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/u32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = vec3<u32>(1u, 2u, 3u);
     var b = vec3<u32>(0u, 5u, 0u);
diff --git a/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/u32.wgsl.expected.wgsl
index 1d60a13..ab03350 100644
--- a/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_expression/vec3-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = vec3<u32>(1u, 2u, 3u);
   var b = vec3<u32>(0u, 5u, 0u);
diff --git a/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/f32.wgsl b/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/f32.wgsl
index 2dff3b7..2084ec5 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/f32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = 1.;
     var b = 0.;
diff --git a/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/f32.wgsl.expected.wgsl
index 332c2b7..d616f9b 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = 1.0;
   var b = 0.0;
diff --git a/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/i32.wgsl b/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/i32.wgsl
index 375c773..b693c7c 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/i32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = 1;
     var b = 0;
diff --git a/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/i32.wgsl.expected.wgsl
index 90d99f4..da1a3c4 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = 1;
   var b = 0;
diff --git a/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/u32.wgsl b/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/u32.wgsl
index b555e24..7cab8cf 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/u32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = 1u;
     var b = 0u;
diff --git a/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/u32.wgsl.expected.wgsl
index 478767e..7ac2a45 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/scalar-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = 1u;
   var b = 0u;
diff --git a/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/f32.wgsl b/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/f32.wgsl
index 16588a9..62267d4 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/f32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = 4.;
     var b = vec3<f32>(0., 2., 0.);
diff --git a/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/f32.wgsl.expected.wgsl
index 0d44b76..538b208 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = 4.0;
   var b = vec3<f32>(0.0, 2.0, 0.0);
diff --git a/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/i32.wgsl b/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/i32.wgsl
index 8d25a71..c2e1627 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/i32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = 4;
     var b = vec3<i32>(0, 2, 0);
diff --git a/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/i32.wgsl.expected.wgsl
index 2bc4678..c29283e 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = 4;
   var b = vec3<i32>(0, 2, 0);
diff --git a/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/u32.wgsl b/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/u32.wgsl
index f417803..6810e9a 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/u32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = 4u;
     var b = vec3<u32>(0u, 2u, 0u);
diff --git a/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/u32.wgsl.expected.wgsl
index 147f4d2..286538a 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/scalar-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = 4u;
   var b = vec3<u32>(0u, 2u, 0u);
diff --git a/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/f32.wgsl b/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/f32.wgsl
index 2f23ba4..71b7474 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/f32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = vec3<f32>(1., 2., 3.);
     var b = 0.;
diff --git a/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/f32.wgsl.expected.wgsl
index fed430a..8caf79e 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = vec3<f32>(1.0, 2.0, 3.0);
   var b = 0.0;
diff --git a/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/i32.wgsl b/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/i32.wgsl
index 55aa4bc..27fea32 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/i32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = vec3<i32>(1, 2, 3);
     var b = 0;
diff --git a/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/i32.wgsl.expected.wgsl
index 56d8e9d..f11c30e 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = vec3<i32>(1, 2, 3);
   var b = 0;
diff --git a/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/u32.wgsl b/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/u32.wgsl
index 4076d88..ea02f5c 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/u32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = vec3<u32>(1u, 2u, 3u);
     var b = 0u;
diff --git a/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/u32.wgsl.expected.wgsl
index e55b987..0154b03 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/vec3-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = vec3<u32>(1u, 2u, 3u);
   var b = 0u;
diff --git a/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/f32.wgsl b/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/f32.wgsl
index f5092ad..fdcbb74 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/f32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = vec3<f32>(1., 2., 3.);
     var b = vec3<f32>(0., 5., 0.);
diff --git a/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/f32.wgsl.expected.wgsl
index 534f264..d37119a 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = vec3<f32>(1.0, 2.0, 3.0);
   var b = vec3<f32>(0.0, 5.0, 0.0);
diff --git a/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/i32.wgsl b/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/i32.wgsl
index 07d8e62..bb4bda3 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/i32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = vec3<i32>(1, 2, 3);
     var b = vec3<i32>(0, 5, 0);
diff --git a/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/i32.wgsl.expected.wgsl
index 5ce7a80..17e72b3 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = vec3<i32>(1, 2, 3);
   var b = vec3<i32>(0, 5, 0);
diff --git a/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/u32.wgsl b/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/u32.wgsl
index 218e516..26097c9 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/u32.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = vec3<u32>(1u, 2u, 3u);
     var b = vec3<u32>(0u, 5u, 0u);
diff --git a/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/u32.wgsl.expected.wgsl
index 35b85a1..f2206ee 100644
--- a/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/div_by_zero/by_identifier/vec3-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = vec3<u32>(1u, 2u, 3u);
   var b = vec3<u32>(0u, 5u, 0u);
diff --git a/test/expressions/binary/left-shift/scalar-scalar/i32.wgsl b/test/expressions/binary/left-shift/scalar-scalar/i32.wgsl
index 641f5bf..1779cb0 100644
--- a/test/expressions/binary/left-shift/scalar-scalar/i32.wgsl
+++ b/test/expressions/binary/left-shift/scalar-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1;
     let b = 2u;
diff --git a/test/expressions/binary/left-shift/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/left-shift/scalar-scalar/i32.wgsl.expected.wgsl
index df07fda..69143dd 100644
--- a/test/expressions/binary/left-shift/scalar-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/left-shift/scalar-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1;
   let b = 2u;
diff --git a/test/expressions/binary/left-shift/scalar-scalar/u32.wgsl b/test/expressions/binary/left-shift/scalar-scalar/u32.wgsl
index a1a39b6..9638b83 100644
--- a/test/expressions/binary/left-shift/scalar-scalar/u32.wgsl
+++ b/test/expressions/binary/left-shift/scalar-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1u;
     let b = 2u;
diff --git a/test/expressions/binary/left-shift/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/left-shift/scalar-scalar/u32.wgsl.expected.wgsl
index 1aee254..39595c9 100644
--- a/test/expressions/binary/left-shift/scalar-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/left-shift/scalar-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1u;
   let b = 2u;
diff --git a/test/expressions/binary/left-shift/vector-vector/i32.wgsl b/test/expressions/binary/left-shift/vector-vector/i32.wgsl
index 78156b2..fd21fb4 100644
--- a/test/expressions/binary/left-shift/vector-vector/i32.wgsl
+++ b/test/expressions/binary/left-shift/vector-vector/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<i32>(1, 2, 3);
     let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/binary/left-shift/vector-vector/i32.wgsl.expected.wgsl b/test/expressions/binary/left-shift/vector-vector/i32.wgsl.expected.wgsl
index 3a752fa..43d4d00 100644
--- a/test/expressions/binary/left-shift/vector-vector/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/left-shift/vector-vector/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<i32>(1, 2, 3);
   let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/binary/left-shift/vector-vector/u32.wgsl b/test/expressions/binary/left-shift/vector-vector/u32.wgsl
index c85d91e..7e0db01 100644
--- a/test/expressions/binary/left-shift/vector-vector/u32.wgsl
+++ b/test/expressions/binary/left-shift/vector-vector/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<u32>(1u, 2u, 3u);
     let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/binary/left-shift/vector-vector/u32.wgsl.expected.wgsl b/test/expressions/binary/left-shift/vector-vector/u32.wgsl.expected.wgsl
index 987e680..12a5cde 100644
--- a/test/expressions/binary/left-shift/vector-vector/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/left-shift/vector-vector/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<u32>(1u, 2u, 3u);
   let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/binary/mod/scalar-scalar/f32.wgsl b/test/expressions/binary/mod/scalar-scalar/f32.wgsl
index 4ab4923..20513e7 100644
--- a/test/expressions/binary/mod/scalar-scalar/f32.wgsl
+++ b/test/expressions/binary/mod/scalar-scalar/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1.;
     let b = 2.;
diff --git a/test/expressions/binary/mod/scalar-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/mod/scalar-scalar/f32.wgsl.expected.wgsl
index 66c2041..eebb252 100644
--- a/test/expressions/binary/mod/scalar-scalar/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod/scalar-scalar/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1.0;
   let b = 2.0;
diff --git a/test/expressions/binary/mod/scalar-scalar/i32.wgsl b/test/expressions/binary/mod/scalar-scalar/i32.wgsl
index f186706..12a7c72 100644
--- a/test/expressions/binary/mod/scalar-scalar/i32.wgsl
+++ b/test/expressions/binary/mod/scalar-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1;
     let b = 2;
diff --git a/test/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.wgsl
index f692f9e..549140e 100644
--- a/test/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod/scalar-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1;
   let b = 2;
diff --git a/test/expressions/binary/mod/scalar-scalar/u32.wgsl b/test/expressions/binary/mod/scalar-scalar/u32.wgsl
index d1b56f7..96042bd 100644
--- a/test/expressions/binary/mod/scalar-scalar/u32.wgsl
+++ b/test/expressions/binary/mod/scalar-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1u;
     let b = 2u;
diff --git a/test/expressions/binary/mod/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/mod/scalar-scalar/u32.wgsl.expected.wgsl
index e3da2c7..d3835ed 100644
--- a/test/expressions/binary/mod/scalar-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod/scalar-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1u;
   let b = 2u;
diff --git a/test/expressions/binary/mod/vec3-vec3/f32.wgsl b/test/expressions/binary/mod/vec3-vec3/f32.wgsl
index d7cebb2..815fb66 100644
--- a/test/expressions/binary/mod/vec3-vec3/f32.wgsl
+++ b/test/expressions/binary/mod/vec3-vec3/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<f32>(1., 2., 3.);
     let b = vec3<f32>(4., 5., 6.);
diff --git a/test/expressions/binary/mod/vec3-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/mod/vec3-vec3/f32.wgsl.expected.wgsl
index d0ef8c9..d37c9d9 100644
--- a/test/expressions/binary/mod/vec3-vec3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod/vec3-vec3/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<f32>(1.0, 2.0, 3.0);
   let b = vec3<f32>(4.0, 5.0, 6.0);
diff --git a/test/expressions/binary/mod/vec3-vec3/i32.wgsl b/test/expressions/binary/mod/vec3-vec3/i32.wgsl
index b26013f..55bfa49 100644
--- a/test/expressions/binary/mod/vec3-vec3/i32.wgsl
+++ b/test/expressions/binary/mod/vec3-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<i32>(1, 2, 3);
     let b = vec3<i32>(4, 5, 6);
diff --git a/test/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.wgsl
index 553af2b..1769386 100644
--- a/test/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod/vec3-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<i32>(1, 2, 3);
   let b = vec3<i32>(4, 5, 6);
diff --git a/test/expressions/binary/mod/vec3-vec3/u32.wgsl b/test/expressions/binary/mod/vec3-vec3/u32.wgsl
index 2ad96bc..02f1eea 100644
--- a/test/expressions/binary/mod/vec3-vec3/u32.wgsl
+++ b/test/expressions/binary/mod/vec3-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<u32>(1u, 2u, 3u);
     let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/binary/mod/vec3-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/mod/vec3-vec3/u32.wgsl.expected.wgsl
index ca63195..36fa71e 100644
--- a/test/expressions/binary/mod/vec3-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod/vec3-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<u32>(1u, 2u, 3u);
   let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/f32.wgsl b/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/f32.wgsl
index b34099c..6d014b8 100644
--- a/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/f32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1.;
     let b = 0.;
diff --git a/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/f32.wgsl.expected.wgsl
index 235be93..542a2e7 100644
--- a/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1.0;
   let b = 0.0;
diff --git a/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/i32.wgsl b/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/i32.wgsl
index 9900e05..4c05b0e 100644
--- a/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/i32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1;
     let b = 0;
diff --git a/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/i32.wgsl.expected.wgsl
index 4c6fdf9..e63b37d 100644
--- a/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1;
   let b = 0;
diff --git a/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/u32.wgsl b/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/u32.wgsl
index 4fb0f9f..a63ca8f 100644
--- a/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/u32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1u;
     let b = 0u;
diff --git a/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/u32.wgsl.expected.wgsl
index 62a525b..02a078b 100644
--- a/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_constant/scalar-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1u;
   let b = 0u;
diff --git a/test/expressions/binary/mod_by_zero/by_constant/scalar-vec3/i32.wgsl b/test/expressions/binary/mod_by_zero/by_constant/scalar-vec3/i32.wgsl
index 9b27df2..b319205 100644
--- a/test/expressions/binary/mod_by_zero/by_constant/scalar-vec3/i32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_constant/scalar-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 4;
     let b = vec3<i32>(0, 2, 0);
diff --git a/test/expressions/binary/mod_by_zero/by_constant/scalar-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_constant/scalar-vec3/i32.wgsl.expected.wgsl
index dca7442..5b99aea 100644
--- a/test/expressions/binary/mod_by_zero/by_constant/scalar-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_constant/scalar-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 4;
   let b = vec3<i32>(0, 2, 0);
diff --git a/test/expressions/binary/mod_by_zero/by_constant/scalar-vec3/u32.wgsl b/test/expressions/binary/mod_by_zero/by_constant/scalar-vec3/u32.wgsl
index 494a712..94494c3 100644
--- a/test/expressions/binary/mod_by_zero/by_constant/scalar-vec3/u32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_constant/scalar-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 4u;
     let b = vec3<u32>(0u, 2u, 0u);
diff --git a/test/expressions/binary/mod_by_zero/by_constant/scalar-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_constant/scalar-vec3/u32.wgsl.expected.wgsl
index c061d41..0aca8c0 100644
--- a/test/expressions/binary/mod_by_zero/by_constant/scalar-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_constant/scalar-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 4u;
   let b = vec3<u32>(0u, 2u, 0u);
diff --git a/test/expressions/binary/mod_by_zero/by_constant/vec3-scalar/i32.wgsl b/test/expressions/binary/mod_by_zero/by_constant/vec3-scalar/i32.wgsl
index 2fe5f2d..0a0f4d4 100644
--- a/test/expressions/binary/mod_by_zero/by_constant/vec3-scalar/i32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_constant/vec3-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<i32>(1, 2, 3);
     let b = 0;
diff --git a/test/expressions/binary/mod_by_zero/by_constant/vec3-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_constant/vec3-scalar/i32.wgsl.expected.wgsl
index 0aac1fa..8cc8abe 100644
--- a/test/expressions/binary/mod_by_zero/by_constant/vec3-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_constant/vec3-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<i32>(1, 2, 3);
   let b = 0;
diff --git a/test/expressions/binary/mod_by_zero/by_constant/vec3-scalar/u32.wgsl b/test/expressions/binary/mod_by_zero/by_constant/vec3-scalar/u32.wgsl
index 25b884f..796e15f 100644
--- a/test/expressions/binary/mod_by_zero/by_constant/vec3-scalar/u32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_constant/vec3-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<u32>(1u, 2u, 3u);
     let b = 0u;
diff --git a/test/expressions/binary/mod_by_zero/by_constant/vec3-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_constant/vec3-scalar/u32.wgsl.expected.wgsl
index 7665b70..98c4523 100644
--- a/test/expressions/binary/mod_by_zero/by_constant/vec3-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_constant/vec3-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<u32>(1u, 2u, 3u);
   let b = 0u;
diff --git a/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/f32.wgsl b/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/f32.wgsl
index 61df86d..64fc4d5 100644
--- a/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/f32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<f32>(1., 2., 3.);
     let b = vec3<f32>(0., 5., 0.);
diff --git a/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/f32.wgsl.expected.wgsl
index 180e7d9..227a070 100644
--- a/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<f32>(1.0, 2.0, 3.0);
   let b = vec3<f32>(0.0, 5.0, 0.0);
diff --git a/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/i32.wgsl b/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/i32.wgsl
index 23aa96c..9e64d49 100644
--- a/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/i32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<i32>(1, 2, 3);
     let b = vec3<i32>(0, 5, 0);
diff --git a/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/i32.wgsl.expected.wgsl
index 259840d..b6fc8c0 100644
--- a/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<i32>(1, 2, 3);
   let b = vec3<i32>(0, 5, 0);
diff --git a/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/u32.wgsl b/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/u32.wgsl
index ee9eecc..6724d92 100644
--- a/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/u32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<u32>(1u, 2u, 3u);
     let b = vec3<u32>(0u, 5u, 0u);
diff --git a/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/u32.wgsl.expected.wgsl
index 08943bb..24d48be 100644
--- a/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_constant/vec3-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<u32>(1u, 2u, 3u);
   let b = vec3<u32>(0u, 5u, 0u);
diff --git a/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/f32.wgsl b/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/f32.wgsl
index a4e2202..820231b 100644
--- a/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/f32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = 1.;
     var b = 0.;
diff --git a/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/f32.wgsl.expected.wgsl
index b6c7b67..019d543 100644
--- a/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = 1.0;
   var b = 0.0;
diff --git a/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/i32.wgsl b/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/i32.wgsl
index 7f8d8d0..949d0fe 100644
--- a/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/i32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = 1;
     var b = 0;
diff --git a/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.wgsl
index 581f6df..74888f2 100644
--- a/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = 1;
   var b = 0;
diff --git a/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/u32.wgsl b/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/u32.wgsl
index edd134b..caf8b51 100644
--- a/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/u32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = 1u;
     var b = 0u;
diff --git a/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/u32.wgsl.expected.wgsl
index f894e6d..a75275d 100644
--- a/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_expression/scalar-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = 1u;
   var b = 0u;
diff --git a/test/expressions/binary/mod_by_zero/by_expression/scalar-vec3/i32.wgsl b/test/expressions/binary/mod_by_zero/by_expression/scalar-vec3/i32.wgsl
index b90a404..d341588 100644
--- a/test/expressions/binary/mod_by_zero/by_expression/scalar-vec3/i32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_expression/scalar-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = 4;
     var b = vec3<i32>(0, 2, 0);
diff --git a/test/expressions/binary/mod_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.wgsl
index 724d89b..1cff64c 100644
--- a/test/expressions/binary/mod_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_expression/scalar-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = 4;
   var b = vec3<i32>(0, 2, 0);
diff --git a/test/expressions/binary/mod_by_zero/by_expression/scalar-vec3/u32.wgsl b/test/expressions/binary/mod_by_zero/by_expression/scalar-vec3/u32.wgsl
index e6626f1..bbe0ada 100644
--- a/test/expressions/binary/mod_by_zero/by_expression/scalar-vec3/u32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_expression/scalar-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = 4u;
     var b = vec3<u32>(0u, 2u, 0u);
diff --git a/test/expressions/binary/mod_by_zero/by_expression/scalar-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_expression/scalar-vec3/u32.wgsl.expected.wgsl
index d820f98..c292b7b 100644
--- a/test/expressions/binary/mod_by_zero/by_expression/scalar-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_expression/scalar-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = 4u;
   var b = vec3<u32>(0u, 2u, 0u);
diff --git a/test/expressions/binary/mod_by_zero/by_expression/vec3-scalar/i32.wgsl b/test/expressions/binary/mod_by_zero/by_expression/vec3-scalar/i32.wgsl
index e5dd983..732dff4 100644
--- a/test/expressions/binary/mod_by_zero/by_expression/vec3-scalar/i32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_expression/vec3-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = vec3<i32>(1, 2, 3);
     var b = 0;
diff --git a/test/expressions/binary/mod_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.wgsl
index c924762..0aaa1a2 100644
--- a/test/expressions/binary/mod_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_expression/vec3-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = vec3<i32>(1, 2, 3);
   var b = 0;
diff --git a/test/expressions/binary/mod_by_zero/by_expression/vec3-scalar/u32.wgsl b/test/expressions/binary/mod_by_zero/by_expression/vec3-scalar/u32.wgsl
index b775a66..87c0466 100644
--- a/test/expressions/binary/mod_by_zero/by_expression/vec3-scalar/u32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_expression/vec3-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = vec3<u32>(1u, 2u, 3u);
     var b = 0u;
diff --git a/test/expressions/binary/mod_by_zero/by_expression/vec3-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_expression/vec3-scalar/u32.wgsl.expected.wgsl
index d73c1a9..9433a5a 100644
--- a/test/expressions/binary/mod_by_zero/by_expression/vec3-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_expression/vec3-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = vec3<u32>(1u, 2u, 3u);
   var b = 0u;
diff --git a/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/f32.wgsl b/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/f32.wgsl
index 92e19cf..6a67f54 100644
--- a/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/f32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = vec3<f32>(1., 2., 3.);
     var b = vec3<f32>(0., 5., 0.);
diff --git a/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/f32.wgsl.expected.wgsl
index 06e70ae..965767f 100644
--- a/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = vec3<f32>(1.0, 2.0, 3.0);
   var b = vec3<f32>(0.0, 5.0, 0.0);
diff --git a/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/i32.wgsl b/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/i32.wgsl
index e843464..6996804 100644
--- a/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/i32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = vec3<i32>(1, 2, 3);
     var b = vec3<i32>(0, 5, 0);
diff --git a/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.wgsl
index 78f7040..b327a60 100644
--- a/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = vec3<i32>(1, 2, 3);
   var b = vec3<i32>(0, 5, 0);
diff --git a/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/u32.wgsl b/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/u32.wgsl
index ad50323..769ce16 100644
--- a/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/u32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = vec3<u32>(1u, 2u, 3u);
     var b = vec3<u32>(0u, 5u, 0u);
diff --git a/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/u32.wgsl.expected.wgsl
index e7f2ce8..cdc7848 100644
--- a/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_expression/vec3-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = vec3<u32>(1u, 2u, 3u);
   var b = vec3<u32>(0u, 5u, 0u);
diff --git a/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/f32.wgsl b/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/f32.wgsl
index b80c201..ec5cc7d 100644
--- a/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/f32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = 1.;
     var b = 0.;
diff --git a/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/f32.wgsl.expected.wgsl
index 1b3af01..37faeaa 100644
--- a/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = 1.0;
   var b = 0.0;
diff --git a/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/i32.wgsl b/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/i32.wgsl
index 38874c4..3f673f9 100644
--- a/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/i32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = 1;
     var b = 0;
diff --git a/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/i32.wgsl.expected.wgsl
index 1b19397..241e4c3 100644
--- a/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = 1;
   var b = 0;
diff --git a/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/u32.wgsl b/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/u32.wgsl
index a8b6555..19f6c04 100644
--- a/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/u32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = 1u;
     var b = 0u;
diff --git a/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/u32.wgsl.expected.wgsl
index 1a5f726..8d6291b 100644
--- a/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_identifier/scalar-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = 1u;
   var b = 0u;
diff --git a/test/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/i32.wgsl b/test/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/i32.wgsl
index 0f9c970..ac029c5 100644
--- a/test/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/i32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = 4;
     var b = vec3<i32>(0, 2, 0);
diff --git a/test/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/i32.wgsl.expected.wgsl
index 30f19f4..30bdb80 100644
--- a/test/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = 4;
   var b = vec3<i32>(0, 2, 0);
diff --git a/test/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/u32.wgsl b/test/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/u32.wgsl
index 9afcb3c..74885a7 100644
--- a/test/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/u32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = 4u;
     var b = vec3<u32>(0u, 2u, 0u);
diff --git a/test/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/u32.wgsl.expected.wgsl
index 0e406f7..0abb9dc 100644
--- a/test/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_identifier/scalar-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = 4u;
   var b = vec3<u32>(0u, 2u, 0u);
diff --git a/test/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/i32.wgsl b/test/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/i32.wgsl
index 41f8c7c..8ceeb13 100644
--- a/test/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/i32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = vec3<i32>(1, 2, 3);
     var b = 0;
diff --git a/test/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/i32.wgsl.expected.wgsl
index dcb6939..b9f853c 100644
--- a/test/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = vec3<i32>(1, 2, 3);
   var b = 0;
diff --git a/test/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/u32.wgsl b/test/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/u32.wgsl
index 5ddae5b..aa6b581 100644
--- a/test/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/u32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = vec3<u32>(1u, 2u, 3u);
     var b = 0u;
diff --git a/test/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/u32.wgsl.expected.wgsl
index eabfbcd..d79da42 100644
--- a/test/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_identifier/vec3-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = vec3<u32>(1u, 2u, 3u);
   var b = 0u;
diff --git a/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/f32.wgsl b/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/f32.wgsl
index 7a91bd0..f5d27d5 100644
--- a/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/f32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = vec3<f32>(1., 2., 3.);
     var b = vec3<f32>(0., 5., 0.);
diff --git a/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/f32.wgsl.expected.wgsl
index 6d96f89..c178fab 100644
--- a/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = vec3<f32>(1.0, 2.0, 3.0);
   var b = vec3<f32>(0.0, 5.0, 0.0);
diff --git a/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/i32.wgsl b/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/i32.wgsl
index e9364db..129d4b0 100644
--- a/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/i32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = vec3<i32>(1, 2, 3);
     var b = vec3<i32>(0, 5, 0);
diff --git a/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/i32.wgsl.expected.wgsl
index ebd6b91..96c95e9 100644
--- a/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = vec3<i32>(1, 2, 3);
   var b = vec3<i32>(0, 5, 0);
diff --git a/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/u32.wgsl b/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/u32.wgsl
index cf77b25..b6be872 100644
--- a/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/u32.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var a = vec3<u32>(1u, 2u, 3u);
     var b = vec3<u32>(0u, 5u, 0u);
diff --git a/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/u32.wgsl.expected.wgsl
index 615b56c..de150e4 100644
--- a/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mod_by_zero/by_identifier/vec3-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var a = vec3<u32>(1u, 2u, 3u);
   var b = vec3<u32>(0u, 5u, 0u);
diff --git a/test/expressions/binary/mul/mat2x4-mat4x2/f32.wgsl b/test/expressions/binary/mul/mat2x4-mat4x2/f32.wgsl
index ade50cb..d9e4331 100644
--- a/test/expressions/binary/mul/mat2x4-mat4x2/f32.wgsl
+++ b/test/expressions/binary/mul/mat2x4-mat4x2/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = mat2x4<f32>(vec4<f32>(1., 2., 3., 4.), vec4<f32>(5., 6., 7., 8.));
     let b = mat4x2<f32>(vec2<f32>(-1., -2.), vec2<f32>(-3., -4.), vec2<f32>(-5., -6.), vec2<f32>(-7., -8.));
diff --git a/test/expressions/binary/mul/mat2x4-mat4x2/f32.wgsl.expected.wgsl b/test/expressions/binary/mul/mat2x4-mat4x2/f32.wgsl.expected.wgsl
index 794ec9b..2bdcf99 100644
--- a/test/expressions/binary/mul/mat2x4-mat4x2/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mul/mat2x4-mat4x2/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = mat2x4<f32>(vec4<f32>(1.0, 2.0, 3.0, 4.0), vec4<f32>(5.0, 6.0, 7.0, 8.0));
   let b = mat4x2<f32>(vec2<f32>(-1.0, -2.0), vec2<f32>(-3.0, -4.0), vec2<f32>(-5.0, -6.0), vec2<f32>(-7.0, -8.0));
diff --git a/test/expressions/binary/mul/mat3x2-vec3/f32.wgsl b/test/expressions/binary/mul/mat3x2-vec3/f32.wgsl
index 711e0c8..4a407bd 100644
--- a/test/expressions/binary/mul/mat3x2-vec3/f32.wgsl
+++ b/test/expressions/binary/mul/mat3x2-vec3/f32.wgsl
@@ -2,9 +2,9 @@
     matrix : mat3x2<f32>;
     vector : vec3<f32>;
 };
-[[group(0), binding(0)]] var<uniform> data: S;
+@group(0) @binding(0) var<uniform> data: S;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let x = data.matrix * data.vector;
 }
diff --git a/test/expressions/binary/mul/mat3x2-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/mul/mat3x2-vec3/f32.wgsl.expected.wgsl
index adb8e74..4f6b25c 100644
--- a/test/expressions/binary/mul/mat3x2-vec3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mul/mat3x2-vec3/f32.wgsl.expected.wgsl
@@ -3,9 +3,9 @@
   vector : vec3<f32>;
 }
 
-[[group(0), binding(0)]] var<uniform> data : S;
+@group(0) @binding(0) var<uniform> data : S;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let x = (data.matrix * data.vector);
 }
diff --git a/test/expressions/binary/mul/mat3x3-mat3x3/f32.wgsl b/test/expressions/binary/mul/mat3x3-mat3x3/f32.wgsl
index 06744d7..693b097 100644
--- a/test/expressions/binary/mul/mat3x3-mat3x3/f32.wgsl
+++ b/test/expressions/binary/mul/mat3x3-mat3x3/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = mat3x3<f32>(vec3<f32>( 1.,  2.,  3.), vec3<f32>( 4.,  5.,  6.), vec3<f32>( 7.,  8.,  9.));
     let b = mat3x3<f32>(vec3<f32>(-1., -2., -3.), vec3<f32>(-4., -5., -6.), vec3<f32>(-7., -8., -9.));
diff --git a/test/expressions/binary/mul/mat3x3-mat3x3/f32.wgsl.expected.wgsl b/test/expressions/binary/mul/mat3x3-mat3x3/f32.wgsl.expected.wgsl
index 2dd4a96..872ec3d 100644
--- a/test/expressions/binary/mul/mat3x3-mat3x3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mul/mat3x3-mat3x3/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = mat3x3<f32>(vec3<f32>(1.0, 2.0, 3.0), vec3<f32>(4.0, 5.0, 6.0), vec3<f32>(7.0, 8.0, 9.0));
   let b = mat3x3<f32>(vec3<f32>(-1.0, -2.0, -3.0), vec3<f32>(-4.0, -5.0, -6.0), vec3<f32>(-7.0, -8.0, -9.0));
diff --git a/test/expressions/binary/mul/mat3x3-vec3/f32.wgsl b/test/expressions/binary/mul/mat3x3-vec3/f32.wgsl
index 1101f92..f915862 100644
--- a/test/expressions/binary/mul/mat3x3-vec3/f32.wgsl
+++ b/test/expressions/binary/mul/mat3x3-vec3/f32.wgsl
@@ -2,9 +2,9 @@
     matrix : mat3x3<f32>;
     vector : vec3<f32>;
 };
-[[group(0), binding(0)]] var<uniform> data: S;
+@group(0) @binding(0) var<uniform> data: S;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let x = data.matrix * data.vector;
 }
diff --git a/test/expressions/binary/mul/mat3x3-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/mul/mat3x3-vec3/f32.wgsl.expected.wgsl
index 461d0c7..2c12345 100644
--- a/test/expressions/binary/mul/mat3x3-vec3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mul/mat3x3-vec3/f32.wgsl.expected.wgsl
@@ -3,9 +3,9 @@
   vector : vec3<f32>;
 }
 
-[[group(0), binding(0)]] var<uniform> data : S;
+@group(0) @binding(0) var<uniform> data : S;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let x = (data.matrix * data.vector);
 }
diff --git a/test/expressions/binary/mul/mat4x2-mat2x4/f32.wgsl b/test/expressions/binary/mul/mat4x2-mat2x4/f32.wgsl
index 236146e..76e4db2 100644
--- a/test/expressions/binary/mul/mat4x2-mat2x4/f32.wgsl
+++ b/test/expressions/binary/mul/mat4x2-mat2x4/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = mat4x2<f32>(vec2<f32>(-1., -2.), vec2<f32>(-3., -4.), vec2<f32>(-5., -6.), vec2<f32>(-7., -8.));
     let b = mat2x4<f32>(vec4<f32>(1., 2., 3., 4.), vec4<f32>(5., 6., 7., 8.));
diff --git a/test/expressions/binary/mul/mat4x2-mat2x4/f32.wgsl.expected.wgsl b/test/expressions/binary/mul/mat4x2-mat2x4/f32.wgsl.expected.wgsl
index b4803d4..cc6bf09 100644
--- a/test/expressions/binary/mul/mat4x2-mat2x4/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mul/mat4x2-mat2x4/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = mat4x2<f32>(vec2<f32>(-1.0, -2.0), vec2<f32>(-3.0, -4.0), vec2<f32>(-5.0, -6.0), vec2<f32>(-7.0, -8.0));
   let b = mat2x4<f32>(vec4<f32>(1.0, 2.0, 3.0, 4.0), vec4<f32>(5.0, 6.0, 7.0, 8.0));
diff --git a/test/expressions/binary/mul/scalar-scalar/f32.wgsl b/test/expressions/binary/mul/scalar-scalar/f32.wgsl
index 23d7371..7c3a494 100644
--- a/test/expressions/binary/mul/scalar-scalar/f32.wgsl
+++ b/test/expressions/binary/mul/scalar-scalar/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1.;
     let b = 2.;
diff --git a/test/expressions/binary/mul/scalar-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/mul/scalar-scalar/f32.wgsl.expected.wgsl
index 6f87493..1308e5a 100644
--- a/test/expressions/binary/mul/scalar-scalar/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mul/scalar-scalar/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1.0;
   let b = 2.0;
diff --git a/test/expressions/binary/mul/scalar-scalar/i32.wgsl b/test/expressions/binary/mul/scalar-scalar/i32.wgsl
index ea58328..841429e 100644
--- a/test/expressions/binary/mul/scalar-scalar/i32.wgsl
+++ b/test/expressions/binary/mul/scalar-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1;
     let b = 2;
diff --git a/test/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.wgsl
index 5f53be8..e0189a5 100644
--- a/test/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mul/scalar-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1;
   let b = 2;
diff --git a/test/expressions/binary/mul/scalar-scalar/u32.wgsl b/test/expressions/binary/mul/scalar-scalar/u32.wgsl
index ec6a61d..4998346 100644
--- a/test/expressions/binary/mul/scalar-scalar/u32.wgsl
+++ b/test/expressions/binary/mul/scalar-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1u;
     let b = 2u;
diff --git a/test/expressions/binary/mul/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/mul/scalar-scalar/u32.wgsl.expected.wgsl
index 92cffef..3dda0e0 100644
--- a/test/expressions/binary/mul/scalar-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mul/scalar-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1u;
   let b = 2u;
diff --git a/test/expressions/binary/mul/scalar-vec3/f32.wgsl b/test/expressions/binary/mul/scalar-vec3/f32.wgsl
index cd19d3b..62560cb 100644
--- a/test/expressions/binary/mul/scalar-vec3/f32.wgsl
+++ b/test/expressions/binary/mul/scalar-vec3/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 4.;
     let b = vec3<f32>(1., 2., 3.);
diff --git a/test/expressions/binary/mul/scalar-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/mul/scalar-vec3/f32.wgsl.expected.wgsl
index 65ac8cc..f2cf6c4 100644
--- a/test/expressions/binary/mul/scalar-vec3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mul/scalar-vec3/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 4.0;
   let b = vec3<f32>(1.0, 2.0, 3.0);
diff --git a/test/expressions/binary/mul/scalar-vec3/i32.wgsl b/test/expressions/binary/mul/scalar-vec3/i32.wgsl
index 8d1bf3f..8f8d3e4 100644
--- a/test/expressions/binary/mul/scalar-vec3/i32.wgsl
+++ b/test/expressions/binary/mul/scalar-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 4;
     let b = vec3<i32>(1, 2, 3);
diff --git a/test/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.wgsl
index c5744b7..85f39b5 100644
--- a/test/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mul/scalar-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 4;
   let b = vec3<i32>(1, 2, 3);
diff --git a/test/expressions/binary/mul/scalar-vec3/u32.wgsl b/test/expressions/binary/mul/scalar-vec3/u32.wgsl
index d5f432e..5c9260f 100644
--- a/test/expressions/binary/mul/scalar-vec3/u32.wgsl
+++ b/test/expressions/binary/mul/scalar-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 4u;
     let b = vec3<u32>(1u, 2u, 3u);
diff --git a/test/expressions/binary/mul/scalar-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/mul/scalar-vec3/u32.wgsl.expected.wgsl
index 60505a4..9fc3bff 100644
--- a/test/expressions/binary/mul/scalar-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mul/scalar-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 4u;
   let b = vec3<u32>(1u, 2u, 3u);
diff --git a/test/expressions/binary/mul/vec3-mat3x3/f32.wgsl b/test/expressions/binary/mul/vec3-mat3x3/f32.wgsl
index 8cfd8e1..5606f65 100644
--- a/test/expressions/binary/mul/vec3-mat3x3/f32.wgsl
+++ b/test/expressions/binary/mul/vec3-mat3x3/f32.wgsl
@@ -2,9 +2,9 @@
     matrix : mat3x3<f32>;
     vector : vec3<f32>;
 };
-[[group(0), binding(0)]] var<uniform> data: S;
+@group(0) @binding(0) var<uniform> data: S;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let x = data.vector * data.matrix;
 }
diff --git a/test/expressions/binary/mul/vec3-mat3x3/f32.wgsl.expected.wgsl b/test/expressions/binary/mul/vec3-mat3x3/f32.wgsl.expected.wgsl
index 10e087f..aca7bee 100644
--- a/test/expressions/binary/mul/vec3-mat3x3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mul/vec3-mat3x3/f32.wgsl.expected.wgsl
@@ -3,9 +3,9 @@
   vector : vec3<f32>;
 }
 
-[[group(0), binding(0)]] var<uniform> data : S;
+@group(0) @binding(0) var<uniform> data : S;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let x = (data.vector * data.matrix);
 }
diff --git a/test/expressions/binary/mul/vec3-mat4x3/f32.wgsl b/test/expressions/binary/mul/vec3-mat4x3/f32.wgsl
index 48b2709..5cceccb 100644
--- a/test/expressions/binary/mul/vec3-mat4x3/f32.wgsl
+++ b/test/expressions/binary/mul/vec3-mat4x3/f32.wgsl
@@ -2,9 +2,9 @@
     matrix : mat4x3<f32>;
     vector : vec3<f32>;
 };
-[[group(0), binding(0)]] var<uniform> data: S;
+@group(0) @binding(0) var<uniform> data: S;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let x = data.vector * data.matrix;
 }
diff --git a/test/expressions/binary/mul/vec3-mat4x3/f32.wgsl.expected.wgsl b/test/expressions/binary/mul/vec3-mat4x3/f32.wgsl.expected.wgsl
index 223240f..a3bfccc 100644
--- a/test/expressions/binary/mul/vec3-mat4x3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mul/vec3-mat4x3/f32.wgsl.expected.wgsl
@@ -3,9 +3,9 @@
   vector : vec3<f32>;
 }
 
-[[group(0), binding(0)]] var<uniform> data : S;
+@group(0) @binding(0) var<uniform> data : S;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   let x = (data.vector * data.matrix);
 }
diff --git a/test/expressions/binary/mul/vec3-scalar/f32.wgsl b/test/expressions/binary/mul/vec3-scalar/f32.wgsl
index 34a7b70..10f72ae 100644
--- a/test/expressions/binary/mul/vec3-scalar/f32.wgsl
+++ b/test/expressions/binary/mul/vec3-scalar/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<f32>(1., 2., 3.);
     let b = 4.;
diff --git a/test/expressions/binary/mul/vec3-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/mul/vec3-scalar/f32.wgsl.expected.wgsl
index 712df51..b3acece 100644
--- a/test/expressions/binary/mul/vec3-scalar/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mul/vec3-scalar/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<f32>(1.0, 2.0, 3.0);
   let b = 4.0;
diff --git a/test/expressions/binary/mul/vec3-scalar/i32.wgsl b/test/expressions/binary/mul/vec3-scalar/i32.wgsl
index a8f8d1e..d4d0678 100644
--- a/test/expressions/binary/mul/vec3-scalar/i32.wgsl
+++ b/test/expressions/binary/mul/vec3-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<i32>(1, 2, 3);
     let b = 4;
diff --git a/test/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.wgsl
index d8f7e63..a727294 100644
--- a/test/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mul/vec3-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<i32>(1, 2, 3);
   let b = 4;
diff --git a/test/expressions/binary/mul/vec3-scalar/u32.wgsl b/test/expressions/binary/mul/vec3-scalar/u32.wgsl
index a63cb22..03a79ac 100644
--- a/test/expressions/binary/mul/vec3-scalar/u32.wgsl
+++ b/test/expressions/binary/mul/vec3-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<u32>(1u, 2u, 3u);
     let b = 4u;
diff --git a/test/expressions/binary/mul/vec3-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/mul/vec3-scalar/u32.wgsl.expected.wgsl
index 995a6a3..fc7e60d 100644
--- a/test/expressions/binary/mul/vec3-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mul/vec3-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<u32>(1u, 2u, 3u);
   let b = 4u;
diff --git a/test/expressions/binary/mul/vec3-vec3/f32.wgsl b/test/expressions/binary/mul/vec3-vec3/f32.wgsl
index 184a9fb..6d0e211 100644
--- a/test/expressions/binary/mul/vec3-vec3/f32.wgsl
+++ b/test/expressions/binary/mul/vec3-vec3/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<f32>(1., 2., 3.);
     let b = vec3<f32>(4., 5., 6.);
diff --git a/test/expressions/binary/mul/vec3-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/mul/vec3-vec3/f32.wgsl.expected.wgsl
index fff2a26..a0dd1f7 100644
--- a/test/expressions/binary/mul/vec3-vec3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mul/vec3-vec3/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<f32>(1.0, 2.0, 3.0);
   let b = vec3<f32>(4.0, 5.0, 6.0);
diff --git a/test/expressions/binary/mul/vec3-vec3/i32.wgsl b/test/expressions/binary/mul/vec3-vec3/i32.wgsl
index dc812d8..32ae83f 100644
--- a/test/expressions/binary/mul/vec3-vec3/i32.wgsl
+++ b/test/expressions/binary/mul/vec3-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<i32>(1, 2, 3);
     let b = vec3<i32>(4, 5, 6);
diff --git a/test/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.wgsl
index 3ca04ae..20121b5 100644
--- a/test/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mul/vec3-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<i32>(1, 2, 3);
   let b = vec3<i32>(4, 5, 6);
diff --git a/test/expressions/binary/mul/vec3-vec3/u32.wgsl b/test/expressions/binary/mul/vec3-vec3/u32.wgsl
index d1e2219..39e1db4 100644
--- a/test/expressions/binary/mul/vec3-vec3/u32.wgsl
+++ b/test/expressions/binary/mul/vec3-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<u32>(1u, 2u, 3u);
     let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/binary/mul/vec3-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/mul/vec3-vec3/u32.wgsl.expected.wgsl
index 4392855..a910c86 100644
--- a/test/expressions/binary/mul/vec3-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/mul/vec3-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<u32>(1u, 2u, 3u);
   let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/binary/right-shift/scalar-scalar/i32.wgsl b/test/expressions/binary/right-shift/scalar-scalar/i32.wgsl
index ef2e9f9..54eda6d 100644
--- a/test/expressions/binary/right-shift/scalar-scalar/i32.wgsl
+++ b/test/expressions/binary/right-shift/scalar-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1;
     let b = 2u;
diff --git a/test/expressions/binary/right-shift/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/right-shift/scalar-scalar/i32.wgsl.expected.wgsl
index 9953bcc..57f33c8 100644
--- a/test/expressions/binary/right-shift/scalar-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/right-shift/scalar-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1;
   let b = 2u;
diff --git a/test/expressions/binary/right-shift/scalar-scalar/u32.wgsl b/test/expressions/binary/right-shift/scalar-scalar/u32.wgsl
index ecfbc1b..4cf2a84 100644
--- a/test/expressions/binary/right-shift/scalar-scalar/u32.wgsl
+++ b/test/expressions/binary/right-shift/scalar-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1u;
     let b = 2u;
diff --git a/test/expressions/binary/right-shift/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/right-shift/scalar-scalar/u32.wgsl.expected.wgsl
index 3757438..827e23f 100644
--- a/test/expressions/binary/right-shift/scalar-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/right-shift/scalar-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1u;
   let b = 2u;
diff --git a/test/expressions/binary/right-shift/vector-vector/i32.wgsl b/test/expressions/binary/right-shift/vector-vector/i32.wgsl
index ffae0c1..366c8c4 100644
--- a/test/expressions/binary/right-shift/vector-vector/i32.wgsl
+++ b/test/expressions/binary/right-shift/vector-vector/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<i32>(1, 2, 3);
     let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/binary/right-shift/vector-vector/i32.wgsl.expected.wgsl b/test/expressions/binary/right-shift/vector-vector/i32.wgsl.expected.wgsl
index 765b4b1..96e088f 100644
--- a/test/expressions/binary/right-shift/vector-vector/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/right-shift/vector-vector/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<i32>(1, 2, 3);
   let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/binary/right-shift/vector-vector/u32.wgsl b/test/expressions/binary/right-shift/vector-vector/u32.wgsl
index 35da873..a70095d 100644
--- a/test/expressions/binary/right-shift/vector-vector/u32.wgsl
+++ b/test/expressions/binary/right-shift/vector-vector/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<u32>(1u, 2u, 3u);
     let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/binary/right-shift/vector-vector/u32.wgsl.expected.wgsl b/test/expressions/binary/right-shift/vector-vector/u32.wgsl.expected.wgsl
index 7368058..4b44e73 100644
--- a/test/expressions/binary/right-shift/vector-vector/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/right-shift/vector-vector/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<u32>(1u, 2u, 3u);
   let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/binary/sub/mat3x3-mat3x3/f32.wgsl b/test/expressions/binary/sub/mat3x3-mat3x3/f32.wgsl
index 4dec34d..1d90779 100644
--- a/test/expressions/binary/sub/mat3x3-mat3x3/f32.wgsl
+++ b/test/expressions/binary/sub/mat3x3-mat3x3/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = mat3x3<f32>(vec3<f32>( 1.,  2.,  3.), vec3<f32>( 4.,  5.,  6.), vec3<f32>( 7.,  8.,  9.));
     let b = mat3x3<f32>(vec3<f32>(-1., -2., -3.), vec3<f32>(-4., -5., -6.), vec3<f32>(-7., -8., -9.));
diff --git a/test/expressions/binary/sub/mat3x3-mat3x3/f32.wgsl.expected.wgsl b/test/expressions/binary/sub/mat3x3-mat3x3/f32.wgsl.expected.wgsl
index 5003fea..d54c2dc 100644
--- a/test/expressions/binary/sub/mat3x3-mat3x3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/sub/mat3x3-mat3x3/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = mat3x3<f32>(vec3<f32>(1.0, 2.0, 3.0), vec3<f32>(4.0, 5.0, 6.0), vec3<f32>(7.0, 8.0, 9.0));
   let b = mat3x3<f32>(vec3<f32>(-1.0, -2.0, -3.0), vec3<f32>(-4.0, -5.0, -6.0), vec3<f32>(-7.0, -8.0, -9.0));
diff --git a/test/expressions/binary/sub/scalar-scalar/f32.wgsl b/test/expressions/binary/sub/scalar-scalar/f32.wgsl
index b0e6359..7aec1fe 100644
--- a/test/expressions/binary/sub/scalar-scalar/f32.wgsl
+++ b/test/expressions/binary/sub/scalar-scalar/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1.;
     let b = 2.;
diff --git a/test/expressions/binary/sub/scalar-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/sub/scalar-scalar/f32.wgsl.expected.wgsl
index ffc19e2..7639858 100644
--- a/test/expressions/binary/sub/scalar-scalar/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/sub/scalar-scalar/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1.0;
   let b = 2.0;
diff --git a/test/expressions/binary/sub/scalar-scalar/i32.wgsl b/test/expressions/binary/sub/scalar-scalar/i32.wgsl
index 7d396dc..93fb7e0 100644
--- a/test/expressions/binary/sub/scalar-scalar/i32.wgsl
+++ b/test/expressions/binary/sub/scalar-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1;
     let b = 2;
diff --git a/test/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.wgsl
index d881d44..9aa9bf3 100644
--- a/test/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/sub/scalar-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1;
   let b = 2;
diff --git a/test/expressions/binary/sub/scalar-scalar/u32.wgsl b/test/expressions/binary/sub/scalar-scalar/u32.wgsl
index 5f210c2..fa75c67 100644
--- a/test/expressions/binary/sub/scalar-scalar/u32.wgsl
+++ b/test/expressions/binary/sub/scalar-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 1u;
     let b = 2u;
diff --git a/test/expressions/binary/sub/scalar-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/sub/scalar-scalar/u32.wgsl.expected.wgsl
index 932d0b7..81cbedd 100644
--- a/test/expressions/binary/sub/scalar-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/sub/scalar-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 1u;
   let b = 2u;
diff --git a/test/expressions/binary/sub/scalar-vec3/f32.wgsl b/test/expressions/binary/sub/scalar-vec3/f32.wgsl
index 1b23e49..8a4a112 100644
--- a/test/expressions/binary/sub/scalar-vec3/f32.wgsl
+++ b/test/expressions/binary/sub/scalar-vec3/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 4.;
     let b = vec3<f32>(1., 2., 3.);
diff --git a/test/expressions/binary/sub/scalar-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/sub/scalar-vec3/f32.wgsl.expected.wgsl
index 69ff882..1404695 100644
--- a/test/expressions/binary/sub/scalar-vec3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/sub/scalar-vec3/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 4.0;
   let b = vec3<f32>(1.0, 2.0, 3.0);
diff --git a/test/expressions/binary/sub/scalar-vec3/i32.wgsl b/test/expressions/binary/sub/scalar-vec3/i32.wgsl
index 1e024c5..8b31299 100644
--- a/test/expressions/binary/sub/scalar-vec3/i32.wgsl
+++ b/test/expressions/binary/sub/scalar-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 4;
     let b = vec3<i32>(1, 2, 3);
diff --git a/test/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.wgsl
index 0efb533..bec3a19 100644
--- a/test/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/sub/scalar-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 4;
   let b = vec3<i32>(1, 2, 3);
diff --git a/test/expressions/binary/sub/scalar-vec3/u32.wgsl b/test/expressions/binary/sub/scalar-vec3/u32.wgsl
index 0042cc2..562719f 100644
--- a/test/expressions/binary/sub/scalar-vec3/u32.wgsl
+++ b/test/expressions/binary/sub/scalar-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = 4u;
     let b = vec3<u32>(1u, 2u, 3u);
diff --git a/test/expressions/binary/sub/scalar-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/sub/scalar-vec3/u32.wgsl.expected.wgsl
index b78efa7..4e1bca9 100644
--- a/test/expressions/binary/sub/scalar-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/sub/scalar-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = 4u;
   let b = vec3<u32>(1u, 2u, 3u);
diff --git a/test/expressions/binary/sub/vec3-scalar/f32.wgsl b/test/expressions/binary/sub/vec3-scalar/f32.wgsl
index 0bdf89e..4b4aced 100644
--- a/test/expressions/binary/sub/vec3-scalar/f32.wgsl
+++ b/test/expressions/binary/sub/vec3-scalar/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<f32>(1., 2., 3.);
     let b = 4.;
diff --git a/test/expressions/binary/sub/vec3-scalar/f32.wgsl.expected.wgsl b/test/expressions/binary/sub/vec3-scalar/f32.wgsl.expected.wgsl
index de0d72d..169e9db 100644
--- a/test/expressions/binary/sub/vec3-scalar/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/sub/vec3-scalar/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<f32>(1.0, 2.0, 3.0);
   let b = 4.0;
diff --git a/test/expressions/binary/sub/vec3-scalar/i32.wgsl b/test/expressions/binary/sub/vec3-scalar/i32.wgsl
index 0fab83f..e12a2ba 100644
--- a/test/expressions/binary/sub/vec3-scalar/i32.wgsl
+++ b/test/expressions/binary/sub/vec3-scalar/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<i32>(1, 2, 3);
     let b = 4;
diff --git a/test/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.wgsl b/test/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.wgsl
index ea16bd4..003acfa 100644
--- a/test/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/sub/vec3-scalar/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<i32>(1, 2, 3);
   let b = 4;
diff --git a/test/expressions/binary/sub/vec3-scalar/u32.wgsl b/test/expressions/binary/sub/vec3-scalar/u32.wgsl
index 0ec4317..f5e4e5a 100644
--- a/test/expressions/binary/sub/vec3-scalar/u32.wgsl
+++ b/test/expressions/binary/sub/vec3-scalar/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<u32>(1u, 2u, 3u);
     let b = 4u;
diff --git a/test/expressions/binary/sub/vec3-scalar/u32.wgsl.expected.wgsl b/test/expressions/binary/sub/vec3-scalar/u32.wgsl.expected.wgsl
index 2052d8b..9b9c0de 100644
--- a/test/expressions/binary/sub/vec3-scalar/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/sub/vec3-scalar/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<u32>(1u, 2u, 3u);
   let b = 4u;
diff --git a/test/expressions/binary/sub/vec3-vec3/f32.wgsl b/test/expressions/binary/sub/vec3-vec3/f32.wgsl
index 3bb31cf..cea0bb7 100644
--- a/test/expressions/binary/sub/vec3-vec3/f32.wgsl
+++ b/test/expressions/binary/sub/vec3-vec3/f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<f32>(1., 2., 3.);
     let b = vec3<f32>(4., 5., 6.);
diff --git a/test/expressions/binary/sub/vec3-vec3/f32.wgsl.expected.wgsl b/test/expressions/binary/sub/vec3-vec3/f32.wgsl.expected.wgsl
index 8beb881..6075405 100644
--- a/test/expressions/binary/sub/vec3-vec3/f32.wgsl.expected.wgsl
+++ b/test/expressions/binary/sub/vec3-vec3/f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<f32>(1.0, 2.0, 3.0);
   let b = vec3<f32>(4.0, 5.0, 6.0);
diff --git a/test/expressions/binary/sub/vec3-vec3/i32.wgsl b/test/expressions/binary/sub/vec3-vec3/i32.wgsl
index 7ecdc45..2ab7275 100644
--- a/test/expressions/binary/sub/vec3-vec3/i32.wgsl
+++ b/test/expressions/binary/sub/vec3-vec3/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<i32>(1, 2, 3);
     let b = vec3<i32>(4, 5, 6);
diff --git a/test/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.wgsl b/test/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.wgsl
index 00ff109..a5b306b 100644
--- a/test/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/binary/sub/vec3-vec3/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<i32>(1, 2, 3);
   let b = vec3<i32>(4, 5, 6);
diff --git a/test/expressions/binary/sub/vec3-vec3/u32.wgsl b/test/expressions/binary/sub/vec3-vec3/u32.wgsl
index 547383e..cb59c1f 100644
--- a/test/expressions/binary/sub/vec3-vec3/u32.wgsl
+++ b/test/expressions/binary/sub/vec3-vec3/u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a = vec3<u32>(1u, 2u, 3u);
     let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/binary/sub/vec3-vec3/u32.wgsl.expected.wgsl b/test/expressions/binary/sub/vec3-vec3/u32.wgsl.expected.wgsl
index 7559a1b..dea4cfe 100644
--- a/test/expressions/binary/sub/vec3-vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/binary/sub/vec3-vec3/u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a = vec3<u32>(1u, 2u, 3u);
   let b = vec3<u32>(4u, 5u, 6u);
diff --git a/test/expressions/bitcast/scalar/f32-f32.wgsl b/test/expressions/bitcast/scalar/f32-f32.wgsl
index a91bec0..0e7b8ba 100644
--- a/test/expressions/bitcast/scalar/f32-f32.wgsl
+++ b/test/expressions/bitcast/scalar/f32-f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a : f32 = 1.;
     let b : f32 = bitcast<f32>(a);
diff --git a/test/expressions/bitcast/scalar/f32-f32.wgsl.expected.wgsl b/test/expressions/bitcast/scalar/f32-f32.wgsl.expected.wgsl
index 1d57da4..ac6a874 100644
--- a/test/expressions/bitcast/scalar/f32-f32.wgsl.expected.wgsl
+++ b/test/expressions/bitcast/scalar/f32-f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a : f32 = 1.0;
   let b : f32 = bitcast<f32>(a);
diff --git a/test/expressions/bitcast/scalar/f32-i32.wgsl b/test/expressions/bitcast/scalar/f32-i32.wgsl
index c54ab72..91c3d8f 100644
--- a/test/expressions/bitcast/scalar/f32-i32.wgsl
+++ b/test/expressions/bitcast/scalar/f32-i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a : f32 = 1.;
     let b : i32 = bitcast<i32>(a);
diff --git a/test/expressions/bitcast/scalar/f32-i32.wgsl.expected.wgsl b/test/expressions/bitcast/scalar/f32-i32.wgsl.expected.wgsl
index 331cca2..81e6fa6 100644
--- a/test/expressions/bitcast/scalar/f32-i32.wgsl.expected.wgsl
+++ b/test/expressions/bitcast/scalar/f32-i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a : f32 = 1.0;
   let b : i32 = bitcast<i32>(a);
diff --git a/test/expressions/bitcast/scalar/f32-u32.wgsl b/test/expressions/bitcast/scalar/f32-u32.wgsl
index 0d79999..6f33d5a 100644
--- a/test/expressions/bitcast/scalar/f32-u32.wgsl
+++ b/test/expressions/bitcast/scalar/f32-u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a : f32 = 1.;
     let b : u32 = bitcast<u32>(a);
diff --git a/test/expressions/bitcast/scalar/f32-u32.wgsl.expected.wgsl b/test/expressions/bitcast/scalar/f32-u32.wgsl.expected.wgsl
index e52e25e..c230fb8 100644
--- a/test/expressions/bitcast/scalar/f32-u32.wgsl.expected.wgsl
+++ b/test/expressions/bitcast/scalar/f32-u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a : f32 = 1.0;
   let b : u32 = bitcast<u32>(a);
diff --git a/test/expressions/bitcast/scalar/i32-f32.wgsl b/test/expressions/bitcast/scalar/i32-f32.wgsl
index f398e96..00a8099 100644
--- a/test/expressions/bitcast/scalar/i32-f32.wgsl
+++ b/test/expressions/bitcast/scalar/i32-f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a : i32 = 1;
     let b : f32 = bitcast<f32>(a);
diff --git a/test/expressions/bitcast/scalar/i32-f32.wgsl.expected.wgsl b/test/expressions/bitcast/scalar/i32-f32.wgsl.expected.wgsl
index 9471a56..1aae69a 100644
--- a/test/expressions/bitcast/scalar/i32-f32.wgsl.expected.wgsl
+++ b/test/expressions/bitcast/scalar/i32-f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a : i32 = 1;
   let b : f32 = bitcast<f32>(a);
diff --git a/test/expressions/bitcast/scalar/i32-i32.wgsl b/test/expressions/bitcast/scalar/i32-i32.wgsl
index eaacdd1..282e218 100644
--- a/test/expressions/bitcast/scalar/i32-i32.wgsl
+++ b/test/expressions/bitcast/scalar/i32-i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a : i32 = 1;
     let b : i32 = bitcast<i32>(a);
diff --git a/test/expressions/bitcast/scalar/i32-i32.wgsl.expected.wgsl b/test/expressions/bitcast/scalar/i32-i32.wgsl.expected.wgsl
index ed26420..9ecbee50 100644
--- a/test/expressions/bitcast/scalar/i32-i32.wgsl.expected.wgsl
+++ b/test/expressions/bitcast/scalar/i32-i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a : i32 = 1;
   let b : i32 = bitcast<i32>(a);
diff --git a/test/expressions/bitcast/scalar/i32-u32.wgsl b/test/expressions/bitcast/scalar/i32-u32.wgsl
index f11e65d..ebb81b4 100644
--- a/test/expressions/bitcast/scalar/i32-u32.wgsl
+++ b/test/expressions/bitcast/scalar/i32-u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a : i32 = 1;
     let b : u32 = bitcast<u32>(a);
diff --git a/test/expressions/bitcast/scalar/i32-u32.wgsl.expected.wgsl b/test/expressions/bitcast/scalar/i32-u32.wgsl.expected.wgsl
index 6c7b9f9..cb8e316 100644
--- a/test/expressions/bitcast/scalar/i32-u32.wgsl.expected.wgsl
+++ b/test/expressions/bitcast/scalar/i32-u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a : i32 = 1;
   let b : u32 = bitcast<u32>(a);
diff --git a/test/expressions/bitcast/scalar/i32min-u32.wgsl b/test/expressions/bitcast/scalar/i32min-u32.wgsl
index 9812c83..de57788 100644
--- a/test/expressions/bitcast/scalar/i32min-u32.wgsl
+++ b/test/expressions/bitcast/scalar/i32min-u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let b : u32 = bitcast<u32>(-2147483648);
 }
diff --git a/test/expressions/bitcast/scalar/i32min-u32.wgsl.expected.wgsl b/test/expressions/bitcast/scalar/i32min-u32.wgsl.expected.wgsl
index 9812c83..de57788 100644
--- a/test/expressions/bitcast/scalar/i32min-u32.wgsl.expected.wgsl
+++ b/test/expressions/bitcast/scalar/i32min-u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let b : u32 = bitcast<u32>(-2147483648);
 }
diff --git a/test/expressions/bitcast/scalar/u32-f32.wgsl b/test/expressions/bitcast/scalar/u32-f32.wgsl
index 82c62b7..c196d83 100644
--- a/test/expressions/bitcast/scalar/u32-f32.wgsl
+++ b/test/expressions/bitcast/scalar/u32-f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a : u32 = 1u;
     let b : f32 = bitcast<f32>(a);
diff --git a/test/expressions/bitcast/scalar/u32-f32.wgsl.expected.wgsl b/test/expressions/bitcast/scalar/u32-f32.wgsl.expected.wgsl
index 9efbcfd..7c0cb22 100644
--- a/test/expressions/bitcast/scalar/u32-f32.wgsl.expected.wgsl
+++ b/test/expressions/bitcast/scalar/u32-f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a : u32 = 1u;
   let b : f32 = bitcast<f32>(a);
diff --git a/test/expressions/bitcast/scalar/u32-i32.wgsl b/test/expressions/bitcast/scalar/u32-i32.wgsl
index 91b4230..9d6785a 100644
--- a/test/expressions/bitcast/scalar/u32-i32.wgsl
+++ b/test/expressions/bitcast/scalar/u32-i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a : u32 = 1u;
     let b : i32 = bitcast<i32>(a);
diff --git a/test/expressions/bitcast/scalar/u32-i32.wgsl.expected.wgsl b/test/expressions/bitcast/scalar/u32-i32.wgsl.expected.wgsl
index 9ac119d..4d8f585 100644
--- a/test/expressions/bitcast/scalar/u32-i32.wgsl.expected.wgsl
+++ b/test/expressions/bitcast/scalar/u32-i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a : u32 = 1u;
   let b : i32 = bitcast<i32>(a);
diff --git a/test/expressions/bitcast/scalar/u32-u32.wgsl b/test/expressions/bitcast/scalar/u32-u32.wgsl
index ceddfa2..35f0a23 100644
--- a/test/expressions/bitcast/scalar/u32-u32.wgsl
+++ b/test/expressions/bitcast/scalar/u32-u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a : u32 = 1u;
     let b : u32 = bitcast<u32>(a);
diff --git a/test/expressions/bitcast/scalar/u32-u32.wgsl.expected.wgsl b/test/expressions/bitcast/scalar/u32-u32.wgsl.expected.wgsl
index 4fde963..45c6de7 100644
--- a/test/expressions/bitcast/scalar/u32-u32.wgsl.expected.wgsl
+++ b/test/expressions/bitcast/scalar/u32-u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a : u32 = 1u;
   let b : u32 = bitcast<u32>(a);
diff --git a/test/expressions/bitcast/vector/f32-f32.wgsl b/test/expressions/bitcast/vector/f32-f32.wgsl
index 2e863d3..8842275 100644
--- a/test/expressions/bitcast/vector/f32-f32.wgsl
+++ b/test/expressions/bitcast/vector/f32-f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a : vec3<f32> = vec3<f32>(1., 2., 3.);
     let b : vec3<f32> = bitcast<vec3<f32>>(a);
diff --git a/test/expressions/bitcast/vector/f32-f32.wgsl.expected.wgsl b/test/expressions/bitcast/vector/f32-f32.wgsl.expected.wgsl
index 5ed2541..1af19c7 100644
--- a/test/expressions/bitcast/vector/f32-f32.wgsl.expected.wgsl
+++ b/test/expressions/bitcast/vector/f32-f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a : vec3<f32> = vec3<f32>(1.0, 2.0, 3.0);
   let b : vec3<f32> = bitcast<vec3<f32>>(a);
diff --git a/test/expressions/bitcast/vector/f32-i32.wgsl b/test/expressions/bitcast/vector/f32-i32.wgsl
index 493dddd..69a8ee6 100644
--- a/test/expressions/bitcast/vector/f32-i32.wgsl
+++ b/test/expressions/bitcast/vector/f32-i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a : vec3<f32> = vec3<f32>(1., 2., 3.);
     let b : vec3<i32> = bitcast<vec3<i32>>(a);
diff --git a/test/expressions/bitcast/vector/f32-i32.wgsl.expected.wgsl b/test/expressions/bitcast/vector/f32-i32.wgsl.expected.wgsl
index e4363c8..6f7c20e 100644
--- a/test/expressions/bitcast/vector/f32-i32.wgsl.expected.wgsl
+++ b/test/expressions/bitcast/vector/f32-i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a : vec3<f32> = vec3<f32>(1.0, 2.0, 3.0);
   let b : vec3<i32> = bitcast<vec3<i32>>(a);
diff --git a/test/expressions/bitcast/vector/f32-u32.wgsl b/test/expressions/bitcast/vector/f32-u32.wgsl
index 7daf410..c478dc8 100644
--- a/test/expressions/bitcast/vector/f32-u32.wgsl
+++ b/test/expressions/bitcast/vector/f32-u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a : vec3<f32> = vec3<f32>(1., 2., 3.);
     let b : vec3<u32> = bitcast<vec3<u32>>(a);
diff --git a/test/expressions/bitcast/vector/f32-u32.wgsl.expected.wgsl b/test/expressions/bitcast/vector/f32-u32.wgsl.expected.wgsl
index 6cd21fa..d47bade 100644
--- a/test/expressions/bitcast/vector/f32-u32.wgsl.expected.wgsl
+++ b/test/expressions/bitcast/vector/f32-u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a : vec3<f32> = vec3<f32>(1.0, 2.0, 3.0);
   let b : vec3<u32> = bitcast<vec3<u32>>(a);
diff --git a/test/expressions/bitcast/vector/i32-f32.wgsl b/test/expressions/bitcast/vector/i32-f32.wgsl
index e3bc280..7fa9e52 100644
--- a/test/expressions/bitcast/vector/i32-f32.wgsl
+++ b/test/expressions/bitcast/vector/i32-f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a : vec3<i32> = vec3<i32>(1, 2, 3);
     let b : vec3<f32> = bitcast<vec3<f32>>(a);
diff --git a/test/expressions/bitcast/vector/i32-f32.wgsl.expected.wgsl b/test/expressions/bitcast/vector/i32-f32.wgsl.expected.wgsl
index a7a19ea..424988d 100644
--- a/test/expressions/bitcast/vector/i32-f32.wgsl.expected.wgsl
+++ b/test/expressions/bitcast/vector/i32-f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a : vec3<i32> = vec3<i32>(1, 2, 3);
   let b : vec3<f32> = bitcast<vec3<f32>>(a);
diff --git a/test/expressions/bitcast/vector/i32-i32.wgsl b/test/expressions/bitcast/vector/i32-i32.wgsl
index 3149395..1b332c6 100644
--- a/test/expressions/bitcast/vector/i32-i32.wgsl
+++ b/test/expressions/bitcast/vector/i32-i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a : vec3<i32> = vec3<i32>(1, 2, 3);
     let b : vec3<i32> = bitcast<vec3<i32>>(a);
diff --git a/test/expressions/bitcast/vector/i32-i32.wgsl.expected.wgsl b/test/expressions/bitcast/vector/i32-i32.wgsl.expected.wgsl
index 94f3acd..b77a8bf 100644
--- a/test/expressions/bitcast/vector/i32-i32.wgsl.expected.wgsl
+++ b/test/expressions/bitcast/vector/i32-i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a : vec3<i32> = vec3<i32>(1, 2, 3);
   let b : vec3<i32> = bitcast<vec3<i32>>(a);
diff --git a/test/expressions/bitcast/vector/i32-u32.wgsl b/test/expressions/bitcast/vector/i32-u32.wgsl
index e3cf1fa..f60a904 100644
--- a/test/expressions/bitcast/vector/i32-u32.wgsl
+++ b/test/expressions/bitcast/vector/i32-u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a : vec3<i32> = vec3<i32>(1, 2, 3);
     let b : vec3<u32> = bitcast<vec3<u32>>(a);
diff --git a/test/expressions/bitcast/vector/i32-u32.wgsl.expected.wgsl b/test/expressions/bitcast/vector/i32-u32.wgsl.expected.wgsl
index 64dd507..a0d6f73 100644
--- a/test/expressions/bitcast/vector/i32-u32.wgsl.expected.wgsl
+++ b/test/expressions/bitcast/vector/i32-u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a : vec3<i32> = vec3<i32>(1, 2, 3);
   let b : vec3<u32> = bitcast<vec3<u32>>(a);
diff --git a/test/expressions/bitcast/vector/u32-f32.wgsl b/test/expressions/bitcast/vector/u32-f32.wgsl
index 4323361..76adfdd 100644
--- a/test/expressions/bitcast/vector/u32-f32.wgsl
+++ b/test/expressions/bitcast/vector/u32-f32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a : vec3<u32> = vec3<u32>(1u, 2u, 3u);
     let b : vec3<f32> = bitcast<vec3<f32>>(a);
diff --git a/test/expressions/bitcast/vector/u32-f32.wgsl.expected.wgsl b/test/expressions/bitcast/vector/u32-f32.wgsl.expected.wgsl
index e74cdd3..dd4b3a3 100644
--- a/test/expressions/bitcast/vector/u32-f32.wgsl.expected.wgsl
+++ b/test/expressions/bitcast/vector/u32-f32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a : vec3<u32> = vec3<u32>(1u, 2u, 3u);
   let b : vec3<f32> = bitcast<vec3<f32>>(a);
diff --git a/test/expressions/bitcast/vector/u32-i32.wgsl b/test/expressions/bitcast/vector/u32-i32.wgsl
index 6efefc3..9ae5c29 100644
--- a/test/expressions/bitcast/vector/u32-i32.wgsl
+++ b/test/expressions/bitcast/vector/u32-i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a : vec3<u32> = vec3<u32>(1u, 2u, 3u);
     let b : vec3<i32> = bitcast<vec3<i32>>(a);
diff --git a/test/expressions/bitcast/vector/u32-i32.wgsl.expected.wgsl b/test/expressions/bitcast/vector/u32-i32.wgsl.expected.wgsl
index db1bd62..7291ade 100644
--- a/test/expressions/bitcast/vector/u32-i32.wgsl.expected.wgsl
+++ b/test/expressions/bitcast/vector/u32-i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a : vec3<u32> = vec3<u32>(1u, 2u, 3u);
   let b : vec3<i32> = bitcast<vec3<i32>>(a);
diff --git a/test/expressions/bitcast/vector/u32-u32.wgsl b/test/expressions/bitcast/vector/u32-u32.wgsl
index 99d2211..277597d 100644
--- a/test/expressions/bitcast/vector/u32-u32.wgsl
+++ b/test/expressions/bitcast/vector/u32-u32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let a : vec3<u32> = vec3<u32>(1u, 2u, 3u);
     let b : vec3<u32> = bitcast<vec3<u32>>(a);
diff --git a/test/expressions/bitcast/vector/u32-u32.wgsl.expected.wgsl b/test/expressions/bitcast/vector/u32-u32.wgsl.expected.wgsl
index 6bad22d..86d9265 100644
--- a/test/expressions/bitcast/vector/u32-u32.wgsl.expected.wgsl
+++ b/test/expressions/bitcast/vector/u32-u32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let a : vec3<u32> = vec3<u32>(1u, 2u, 3u);
   let b : vec3<u32> = bitcast<vec3<u32>>(a);
diff --git a/test/expressions/literals/-inf.spvasm.expected.wgsl b/test/expressions/literals/-inf.spvasm.expected.wgsl
index 60e7281..738effc 100644
--- a/test/expressions/literals/-inf.spvasm.expected.wgsl
+++ b/test/expressions/literals/-inf.spvasm.expected.wgsl
@@ -6,11 +6,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   out_var_SV_TARGET_1 : vec4<f32>;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(out_var_SV_TARGET);
diff --git a/test/expressions/literals/inf.spvasm.expected.wgsl b/test/expressions/literals/inf.spvasm.expected.wgsl
index 0389b98..9fc866d 100644
--- a/test/expressions/literals/inf.spvasm.expected.wgsl
+++ b/test/expressions/literals/inf.spvasm.expected.wgsl
@@ -6,11 +6,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   out_var_SV_TARGET_1 : vec4<f32>;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(out_var_SV_TARGET);
diff --git a/test/expressions/literals/nan.spvasm.expected.wgsl b/test/expressions/literals/nan.spvasm.expected.wgsl
index 816c89e..a53b01d 100644
--- a/test/expressions/literals/nan.spvasm.expected.wgsl
+++ b/test/expressions/literals/nan.spvasm.expected.wgsl
@@ -6,11 +6,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   out_var_SV_TARGET_1 : vec4<f32>;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(out_var_SV_TARGET);
diff --git a/test/expressions/swizzle/read/packed_vec3/f32.wgsl b/test/expressions/swizzle/read/packed_vec3/f32.wgsl
index dd4826a..cb779ee 100644
--- a/test/expressions/swizzle/read/packed_vec3/f32.wgsl
+++ b/test/expressions/swizzle/read/packed_vec3/f32.wgsl
@@ -2,7 +2,7 @@
     v: vec3<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> U : S;
+@group(0) @binding(0) var<uniform> U : S;
 
 fn f() {
     var    v = U.v;
diff --git a/test/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.wgsl b/test/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.wgsl
index 727788b..1f87362 100644
--- a/test/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.wgsl
+++ b/test/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   v : vec3<f32>;
 }
 
-[[group(0), binding(0)]] var<uniform> U : S;
+@group(0) @binding(0) var<uniform> U : S;
 
 fn f() {
   var v = U.v;
diff --git a/test/expressions/swizzle/read/packed_vec3/i32.wgsl b/test/expressions/swizzle/read/packed_vec3/i32.wgsl
index b81d0dd..6780f9f 100644
--- a/test/expressions/swizzle/read/packed_vec3/i32.wgsl
+++ b/test/expressions/swizzle/read/packed_vec3/i32.wgsl
@@ -2,7 +2,7 @@
     v: vec3<i32>;
 };
 
-[[group(0), binding(0)]] var<uniform> U : S;
+@group(0) @binding(0) var<uniform> U : S;
 
 fn f() {
     var    v = U.v;
diff --git a/test/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.wgsl b/test/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.wgsl
index dffd20c..a79daa4 100644
--- a/test/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   v : vec3<i32>;
 }
 
-[[group(0), binding(0)]] var<uniform> U : S;
+@group(0) @binding(0) var<uniform> U : S;
 
 fn f() {
   var v = U.v;
diff --git a/test/expressions/swizzle/read/packed_vec3/u32.wgsl b/test/expressions/swizzle/read/packed_vec3/u32.wgsl
index d0497a6..afd1fa5 100644
--- a/test/expressions/swizzle/read/packed_vec3/u32.wgsl
+++ b/test/expressions/swizzle/read/packed_vec3/u32.wgsl
@@ -2,7 +2,7 @@
     v: vec3<u32>;
 };
 
-[[group(0), binding(0)]] var<uniform> U : S;
+@group(0) @binding(0) var<uniform> U : S;
 
 fn f() {
     var    v = U.v;
diff --git a/test/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.wgsl b/test/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.wgsl
index 36bf160..836c617 100644
--- a/test/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   v : vec3<u32>;
 }
 
-[[group(0), binding(0)]] var<uniform> U : S;
+@group(0) @binding(0) var<uniform> U : S;
 
 fn f() {
   var v = U.v;
diff --git a/test/expressions/swizzle/write/packed_vec3/f32.wgsl b/test/expressions/swizzle/write/packed_vec3/f32.wgsl
index 9a194ea..623d785 100644
--- a/test/expressions/swizzle/write/packed_vec3/f32.wgsl
+++ b/test/expressions/swizzle/write/packed_vec3/f32.wgsl
@@ -2,7 +2,7 @@
     v: vec3<f32>;
 };
 
-[[group(0), binding(0)]] var<storage, read_write> U : S;
+@group(0) @binding(0) var<storage, read_write> U : S;
 
 fn f() {
     U.v = vec3<f32>(1.0, 2.0, 3.0);
diff --git a/test/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.wgsl b/test/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.wgsl
index 84f2ef9..b5f5abc 100644
--- a/test/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.wgsl
+++ b/test/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   v : vec3<f32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> U : S;
+@group(0) @binding(0) var<storage, read_write> U : S;
 
 fn f() {
   U.v = vec3<f32>(1.0, 2.0, 3.0);
diff --git a/test/expressions/swizzle/write/packed_vec3/i32.wgsl b/test/expressions/swizzle/write/packed_vec3/i32.wgsl
index 2880622..5441f0a 100644
--- a/test/expressions/swizzle/write/packed_vec3/i32.wgsl
+++ b/test/expressions/swizzle/write/packed_vec3/i32.wgsl
@@ -2,7 +2,7 @@
     v: vec3<i32>;
 };
 
-[[group(0), binding(0)]] var<storage, read_write> U : S;
+@group(0) @binding(0) var<storage, read_write> U : S;
 
 fn f() {
     U.v = vec3<i32>(1, 2, 3);
diff --git a/test/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.wgsl b/test/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.wgsl
index a017589..762409a 100644
--- a/test/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.wgsl
+++ b/test/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   v : vec3<i32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> U : S;
+@group(0) @binding(0) var<storage, read_write> U : S;
 
 fn f() {
   U.v = vec3<i32>(1, 2, 3);
diff --git a/test/expressions/swizzle/write/packed_vec3/u32.wgsl b/test/expressions/swizzle/write/packed_vec3/u32.wgsl
index 4dd1bfd..0a3ee66 100644
--- a/test/expressions/swizzle/write/packed_vec3/u32.wgsl
+++ b/test/expressions/swizzle/write/packed_vec3/u32.wgsl
@@ -2,7 +2,7 @@
     v: vec3<u32>;
 };
 
-[[group(0), binding(0)]] var<storage, read_write> U : S;
+@group(0) @binding(0) var<storage, read_write> U : S;
 
 fn f() {
     U.v = vec3<u32>(1u, 2u, 3u);
diff --git a/test/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.wgsl b/test/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.wgsl
index b9c4866..e87b551 100644
--- a/test/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.wgsl
+++ b/test/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   v : vec3<u32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> U : S;
+@group(0) @binding(0) var<storage, read_write> U : S;
 
 fn f() {
   U.v = vec3<u32>(1u, 2u, 3u);
diff --git a/test/intrinsics/arrayLength/complex_via_let.wgsl b/test/intrinsics/arrayLength/complex_via_let.wgsl
index 4b3a76d..76dd5a2 100644
--- a/test/intrinsics/arrayLength/complex_via_let.wgsl
+++ b/test/intrinsics/arrayLength/complex_via_let.wgsl
@@ -2,9 +2,9 @@
     a : array<i32>;
 };
 
-[[group(0), binding(0)]] var<storage, read> G : S;
+@group(0) @binding(0) var<storage, read> G : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     let p = &G;
     let p2 = &((*p).a);
diff --git a/test/intrinsics/arrayLength/complex_via_let.wgsl.expected.wgsl b/test/intrinsics/arrayLength/complex_via_let.wgsl.expected.wgsl
index 1dcc7b1..3701b01 100644
--- a/test/intrinsics/arrayLength/complex_via_let.wgsl.expected.wgsl
+++ b/test/intrinsics/arrayLength/complex_via_let.wgsl.expected.wgsl
@@ -2,9 +2,9 @@
   a : array<i32>;
 }
 
-[[group(0), binding(0)]] var<storage, read> G : S;
+@group(0) @binding(0) var<storage, read> G : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let p = &(G);
   let p2 = &((*(p)).a);
diff --git a/test/intrinsics/arrayLength/complex_via_let_no_struct.wgsl b/test/intrinsics/arrayLength/complex_via_let_no_struct.wgsl
index 2e2966d..8626dee 100644
--- a/test/intrinsics/arrayLength/complex_via_let_no_struct.wgsl
+++ b/test/intrinsics/arrayLength/complex_via_let_no_struct.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var<storage, read> G : array<i32>;
+@group(0) @binding(0) var<storage, read> G : array<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     let p = &G;
     let p2 = &(*p);
diff --git a/test/intrinsics/arrayLength/complex_via_let_no_struct.wgsl.expected.wgsl b/test/intrinsics/arrayLength/complex_via_let_no_struct.wgsl.expected.wgsl
index 56b0e0a..2d06902 100644
--- a/test/intrinsics/arrayLength/complex_via_let_no_struct.wgsl.expected.wgsl
+++ b/test/intrinsics/arrayLength/complex_via_let_no_struct.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var<storage, read> G : array<i32>;
+@group(0) @binding(0) var<storage, read> G : array<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let p = &(G);
   let p2 = &(*(p));
diff --git a/test/intrinsics/arrayLength/deprecated.wgsl b/test/intrinsics/arrayLength/deprecated.wgsl
index c3381aa..ce9d77c 100644
--- a/test/intrinsics/arrayLength/deprecated.wgsl
+++ b/test/intrinsics/arrayLength/deprecated.wgsl
@@ -2,9 +2,9 @@
     a : array<i32>;
 };
 
-[[group(0), binding(0)]] var<storage, read> G : S;
+@group(0) @binding(0) var<storage, read> G : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     let l1 : u32 = arrayLength(&G.a);
 
diff --git a/test/intrinsics/arrayLength/deprecated.wgsl.expected.wgsl b/test/intrinsics/arrayLength/deprecated.wgsl.expected.wgsl
index 5489c10..2cc825e 100644
--- a/test/intrinsics/arrayLength/deprecated.wgsl.expected.wgsl
+++ b/test/intrinsics/arrayLength/deprecated.wgsl.expected.wgsl
@@ -2,9 +2,9 @@
   a : array<i32>;
 }
 
-[[group(0), binding(0)]] var<storage, read> G : S;
+@group(0) @binding(0) var<storage, read> G : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let l1 : u32 = arrayLength(&(G.a));
   let p = &(G.a);
diff --git a/test/intrinsics/arrayLength/simple.wgsl b/test/intrinsics/arrayLength/simple.wgsl
index d3cba2a..95037fe 100644
--- a/test/intrinsics/arrayLength/simple.wgsl
+++ b/test/intrinsics/arrayLength/simple.wgsl
@@ -2,9 +2,9 @@
     a : array<i32>;
 };
 
-[[group(0), binding(0)]] var<storage, read> G : S;
+@group(0) @binding(0) var<storage, read> G : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     let l1 : u32 = arrayLength(&G.a);
 }
diff --git a/test/intrinsics/arrayLength/simple.wgsl.expected.wgsl b/test/intrinsics/arrayLength/simple.wgsl.expected.wgsl
index 9b7d049..f9fdd91 100644
--- a/test/intrinsics/arrayLength/simple.wgsl.expected.wgsl
+++ b/test/intrinsics/arrayLength/simple.wgsl.expected.wgsl
@@ -2,9 +2,9 @@
   a : array<i32>;
 }
 
-[[group(0), binding(0)]] var<storage, read> G : S;
+@group(0) @binding(0) var<storage, read> G : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let l1 : u32 = arrayLength(&(G.a));
 }
diff --git a/test/intrinsics/arrayLength/simple_no_struct.wgsl b/test/intrinsics/arrayLength/simple_no_struct.wgsl
index 0fcbfbe..985c87e 100644
--- a/test/intrinsics/arrayLength/simple_no_struct.wgsl
+++ b/test/intrinsics/arrayLength/simple_no_struct.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var<storage, read> G : array<i32>;
+@group(0) @binding(0) var<storage, read> G : array<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     let l1 : u32 = arrayLength(&G);
 }
diff --git a/test/intrinsics/arrayLength/simple_no_struct.wgsl.expected.wgsl b/test/intrinsics/arrayLength/simple_no_struct.wgsl.expected.wgsl
index cbe8d72..b45cd36 100644
--- a/test/intrinsics/arrayLength/simple_no_struct.wgsl.expected.wgsl
+++ b/test/intrinsics/arrayLength/simple_no_struct.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var<storage, read> G : array<i32>;
+@group(0) @binding(0) var<storage, read> G : array<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let l1 : u32 = arrayLength(&(G));
 }
diff --git a/test/intrinsics/arrayLength/via_let.wgsl b/test/intrinsics/arrayLength/via_let.wgsl
index d9d71f5..53e45ba 100644
--- a/test/intrinsics/arrayLength/via_let.wgsl
+++ b/test/intrinsics/arrayLength/via_let.wgsl
@@ -2,9 +2,9 @@
     a : array<i32>;
 };
 
-[[group(0), binding(0)]] var<storage, read> G : S;
+@group(0) @binding(0) var<storage, read> G : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     let p = &G.a;
     let p2 = p;
diff --git a/test/intrinsics/arrayLength/via_let.wgsl.expected.wgsl b/test/intrinsics/arrayLength/via_let.wgsl.expected.wgsl
index 13663f0..25ab694 100644
--- a/test/intrinsics/arrayLength/via_let.wgsl.expected.wgsl
+++ b/test/intrinsics/arrayLength/via_let.wgsl.expected.wgsl
@@ -2,9 +2,9 @@
   a : array<i32>;
 }
 
-[[group(0), binding(0)]] var<storage, read> G : S;
+@group(0) @binding(0) var<storage, read> G : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let p = &(G.a);
   let p2 = p;
diff --git a/test/intrinsics/arrayLength/via_let_complex.wgsl b/test/intrinsics/arrayLength/via_let_complex.wgsl
index 98cfdd4..bd99c11 100644
--- a/test/intrinsics/arrayLength/via_let_complex.wgsl
+++ b/test/intrinsics/arrayLength/via_let_complex.wgsl
@@ -2,9 +2,9 @@
     a : array<i32>;
 };
 
-[[group(0), binding(0)]] var<storage, read> G : S;
+@group(0) @binding(0) var<storage, read> G : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let p = &*&G;
   let p2 = &*p;
diff --git a/test/intrinsics/arrayLength/via_let_complex.wgsl.expected.wgsl b/test/intrinsics/arrayLength/via_let_complex.wgsl.expected.wgsl
index 7b07952..30f059a 100644
--- a/test/intrinsics/arrayLength/via_let_complex.wgsl.expected.wgsl
+++ b/test/intrinsics/arrayLength/via_let_complex.wgsl.expected.wgsl
@@ -2,9 +2,9 @@
   a : array<i32>;
 }
 
-[[group(0), binding(0)]] var<storage, read> G : S;
+@group(0) @binding(0) var<storage, read> G : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let p = &(*(&(G)));
   let p2 = &(*(p));
diff --git a/test/intrinsics/arrayLength/via_let_complex_no_struct.wgsl b/test/intrinsics/arrayLength/via_let_complex_no_struct.wgsl
index 4e8a6c5..dd8beb6 100644
--- a/test/intrinsics/arrayLength/via_let_complex_no_struct.wgsl
+++ b/test/intrinsics/arrayLength/via_let_complex_no_struct.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var<storage, read> G : array<i32>;
+@group(0) @binding(0) var<storage, read> G : array<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let p = &*&G;
   let p2 = &*p;
diff --git a/test/intrinsics/arrayLength/via_let_complex_no_struct.wgsl.expected.wgsl b/test/intrinsics/arrayLength/via_let_complex_no_struct.wgsl.expected.wgsl
index 97964a4..a92b9be 100644
--- a/test/intrinsics/arrayLength/via_let_complex_no_struct.wgsl.expected.wgsl
+++ b/test/intrinsics/arrayLength/via_let_complex_no_struct.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var<storage, read> G : array<i32>;
+@group(0) @binding(0) var<storage, read> G : array<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let p = &(*(&(G)));
   let p2 = &(*(p));
diff --git a/test/intrinsics/arrayLength/via_let_no_struct.wgsl b/test/intrinsics/arrayLength/via_let_no_struct.wgsl
index 83ab810..203f0e0 100644
--- a/test/intrinsics/arrayLength/via_let_no_struct.wgsl
+++ b/test/intrinsics/arrayLength/via_let_no_struct.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var<storage, read> G : array<i32>;
+@group(0) @binding(0) var<storage, read> G : array<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     let p = &G;
     let p2 = p;
diff --git a/test/intrinsics/arrayLength/via_let_no_struct.wgsl.expected.wgsl b/test/intrinsics/arrayLength/via_let_no_struct.wgsl.expected.wgsl
index 731ba0c..3e07603 100644
--- a/test/intrinsics/arrayLength/via_let_no_struct.wgsl.expected.wgsl
+++ b/test/intrinsics/arrayLength/via_let_no_struct.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var<storage, read> G : array<i32>;
+@group(0) @binding(0) var<storage, read> G : array<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let p = &(G);
   let p2 = p;
diff --git a/test/intrinsics/degrees.spvasm.expected.wgsl b/test/intrinsics/degrees.spvasm.expected.wgsl
index a46678b..be5b765 100644
--- a/test/intrinsics/degrees.spvasm.expected.wgsl
+++ b/test/intrinsics/degrees.spvasm.expected.wgsl
@@ -7,7 +7,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/intrinsics/frexp.wgsl b/test/intrinsics/frexp.wgsl
index fed55e5..f4c30d4 100644
--- a/test/intrinsics/frexp.wgsl
+++ b/test/intrinsics/frexp.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     let res = frexp(1.23);
     let exp : i32 = res.exp;
diff --git a/test/intrinsics/frexp.wgsl.expected.wgsl b/test/intrinsics/frexp.wgsl.expected.wgsl
index 519ffb6..50cbd40 100644
--- a/test/intrinsics/frexp.wgsl.expected.wgsl
+++ b/test/intrinsics/frexp.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let res = frexp(1.230000019);
   let exp : i32 = res.exp;
diff --git a/test/intrinsics/gen/abs/002533.wgsl b/test/intrinsics/gen/abs/002533.wgsl
index ca44323..1a7c3f8 100644
--- a/test/intrinsics/gen/abs/002533.wgsl
+++ b/test/intrinsics/gen/abs/002533.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = abs(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_002533();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_002533();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_002533();
 }
diff --git a/test/intrinsics/gen/abs/002533.wgsl.expected.wgsl b/test/intrinsics/gen/abs/002533.wgsl.expected.wgsl
index e9cb96a..8edc059 100644
--- a/test/intrinsics/gen/abs/002533.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/abs/002533.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = abs(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_002533();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_002533();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_002533();
 }
diff --git a/test/intrinsics/gen/abs/005174.wgsl b/test/intrinsics/gen/abs/005174.wgsl
index 4e96bdf..ecbf409 100644
--- a/test/intrinsics/gen/abs/005174.wgsl
+++ b/test/intrinsics/gen/abs/005174.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = abs(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_005174();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_005174();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_005174();
 }
diff --git a/test/intrinsics/gen/abs/005174.wgsl.expected.wgsl b/test/intrinsics/gen/abs/005174.wgsl.expected.wgsl
index 091464d..0675fff 100644
--- a/test/intrinsics/gen/abs/005174.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/abs/005174.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = abs(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_005174();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_005174();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_005174();
 }
diff --git a/test/intrinsics/gen/abs/1ce782.wgsl b/test/intrinsics/gen/abs/1ce782.wgsl
index 8d23e13..7a7666e 100644
--- a/test/intrinsics/gen/abs/1ce782.wgsl
+++ b/test/intrinsics/gen/abs/1ce782.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<u32> = abs(vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_1ce782();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_1ce782();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_1ce782();
 }
diff --git a/test/intrinsics/gen/abs/1ce782.wgsl.expected.wgsl b/test/intrinsics/gen/abs/1ce782.wgsl.expected.wgsl
index dfba5c2..02c1c23 100644
--- a/test/intrinsics/gen/abs/1ce782.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/abs/1ce782.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<u32> = abs(vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_1ce782();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_1ce782();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_1ce782();
 }
diff --git a/test/intrinsics/gen/abs/1e9d53.wgsl b/test/intrinsics/gen/abs/1e9d53.wgsl
index f3c08ae..45cac6d 100644
--- a/test/intrinsics/gen/abs/1e9d53.wgsl
+++ b/test/intrinsics/gen/abs/1e9d53.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = abs(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_1e9d53();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_1e9d53();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_1e9d53();
 }
diff --git a/test/intrinsics/gen/abs/1e9d53.wgsl.expected.wgsl b/test/intrinsics/gen/abs/1e9d53.wgsl.expected.wgsl
index 50413db..ba2ae4b 100644
--- a/test/intrinsics/gen/abs/1e9d53.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/abs/1e9d53.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = abs(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_1e9d53();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_1e9d53();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_1e9d53();
 }
diff --git a/test/intrinsics/gen/abs/467cd1.wgsl b/test/intrinsics/gen/abs/467cd1.wgsl
index 266e0b7..99b46e2 100644
--- a/test/intrinsics/gen/abs/467cd1.wgsl
+++ b/test/intrinsics/gen/abs/467cd1.wgsl
@@ -28,18 +28,18 @@
   var res: u32 = abs(1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_467cd1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_467cd1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_467cd1();
 }
diff --git a/test/intrinsics/gen/abs/467cd1.wgsl.expected.wgsl b/test/intrinsics/gen/abs/467cd1.wgsl.expected.wgsl
index c84d397..0af4141 100644
--- a/test/intrinsics/gen/abs/467cd1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/abs/467cd1.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : u32 = abs(1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_467cd1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_467cd1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_467cd1();
 }
diff --git a/test/intrinsics/gen/abs/4ad288.wgsl b/test/intrinsics/gen/abs/4ad288.wgsl
index 38f639b..b342fa7 100644
--- a/test/intrinsics/gen/abs/4ad288.wgsl
+++ b/test/intrinsics/gen/abs/4ad288.wgsl
@@ -28,18 +28,18 @@
   var res: i32 = abs(1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_4ad288();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_4ad288();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_4ad288();
 }
diff --git a/test/intrinsics/gen/abs/4ad288.wgsl.expected.wgsl b/test/intrinsics/gen/abs/4ad288.wgsl.expected.wgsl
index 4d60d16..e96f644 100644
--- a/test/intrinsics/gen/abs/4ad288.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/abs/4ad288.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : i32 = abs(1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_4ad288();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_4ad288();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_4ad288();
 }
diff --git a/test/intrinsics/gen/abs/5ad50a.wgsl b/test/intrinsics/gen/abs/5ad50a.wgsl
index 1e6c034..8cd6725 100644
--- a/test/intrinsics/gen/abs/5ad50a.wgsl
+++ b/test/intrinsics/gen/abs/5ad50a.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<i32> = abs(vec3<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_5ad50a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_5ad50a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_5ad50a();
 }
diff --git a/test/intrinsics/gen/abs/5ad50a.wgsl.expected.wgsl b/test/intrinsics/gen/abs/5ad50a.wgsl.expected.wgsl
index 067b739..d1cf47f 100644
--- a/test/intrinsics/gen/abs/5ad50a.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/abs/5ad50a.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<i32> = abs(vec3<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_5ad50a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_5ad50a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_5ad50a();
 }
diff --git a/test/intrinsics/gen/abs/7326de.wgsl b/test/intrinsics/gen/abs/7326de.wgsl
index e7e8563..ce2be53 100644
--- a/test/intrinsics/gen/abs/7326de.wgsl
+++ b/test/intrinsics/gen/abs/7326de.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<u32> = abs(vec3<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_7326de();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_7326de();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_7326de();
 }
diff --git a/test/intrinsics/gen/abs/7326de.wgsl.expected.wgsl b/test/intrinsics/gen/abs/7326de.wgsl.expected.wgsl
index 0303cc6..4d07d26 100644
--- a/test/intrinsics/gen/abs/7326de.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/abs/7326de.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<u32> = abs(vec3<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_7326de();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_7326de();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_7326de();
 }
diff --git a/test/intrinsics/gen/abs/7f28e6.wgsl b/test/intrinsics/gen/abs/7f28e6.wgsl
index 0af90f4..cbdeef0 100644
--- a/test/intrinsics/gen/abs/7f28e6.wgsl
+++ b/test/intrinsics/gen/abs/7f28e6.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<u32> = abs(vec2<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_7f28e6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_7f28e6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_7f28e6();
 }
diff --git a/test/intrinsics/gen/abs/7f28e6.wgsl.expected.wgsl b/test/intrinsics/gen/abs/7f28e6.wgsl.expected.wgsl
index 698a0fb..8f83b40 100644
--- a/test/intrinsics/gen/abs/7f28e6.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/abs/7f28e6.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<u32> = abs(vec2<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_7f28e6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_7f28e6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_7f28e6();
 }
diff --git a/test/intrinsics/gen/abs/7faa9e.wgsl b/test/intrinsics/gen/abs/7faa9e.wgsl
index bdc81c0..8b250ee 100644
--- a/test/intrinsics/gen/abs/7faa9e.wgsl
+++ b/test/intrinsics/gen/abs/7faa9e.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<i32> = abs(vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_7faa9e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_7faa9e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_7faa9e();
 }
diff --git a/test/intrinsics/gen/abs/7faa9e.wgsl.expected.wgsl b/test/intrinsics/gen/abs/7faa9e.wgsl.expected.wgsl
index 9929c78..c8e0001 100644
--- a/test/intrinsics/gen/abs/7faa9e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/abs/7faa9e.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<i32> = abs(vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_7faa9e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_7faa9e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_7faa9e();
 }
diff --git a/test/intrinsics/gen/abs/9c80a6.wgsl b/test/intrinsics/gen/abs/9c80a6.wgsl
index ba87252..71ef852 100644
--- a/test/intrinsics/gen/abs/9c80a6.wgsl
+++ b/test/intrinsics/gen/abs/9c80a6.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<i32> = abs(vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_9c80a6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_9c80a6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_9c80a6();
 }
diff --git a/test/intrinsics/gen/abs/9c80a6.wgsl.expected.wgsl b/test/intrinsics/gen/abs/9c80a6.wgsl.expected.wgsl
index c3190a5..6e3519d 100644
--- a/test/intrinsics/gen/abs/9c80a6.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/abs/9c80a6.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<i32> = abs(vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_9c80a6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_9c80a6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_9c80a6();
 }
diff --git a/test/intrinsics/gen/abs/b96037.wgsl b/test/intrinsics/gen/abs/b96037.wgsl
index 5112a85..dddc75e 100644
--- a/test/intrinsics/gen/abs/b96037.wgsl
+++ b/test/intrinsics/gen/abs/b96037.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = abs(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_b96037();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_b96037();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_b96037();
 }
diff --git a/test/intrinsics/gen/abs/b96037.wgsl.expected.wgsl b/test/intrinsics/gen/abs/b96037.wgsl.expected.wgsl
index d5b6041..22c47c2 100644
--- a/test/intrinsics/gen/abs/b96037.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/abs/b96037.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = abs(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   abs_b96037();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   abs_b96037();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   abs_b96037();
 }
diff --git a/test/intrinsics/gen/acos/489247.wgsl b/test/intrinsics/gen/acos/489247.wgsl
index c8251f8..d2f227a 100644
--- a/test/intrinsics/gen/acos/489247.wgsl
+++ b/test/intrinsics/gen/acos/489247.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = acos(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   acos_489247();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   acos_489247();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   acos_489247();
 }
diff --git a/test/intrinsics/gen/acos/489247.wgsl.expected.wgsl b/test/intrinsics/gen/acos/489247.wgsl.expected.wgsl
index a67ffde..d8570fb 100644
--- a/test/intrinsics/gen/acos/489247.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/acos/489247.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = acos(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   acos_489247();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   acos_489247();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   acos_489247();
 }
diff --git a/test/intrinsics/gen/acos/8e2acf.wgsl b/test/intrinsics/gen/acos/8e2acf.wgsl
index 17d366e..e085fae 100644
--- a/test/intrinsics/gen/acos/8e2acf.wgsl
+++ b/test/intrinsics/gen/acos/8e2acf.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = acos(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   acos_8e2acf();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   acos_8e2acf();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   acos_8e2acf();
 }
diff --git a/test/intrinsics/gen/acos/8e2acf.wgsl.expected.wgsl b/test/intrinsics/gen/acos/8e2acf.wgsl.expected.wgsl
index 756d867..c03ab26 100644
--- a/test/intrinsics/gen/acos/8e2acf.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/acos/8e2acf.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = acos(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   acos_8e2acf();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   acos_8e2acf();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   acos_8e2acf();
 }
diff --git a/test/intrinsics/gen/acos/a610c4.wgsl b/test/intrinsics/gen/acos/a610c4.wgsl
index 9d4a273..7f7be34 100644
--- a/test/intrinsics/gen/acos/a610c4.wgsl
+++ b/test/intrinsics/gen/acos/a610c4.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = acos(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   acos_a610c4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   acos_a610c4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   acos_a610c4();
 }
diff --git a/test/intrinsics/gen/acos/a610c4.wgsl.expected.wgsl b/test/intrinsics/gen/acos/a610c4.wgsl.expected.wgsl
index 818b4ba..24807be 100644
--- a/test/intrinsics/gen/acos/a610c4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/acos/a610c4.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = acos(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   acos_a610c4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   acos_a610c4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   acos_a610c4();
 }
diff --git a/test/intrinsics/gen/acos/dfc915.wgsl b/test/intrinsics/gen/acos/dfc915.wgsl
index 1b65a6c..5e27bf8 100644
--- a/test/intrinsics/gen/acos/dfc915.wgsl
+++ b/test/intrinsics/gen/acos/dfc915.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = acos(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   acos_dfc915();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   acos_dfc915();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   acos_dfc915();
 }
diff --git a/test/intrinsics/gen/acos/dfc915.wgsl.expected.wgsl b/test/intrinsics/gen/acos/dfc915.wgsl.expected.wgsl
index 631502c..e16d1ea 100644
--- a/test/intrinsics/gen/acos/dfc915.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/acos/dfc915.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = acos(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   acos_dfc915();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   acos_dfc915();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   acos_dfc915();
 }
diff --git a/test/intrinsics/gen/all/353d6a.wgsl b/test/intrinsics/gen/all/353d6a.wgsl
index cfaab0b..fbfe933 100644
--- a/test/intrinsics/gen/all/353d6a.wgsl
+++ b/test/intrinsics/gen/all/353d6a.wgsl
@@ -28,18 +28,18 @@
   var res: bool = all(bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   all_353d6a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   all_353d6a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   all_353d6a();
 }
diff --git a/test/intrinsics/gen/all/353d6a.wgsl.expected.wgsl b/test/intrinsics/gen/all/353d6a.wgsl.expected.wgsl
index c1da74d..b1ae87d 100644
--- a/test/intrinsics/gen/all/353d6a.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/all/353d6a.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : bool = all(bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   all_353d6a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   all_353d6a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   all_353d6a();
 }
diff --git a/test/intrinsics/gen/all/986c7b.wgsl b/test/intrinsics/gen/all/986c7b.wgsl
index 9f60484..515f3a3 100644
--- a/test/intrinsics/gen/all/986c7b.wgsl
+++ b/test/intrinsics/gen/all/986c7b.wgsl
@@ -28,18 +28,18 @@
   var res: bool = all(vec4<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   all_986c7b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   all_986c7b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   all_986c7b();
 }
diff --git a/test/intrinsics/gen/all/986c7b.wgsl.expected.wgsl b/test/intrinsics/gen/all/986c7b.wgsl.expected.wgsl
index e1242e8..9195321 100644
--- a/test/intrinsics/gen/all/986c7b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/all/986c7b.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : bool = all(vec4<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   all_986c7b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   all_986c7b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   all_986c7b();
 }
diff --git a/test/intrinsics/gen/all/bd2dba.wgsl b/test/intrinsics/gen/all/bd2dba.wgsl
index d098c18..657678f 100644
--- a/test/intrinsics/gen/all/bd2dba.wgsl
+++ b/test/intrinsics/gen/all/bd2dba.wgsl
@@ -28,18 +28,18 @@
   var res: bool = all(vec3<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   all_bd2dba();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   all_bd2dba();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   all_bd2dba();
 }
diff --git a/test/intrinsics/gen/all/bd2dba.wgsl.expected.wgsl b/test/intrinsics/gen/all/bd2dba.wgsl.expected.wgsl
index b527c6b..9ec977d 100644
--- a/test/intrinsics/gen/all/bd2dba.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/all/bd2dba.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : bool = all(vec3<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   all_bd2dba();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   all_bd2dba();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   all_bd2dba();
 }
diff --git a/test/intrinsics/gen/all/f46790.wgsl b/test/intrinsics/gen/all/f46790.wgsl
index c744d5d..875da79 100644
--- a/test/intrinsics/gen/all/f46790.wgsl
+++ b/test/intrinsics/gen/all/f46790.wgsl
@@ -28,18 +28,18 @@
   var res: bool = all(vec2<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   all_f46790();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   all_f46790();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   all_f46790();
 }
diff --git a/test/intrinsics/gen/all/f46790.wgsl.expected.wgsl b/test/intrinsics/gen/all/f46790.wgsl.expected.wgsl
index 3dbfa28..a222bb5 100644
--- a/test/intrinsics/gen/all/f46790.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/all/f46790.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : bool = all(vec2<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   all_f46790();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   all_f46790();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   all_f46790();
 }
diff --git a/test/intrinsics/gen/any/083428.wgsl b/test/intrinsics/gen/any/083428.wgsl
index df698b1..8aecc0f 100644
--- a/test/intrinsics/gen/any/083428.wgsl
+++ b/test/intrinsics/gen/any/083428.wgsl
@@ -28,18 +28,18 @@
   var res: bool = any(vec4<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   any_083428();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   any_083428();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   any_083428();
 }
diff --git a/test/intrinsics/gen/any/083428.wgsl.expected.wgsl b/test/intrinsics/gen/any/083428.wgsl.expected.wgsl
index 12391bd..acd23c8 100644
--- a/test/intrinsics/gen/any/083428.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/any/083428.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : bool = any(vec4<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   any_083428();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   any_083428();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   any_083428();
 }
diff --git a/test/intrinsics/gen/any/0e3e58.wgsl b/test/intrinsics/gen/any/0e3e58.wgsl
index 08998fc..71bda25 100644
--- a/test/intrinsics/gen/any/0e3e58.wgsl
+++ b/test/intrinsics/gen/any/0e3e58.wgsl
@@ -28,18 +28,18 @@
   var res: bool = any(vec2<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   any_0e3e58();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   any_0e3e58();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   any_0e3e58();
 }
diff --git a/test/intrinsics/gen/any/0e3e58.wgsl.expected.wgsl b/test/intrinsics/gen/any/0e3e58.wgsl.expected.wgsl
index d8c6a41..c94d9a1 100644
--- a/test/intrinsics/gen/any/0e3e58.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/any/0e3e58.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : bool = any(vec2<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   any_0e3e58();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   any_0e3e58();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   any_0e3e58();
 }
diff --git a/test/intrinsics/gen/any/2ab91a.wgsl b/test/intrinsics/gen/any/2ab91a.wgsl
index 6eac503..6b6b067 100644
--- a/test/intrinsics/gen/any/2ab91a.wgsl
+++ b/test/intrinsics/gen/any/2ab91a.wgsl
@@ -28,18 +28,18 @@
   var res: bool = any(bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   any_2ab91a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   any_2ab91a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   any_2ab91a();
 }
diff --git a/test/intrinsics/gen/any/2ab91a.wgsl.expected.wgsl b/test/intrinsics/gen/any/2ab91a.wgsl.expected.wgsl
index a672f82..283ab5a 100644
--- a/test/intrinsics/gen/any/2ab91a.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/any/2ab91a.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : bool = any(bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   any_2ab91a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   any_2ab91a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   any_2ab91a();
 }
diff --git a/test/intrinsics/gen/any/e755c1.wgsl b/test/intrinsics/gen/any/e755c1.wgsl
index 4104c37..b27d31a 100644
--- a/test/intrinsics/gen/any/e755c1.wgsl
+++ b/test/intrinsics/gen/any/e755c1.wgsl
@@ -28,18 +28,18 @@
   var res: bool = any(vec3<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   any_e755c1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   any_e755c1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   any_e755c1();
 }
diff --git a/test/intrinsics/gen/any/e755c1.wgsl.expected.wgsl b/test/intrinsics/gen/any/e755c1.wgsl.expected.wgsl
index b8da397..bf47826 100644
--- a/test/intrinsics/gen/any/e755c1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/any/e755c1.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : bool = any(vec3<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   any_e755c1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   any_e755c1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   any_e755c1();
 }
diff --git a/test/intrinsics/gen/arrayLength/1588cd.wgsl b/test/intrinsics/gen/arrayLength/1588cd.wgsl
index f4a4123..727e8bd 100644
--- a/test/intrinsics/gen/arrayLength/1588cd.wgsl
+++ b/test/intrinsics/gen/arrayLength/1588cd.wgsl
@@ -25,25 +25,25 @@
 struct SB_RO {
   arg_0: array<i32>;
 };
-[[group(0), binding(1)]] var<storage, read> sb_ro : SB_RO;
+@group(0) @binding(1) var<storage, read> sb_ro : SB_RO;
 
 // fn arrayLength(ptr<storage, array<i32>, read>) -> u32
 fn arrayLength_1588cd() {
   var res: u32 = arrayLength(&sb_ro.arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   arrayLength_1588cd();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   arrayLength_1588cd();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   arrayLength_1588cd();
 }
diff --git a/test/intrinsics/gen/arrayLength/1588cd.wgsl.expected.wgsl b/test/intrinsics/gen/arrayLength/1588cd.wgsl.expected.wgsl
index 645da49..bbf5a36 100644
--- a/test/intrinsics/gen/arrayLength/1588cd.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/arrayLength/1588cd.wgsl.expected.wgsl
@@ -2,24 +2,24 @@
   arg_0 : array<i32>;
 }
 
-[[group(0), binding(1)]] var<storage, read> sb_ro : SB_RO;
+@group(0) @binding(1) var<storage, read> sb_ro : SB_RO;
 
 fn arrayLength_1588cd() {
   var res : u32 = arrayLength(&(sb_ro.arg_0));
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   arrayLength_1588cd();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   arrayLength_1588cd();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   arrayLength_1588cd();
 }
diff --git a/test/intrinsics/gen/arrayLength/61b1c7.wgsl b/test/intrinsics/gen/arrayLength/61b1c7.wgsl
index 8716a4e..02b7f3d 100644
--- a/test/intrinsics/gen/arrayLength/61b1c7.wgsl
+++ b/test/intrinsics/gen/arrayLength/61b1c7.wgsl
@@ -25,25 +25,25 @@
 struct SB_RW {
   arg_0: array<i32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn arrayLength(ptr<storage, array<i32>, read_write>) -> u32
 fn arrayLength_61b1c7() {
   var res: u32 = arrayLength(&sb_rw.arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   arrayLength_61b1c7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   arrayLength_61b1c7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   arrayLength_61b1c7();
 }
diff --git a/test/intrinsics/gen/arrayLength/61b1c7.wgsl.expected.wgsl b/test/intrinsics/gen/arrayLength/61b1c7.wgsl.expected.wgsl
index f1d33c2..fdd6856 100644
--- a/test/intrinsics/gen/arrayLength/61b1c7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/arrayLength/61b1c7.wgsl.expected.wgsl
@@ -2,24 +2,24 @@
   arg_0 : array<i32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn arrayLength_61b1c7() {
   var res : u32 = arrayLength(&(sb_rw.arg_0));
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   arrayLength_61b1c7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   arrayLength_61b1c7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   arrayLength_61b1c7();
 }
diff --git a/test/intrinsics/gen/arrayLength/a0f5ca.wgsl b/test/intrinsics/gen/arrayLength/a0f5ca.wgsl
index c367b4d..192d288 100644
--- a/test/intrinsics/gen/arrayLength/a0f5ca.wgsl
+++ b/test/intrinsics/gen/arrayLength/a0f5ca.wgsl
@@ -25,25 +25,25 @@
 struct SB_RO {
   arg_0: array<f32>;
 };
-[[group(0), binding(1)]] var<storage, read> sb_ro : SB_RO;
+@group(0) @binding(1) var<storage, read> sb_ro : SB_RO;
 
 // fn arrayLength(ptr<storage, array<f32>, read>) -> u32
 fn arrayLength_a0f5ca() {
   var res: u32 = arrayLength(&sb_ro.arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   arrayLength_a0f5ca();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   arrayLength_a0f5ca();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   arrayLength_a0f5ca();
 }
diff --git a/test/intrinsics/gen/arrayLength/a0f5ca.wgsl.expected.wgsl b/test/intrinsics/gen/arrayLength/a0f5ca.wgsl.expected.wgsl
index 85468b4..d26abde 100644
--- a/test/intrinsics/gen/arrayLength/a0f5ca.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/arrayLength/a0f5ca.wgsl.expected.wgsl
@@ -2,24 +2,24 @@
   arg_0 : array<f32>;
 }
 
-[[group(0), binding(1)]] var<storage, read> sb_ro : SB_RO;
+@group(0) @binding(1) var<storage, read> sb_ro : SB_RO;
 
 fn arrayLength_a0f5ca() {
   var res : u32 = arrayLength(&(sb_ro.arg_0));
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   arrayLength_a0f5ca();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   arrayLength_a0f5ca();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   arrayLength_a0f5ca();
 }
diff --git a/test/intrinsics/gen/arrayLength/cdd123.wgsl b/test/intrinsics/gen/arrayLength/cdd123.wgsl
index cd4b56a..03948a9 100644
--- a/test/intrinsics/gen/arrayLength/cdd123.wgsl
+++ b/test/intrinsics/gen/arrayLength/cdd123.wgsl
@@ -25,25 +25,25 @@
 struct SB_RW {
   arg_0: array<f32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn arrayLength(ptr<storage, array<f32>, read_write>) -> u32
 fn arrayLength_cdd123() {
   var res: u32 = arrayLength(&sb_rw.arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   arrayLength_cdd123();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   arrayLength_cdd123();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   arrayLength_cdd123();
 }
diff --git a/test/intrinsics/gen/arrayLength/cdd123.wgsl.expected.wgsl b/test/intrinsics/gen/arrayLength/cdd123.wgsl.expected.wgsl
index 65a2077..382f356 100644
--- a/test/intrinsics/gen/arrayLength/cdd123.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/arrayLength/cdd123.wgsl.expected.wgsl
@@ -2,24 +2,24 @@
   arg_0 : array<f32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn arrayLength_cdd123() {
   var res : u32 = arrayLength(&(sb_rw.arg_0));
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   arrayLength_cdd123();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   arrayLength_cdd123();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   arrayLength_cdd123();
 }
diff --git a/test/intrinsics/gen/arrayLength/cfca0a.wgsl b/test/intrinsics/gen/arrayLength/cfca0a.wgsl
index c89fb1d..e3f72dd 100644
--- a/test/intrinsics/gen/arrayLength/cfca0a.wgsl
+++ b/test/intrinsics/gen/arrayLength/cfca0a.wgsl
@@ -25,25 +25,25 @@
 struct SB_RO {
   arg_0: array<u32>;
 };
-[[group(0), binding(1)]] var<storage, read> sb_ro : SB_RO;
+@group(0) @binding(1) var<storage, read> sb_ro : SB_RO;
 
 // fn arrayLength(ptr<storage, array<u32>, read>) -> u32
 fn arrayLength_cfca0a() {
   var res: u32 = arrayLength(&sb_ro.arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   arrayLength_cfca0a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   arrayLength_cfca0a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   arrayLength_cfca0a();
 }
diff --git a/test/intrinsics/gen/arrayLength/cfca0a.wgsl.expected.wgsl b/test/intrinsics/gen/arrayLength/cfca0a.wgsl.expected.wgsl
index 8930be0..5780c79 100644
--- a/test/intrinsics/gen/arrayLength/cfca0a.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/arrayLength/cfca0a.wgsl.expected.wgsl
@@ -2,24 +2,24 @@
   arg_0 : array<u32>;
 }
 
-[[group(0), binding(1)]] var<storage, read> sb_ro : SB_RO;
+@group(0) @binding(1) var<storage, read> sb_ro : SB_RO;
 
 fn arrayLength_cfca0a() {
   var res : u32 = arrayLength(&(sb_ro.arg_0));
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   arrayLength_cfca0a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   arrayLength_cfca0a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   arrayLength_cfca0a();
 }
diff --git a/test/intrinsics/gen/arrayLength/eb510f.wgsl b/test/intrinsics/gen/arrayLength/eb510f.wgsl
index 0f7df32..86133e5 100644
--- a/test/intrinsics/gen/arrayLength/eb510f.wgsl
+++ b/test/intrinsics/gen/arrayLength/eb510f.wgsl
@@ -25,25 +25,25 @@
 struct SB_RW {
   arg_0: array<u32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn arrayLength(ptr<storage, array<u32>, read_write>) -> u32
 fn arrayLength_eb510f() {
   var res: u32 = arrayLength(&sb_rw.arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   arrayLength_eb510f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   arrayLength_eb510f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   arrayLength_eb510f();
 }
diff --git a/test/intrinsics/gen/arrayLength/eb510f.wgsl.expected.wgsl b/test/intrinsics/gen/arrayLength/eb510f.wgsl.expected.wgsl
index 5b85130..fb67885 100644
--- a/test/intrinsics/gen/arrayLength/eb510f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/arrayLength/eb510f.wgsl.expected.wgsl
@@ -2,24 +2,24 @@
   arg_0 : array<u32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn arrayLength_eb510f() {
   var res : u32 = arrayLength(&(sb_rw.arg_0));
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   arrayLength_eb510f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   arrayLength_eb510f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   arrayLength_eb510f();
 }
diff --git a/test/intrinsics/gen/asin/064953.wgsl b/test/intrinsics/gen/asin/064953.wgsl
index 26e49e7..f72a8c5 100644
--- a/test/intrinsics/gen/asin/064953.wgsl
+++ b/test/intrinsics/gen/asin/064953.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = asin(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   asin_064953();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   asin_064953();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   asin_064953();
 }
diff --git a/test/intrinsics/gen/asin/064953.wgsl.expected.wgsl b/test/intrinsics/gen/asin/064953.wgsl.expected.wgsl
index 4c3bf70..ed58d99 100644
--- a/test/intrinsics/gen/asin/064953.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/asin/064953.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = asin(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   asin_064953();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   asin_064953();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   asin_064953();
 }
diff --git a/test/intrinsics/gen/asin/7b6a44.wgsl b/test/intrinsics/gen/asin/7b6a44.wgsl
index cee069c..6369852 100644
--- a/test/intrinsics/gen/asin/7b6a44.wgsl
+++ b/test/intrinsics/gen/asin/7b6a44.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = asin(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   asin_7b6a44();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   asin_7b6a44();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   asin_7b6a44();
 }
diff --git a/test/intrinsics/gen/asin/7b6a44.wgsl.expected.wgsl b/test/intrinsics/gen/asin/7b6a44.wgsl.expected.wgsl
index 44df59b..d70e952 100644
--- a/test/intrinsics/gen/asin/7b6a44.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/asin/7b6a44.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = asin(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   asin_7b6a44();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   asin_7b6a44();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   asin_7b6a44();
 }
diff --git a/test/intrinsics/gen/asin/8cd9c9.wgsl b/test/intrinsics/gen/asin/8cd9c9.wgsl
index 2f6a3e2..0f7abb0 100644
--- a/test/intrinsics/gen/asin/8cd9c9.wgsl
+++ b/test/intrinsics/gen/asin/8cd9c9.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = asin(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   asin_8cd9c9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   asin_8cd9c9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   asin_8cd9c9();
 }
diff --git a/test/intrinsics/gen/asin/8cd9c9.wgsl.expected.wgsl b/test/intrinsics/gen/asin/8cd9c9.wgsl.expected.wgsl
index 04131b7..2f4ea23 100644
--- a/test/intrinsics/gen/asin/8cd9c9.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/asin/8cd9c9.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = asin(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   asin_8cd9c9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   asin_8cd9c9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   asin_8cd9c9();
 }
diff --git a/test/intrinsics/gen/asin/c0c272.wgsl b/test/intrinsics/gen/asin/c0c272.wgsl
index 290798a..b673fe3 100644
--- a/test/intrinsics/gen/asin/c0c272.wgsl
+++ b/test/intrinsics/gen/asin/c0c272.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = asin(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   asin_c0c272();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   asin_c0c272();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   asin_c0c272();
 }
diff --git a/test/intrinsics/gen/asin/c0c272.wgsl.expected.wgsl b/test/intrinsics/gen/asin/c0c272.wgsl.expected.wgsl
index 08eb0ce..d3a8d05 100644
--- a/test/intrinsics/gen/asin/c0c272.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/asin/c0c272.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = asin(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   asin_c0c272();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   asin_c0c272();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   asin_c0c272();
 }
diff --git a/test/intrinsics/gen/atan/02979a.wgsl b/test/intrinsics/gen/atan/02979a.wgsl
index cf0d1be..fb9d082 100644
--- a/test/intrinsics/gen/atan/02979a.wgsl
+++ b/test/intrinsics/gen/atan/02979a.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = atan(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   atan_02979a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atan_02979a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atan_02979a();
 }
diff --git a/test/intrinsics/gen/atan/02979a.wgsl.expected.wgsl b/test/intrinsics/gen/atan/02979a.wgsl.expected.wgsl
index 9730fb2..75af743 100644
--- a/test/intrinsics/gen/atan/02979a.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atan/02979a.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = atan(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   atan_02979a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atan_02979a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atan_02979a();
 }
diff --git a/test/intrinsics/gen/atan/331e6d.wgsl b/test/intrinsics/gen/atan/331e6d.wgsl
index 23d5f42..e090a63 100644
--- a/test/intrinsics/gen/atan/331e6d.wgsl
+++ b/test/intrinsics/gen/atan/331e6d.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = atan(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   atan_331e6d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atan_331e6d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atan_331e6d();
 }
diff --git a/test/intrinsics/gen/atan/331e6d.wgsl.expected.wgsl b/test/intrinsics/gen/atan/331e6d.wgsl.expected.wgsl
index 0b9de68..7bc7982 100644
--- a/test/intrinsics/gen/atan/331e6d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atan/331e6d.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = atan(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   atan_331e6d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atan_331e6d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atan_331e6d();
 }
diff --git a/test/intrinsics/gen/atan/a8b696.wgsl b/test/intrinsics/gen/atan/a8b696.wgsl
index f73df4c..8b1c3cf 100644
--- a/test/intrinsics/gen/atan/a8b696.wgsl
+++ b/test/intrinsics/gen/atan/a8b696.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = atan(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   atan_a8b696();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atan_a8b696();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atan_a8b696();
 }
diff --git a/test/intrinsics/gen/atan/a8b696.wgsl.expected.wgsl b/test/intrinsics/gen/atan/a8b696.wgsl.expected.wgsl
index 004b7ae..70b4684 100644
--- a/test/intrinsics/gen/atan/a8b696.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atan/a8b696.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = atan(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   atan_a8b696();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atan_a8b696();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atan_a8b696();
 }
diff --git a/test/intrinsics/gen/atan/ad96e4.wgsl b/test/intrinsics/gen/atan/ad96e4.wgsl
index 7995257..b334a9e 100644
--- a/test/intrinsics/gen/atan/ad96e4.wgsl
+++ b/test/intrinsics/gen/atan/ad96e4.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = atan(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   atan_ad96e4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atan_ad96e4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atan_ad96e4();
 }
diff --git a/test/intrinsics/gen/atan/ad96e4.wgsl.expected.wgsl b/test/intrinsics/gen/atan/ad96e4.wgsl.expected.wgsl
index 07ff1f5..dcf775a 100644
--- a/test/intrinsics/gen/atan/ad96e4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atan/ad96e4.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = atan(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   atan_ad96e4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atan_ad96e4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atan_ad96e4();
 }
diff --git a/test/intrinsics/gen/atan2/57fb13.wgsl b/test/intrinsics/gen/atan2/57fb13.wgsl
index c9d3028..c18536f 100644
--- a/test/intrinsics/gen/atan2/57fb13.wgsl
+++ b/test/intrinsics/gen/atan2/57fb13.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = atan2(vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   atan2_57fb13();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atan2_57fb13();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atan2_57fb13();
 }
diff --git a/test/intrinsics/gen/atan2/57fb13.wgsl.expected.wgsl b/test/intrinsics/gen/atan2/57fb13.wgsl.expected.wgsl
index 09034a8..ec7ff3a 100644
--- a/test/intrinsics/gen/atan2/57fb13.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atan2/57fb13.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = atan2(vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   atan2_57fb13();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atan2_57fb13();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atan2_57fb13();
 }
diff --git a/test/intrinsics/gen/atan2/96057c.wgsl b/test/intrinsics/gen/atan2/96057c.wgsl
index 293ac6f..0955766 100644
--- a/test/intrinsics/gen/atan2/96057c.wgsl
+++ b/test/intrinsics/gen/atan2/96057c.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = atan2(1.0, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   atan2_96057c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atan2_96057c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atan2_96057c();
 }
diff --git a/test/intrinsics/gen/atan2/96057c.wgsl.expected.wgsl b/test/intrinsics/gen/atan2/96057c.wgsl.expected.wgsl
index a60ced6..78abdd4 100644
--- a/test/intrinsics/gen/atan2/96057c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atan2/96057c.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = atan2(1.0, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   atan2_96057c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atan2_96057c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atan2_96057c();
 }
diff --git a/test/intrinsics/gen/atan2/a70d0d.wgsl b/test/intrinsics/gen/atan2/a70d0d.wgsl
index a12f308..87a3c7a 100644
--- a/test/intrinsics/gen/atan2/a70d0d.wgsl
+++ b/test/intrinsics/gen/atan2/a70d0d.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = atan2(vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   atan2_a70d0d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atan2_a70d0d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atan2_a70d0d();
 }
diff --git a/test/intrinsics/gen/atan2/a70d0d.wgsl.expected.wgsl b/test/intrinsics/gen/atan2/a70d0d.wgsl.expected.wgsl
index a20e681..9b32967 100644
--- a/test/intrinsics/gen/atan2/a70d0d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atan2/a70d0d.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = atan2(vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   atan2_a70d0d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atan2_a70d0d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atan2_a70d0d();
 }
diff --git a/test/intrinsics/gen/atan2/ae713e.wgsl b/test/intrinsics/gen/atan2/ae713e.wgsl
index 9098c1d..381ca2a 100644
--- a/test/intrinsics/gen/atan2/ae713e.wgsl
+++ b/test/intrinsics/gen/atan2/ae713e.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = atan2(vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   atan2_ae713e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atan2_ae713e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atan2_ae713e();
 }
diff --git a/test/intrinsics/gen/atan2/ae713e.wgsl.expected.wgsl b/test/intrinsics/gen/atan2/ae713e.wgsl.expected.wgsl
index 875e4df..d765ab4 100644
--- a/test/intrinsics/gen/atan2/ae713e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atan2/ae713e.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = atan2(vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   atan2_ae713e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atan2_ae713e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atan2_ae713e();
 }
diff --git a/test/intrinsics/gen/atomicAdd/794055.wgsl b/test/intrinsics/gen/atomicAdd/794055.wgsl
index 25241b2..5963b4f 100644
--- a/test/intrinsics/gen/atomicAdd/794055.wgsl
+++ b/test/intrinsics/gen/atomicAdd/794055.wgsl
@@ -29,7 +29,7 @@
   var res: i32 = atomicAdd(&arg_0, 1);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicAdd_794055();
 }
diff --git a/test/intrinsics/gen/atomicAdd/794055.wgsl.expected.wgsl b/test/intrinsics/gen/atomicAdd/794055.wgsl.expected.wgsl
index 833160d..57290be 100644
--- a/test/intrinsics/gen/atomicAdd/794055.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicAdd/794055.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
   var res : i32 = atomicAdd(&(arg_0), 1);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicAdd_794055();
 }
diff --git a/test/intrinsics/gen/atomicAdd/8a199a.wgsl b/test/intrinsics/gen/atomicAdd/8a199a.wgsl
index 0b728d5..aae79c2 100644
--- a/test/intrinsics/gen/atomicAdd/8a199a.wgsl
+++ b/test/intrinsics/gen/atomicAdd/8a199a.wgsl
@@ -25,19 +25,19 @@
 struct SB_RW {
   arg_0: atomic<u32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn atomicAdd(ptr<storage, atomic<u32>, read_write>, u32) -> u32
 fn atomicAdd_8a199a() {
   var res: u32 = atomicAdd(&sb_rw.arg_0, 1u);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicAdd_8a199a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicAdd_8a199a();
 }
diff --git a/test/intrinsics/gen/atomicAdd/8a199a.wgsl.expected.wgsl b/test/intrinsics/gen/atomicAdd/8a199a.wgsl.expected.wgsl
index 432caa9..096bd43 100644
--- a/test/intrinsics/gen/atomicAdd/8a199a.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicAdd/8a199a.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   arg_0 : atomic<u32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn atomicAdd_8a199a() {
   var res : u32 = atomicAdd(&(sb_rw.arg_0), 1u);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicAdd_8a199a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicAdd_8a199a();
 }
diff --git a/test/intrinsics/gen/atomicAdd/d32fe4.wgsl b/test/intrinsics/gen/atomicAdd/d32fe4.wgsl
index 88fd8f6..4cf4eb6 100644
--- a/test/intrinsics/gen/atomicAdd/d32fe4.wgsl
+++ b/test/intrinsics/gen/atomicAdd/d32fe4.wgsl
@@ -25,19 +25,19 @@
 struct SB_RW {
   arg_0: atomic<i32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn atomicAdd(ptr<storage, atomic<i32>, read_write>, i32) -> i32
 fn atomicAdd_d32fe4() {
   var res: i32 = atomicAdd(&sb_rw.arg_0, 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicAdd_d32fe4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicAdd_d32fe4();
 }
diff --git a/test/intrinsics/gen/atomicAdd/d32fe4.wgsl.expected.wgsl b/test/intrinsics/gen/atomicAdd/d32fe4.wgsl.expected.wgsl
index 5bc41ca..6666896 100644
--- a/test/intrinsics/gen/atomicAdd/d32fe4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicAdd/d32fe4.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   arg_0 : atomic<i32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn atomicAdd_d32fe4() {
   var res : i32 = atomicAdd(&(sb_rw.arg_0), 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicAdd_d32fe4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicAdd_d32fe4();
 }
diff --git a/test/intrinsics/gen/atomicAdd/d5db1d.wgsl b/test/intrinsics/gen/atomicAdd/d5db1d.wgsl
index 2508e9f..55329bc 100644
--- a/test/intrinsics/gen/atomicAdd/d5db1d.wgsl
+++ b/test/intrinsics/gen/atomicAdd/d5db1d.wgsl
@@ -29,7 +29,7 @@
   var res: u32 = atomicAdd(&arg_0, 1u);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicAdd_d5db1d();
 }
diff --git a/test/intrinsics/gen/atomicAdd/d5db1d.wgsl.expected.wgsl b/test/intrinsics/gen/atomicAdd/d5db1d.wgsl.expected.wgsl
index 116ecfe..e7381bb 100644
--- a/test/intrinsics/gen/atomicAdd/d5db1d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicAdd/d5db1d.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
   var res : u32 = atomicAdd(&(arg_0), 1u);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicAdd_d5db1d();
 }
diff --git a/test/intrinsics/gen/atomicAnd/152966.wgsl b/test/intrinsics/gen/atomicAnd/152966.wgsl
index deb1160..b99ab19 100644
--- a/test/intrinsics/gen/atomicAnd/152966.wgsl
+++ b/test/intrinsics/gen/atomicAnd/152966.wgsl
@@ -25,19 +25,19 @@
 struct SB_RW {
   arg_0: atomic<i32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn atomicAnd(ptr<storage, atomic<i32>, read_write>, i32) -> i32
 fn atomicAnd_152966() {
   var res: i32 = atomicAnd(&sb_rw.arg_0, 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicAnd_152966();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicAnd_152966();
 }
diff --git a/test/intrinsics/gen/atomicAnd/152966.wgsl.expected.wgsl b/test/intrinsics/gen/atomicAnd/152966.wgsl.expected.wgsl
index c0be5bc..5da1a1d 100644
--- a/test/intrinsics/gen/atomicAnd/152966.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicAnd/152966.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   arg_0 : atomic<i32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn atomicAnd_152966() {
   var res : i32 = atomicAnd(&(sb_rw.arg_0), 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicAnd_152966();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicAnd_152966();
 }
diff --git a/test/intrinsics/gen/atomicAnd/34edd3.wgsl b/test/intrinsics/gen/atomicAnd/34edd3.wgsl
index b380519..567863d 100644
--- a/test/intrinsics/gen/atomicAnd/34edd3.wgsl
+++ b/test/intrinsics/gen/atomicAnd/34edd3.wgsl
@@ -29,7 +29,7 @@
   var res: u32 = atomicAnd(&arg_0, 1u);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicAnd_34edd3();
 }
diff --git a/test/intrinsics/gen/atomicAnd/34edd3.wgsl.expected.wgsl b/test/intrinsics/gen/atomicAnd/34edd3.wgsl.expected.wgsl
index ba6645d..89cec48 100644
--- a/test/intrinsics/gen/atomicAnd/34edd3.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicAnd/34edd3.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
   var res : u32 = atomicAnd(&(arg_0), 1u);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicAnd_34edd3();
 }
diff --git a/test/intrinsics/gen/atomicAnd/45a819.wgsl b/test/intrinsics/gen/atomicAnd/45a819.wgsl
index 76e9305..9eef5c3 100644
--- a/test/intrinsics/gen/atomicAnd/45a819.wgsl
+++ b/test/intrinsics/gen/atomicAnd/45a819.wgsl
@@ -29,7 +29,7 @@
   var res: i32 = atomicAnd(&arg_0, 1);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicAnd_45a819();
 }
diff --git a/test/intrinsics/gen/atomicAnd/45a819.wgsl.expected.wgsl b/test/intrinsics/gen/atomicAnd/45a819.wgsl.expected.wgsl
index 1b59ff6..c022cee 100644
--- a/test/intrinsics/gen/atomicAnd/45a819.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicAnd/45a819.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
   var res : i32 = atomicAnd(&(arg_0), 1);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicAnd_45a819();
 }
diff --git a/test/intrinsics/gen/atomicAnd/85a8d9.wgsl b/test/intrinsics/gen/atomicAnd/85a8d9.wgsl
index 414f521..042cba6 100644
--- a/test/intrinsics/gen/atomicAnd/85a8d9.wgsl
+++ b/test/intrinsics/gen/atomicAnd/85a8d9.wgsl
@@ -25,19 +25,19 @@
 struct SB_RW {
   arg_0: atomic<u32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn atomicAnd(ptr<storage, atomic<u32>, read_write>, u32) -> u32
 fn atomicAnd_85a8d9() {
   var res: u32 = atomicAnd(&sb_rw.arg_0, 1u);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicAnd_85a8d9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicAnd_85a8d9();
 }
diff --git a/test/intrinsics/gen/atomicAnd/85a8d9.wgsl.expected.wgsl b/test/intrinsics/gen/atomicAnd/85a8d9.wgsl.expected.wgsl
index c63138b..61780ce 100644
--- a/test/intrinsics/gen/atomicAnd/85a8d9.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicAnd/85a8d9.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   arg_0 : atomic<u32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn atomicAnd_85a8d9() {
   var res : u32 = atomicAnd(&(sb_rw.arg_0), 1u);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicAnd_85a8d9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicAnd_85a8d9();
 }
diff --git a/test/intrinsics/gen/atomicCompareExchangeWeak/12871c.wgsl b/test/intrinsics/gen/atomicCompareExchangeWeak/12871c.wgsl
index ebbe26f..3735ad4 100644
--- a/test/intrinsics/gen/atomicCompareExchangeWeak/12871c.wgsl
+++ b/test/intrinsics/gen/atomicCompareExchangeWeak/12871c.wgsl
@@ -25,19 +25,19 @@
 struct SB_RW {
   arg_0: atomic<i32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn atomicCompareExchangeWeak(ptr<storage, atomic<i32>, read_write>, i32, i32) -> vec2<i32>
 fn atomicCompareExchangeWeak_12871c() {
   var res: vec2<i32> = atomicCompareExchangeWeak(&sb_rw.arg_0, 1, 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicCompareExchangeWeak_12871c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicCompareExchangeWeak_12871c();
 }
diff --git a/test/intrinsics/gen/atomicCompareExchangeWeak/12871c.wgsl.expected.wgsl b/test/intrinsics/gen/atomicCompareExchangeWeak/12871c.wgsl.expected.wgsl
index eed9b1f..aa49ba9 100644
--- a/test/intrinsics/gen/atomicCompareExchangeWeak/12871c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicCompareExchangeWeak/12871c.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   arg_0 : atomic<i32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn atomicCompareExchangeWeak_12871c() {
   var res : vec2<i32> = atomicCompareExchangeWeak(&(sb_rw.arg_0), 1, 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicCompareExchangeWeak_12871c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicCompareExchangeWeak_12871c();
 }
diff --git a/test/intrinsics/gen/atomicCompareExchangeWeak/6673da.wgsl b/test/intrinsics/gen/atomicCompareExchangeWeak/6673da.wgsl
index ac2e91d..be43eb0 100644
--- a/test/intrinsics/gen/atomicCompareExchangeWeak/6673da.wgsl
+++ b/test/intrinsics/gen/atomicCompareExchangeWeak/6673da.wgsl
@@ -25,19 +25,19 @@
 struct SB_RW {
   arg_0: atomic<u32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn atomicCompareExchangeWeak(ptr<storage, atomic<u32>, read_write>, u32, u32) -> vec2<u32>
 fn atomicCompareExchangeWeak_6673da() {
   var res: vec2<u32> = atomicCompareExchangeWeak(&sb_rw.arg_0, 1u, 1u);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicCompareExchangeWeak_6673da();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicCompareExchangeWeak_6673da();
 }
diff --git a/test/intrinsics/gen/atomicCompareExchangeWeak/6673da.wgsl.expected.wgsl b/test/intrinsics/gen/atomicCompareExchangeWeak/6673da.wgsl.expected.wgsl
index ea4899a..3970296 100644
--- a/test/intrinsics/gen/atomicCompareExchangeWeak/6673da.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicCompareExchangeWeak/6673da.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   arg_0 : atomic<u32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn atomicCompareExchangeWeak_6673da() {
   var res : vec2<u32> = atomicCompareExchangeWeak(&(sb_rw.arg_0), 1u, 1u);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicCompareExchangeWeak_6673da();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicCompareExchangeWeak_6673da();
 }
diff --git a/test/intrinsics/gen/atomicCompareExchangeWeak/89ea3b.wgsl b/test/intrinsics/gen/atomicCompareExchangeWeak/89ea3b.wgsl
index 78a5bd0..58bf4b5 100644
--- a/test/intrinsics/gen/atomicCompareExchangeWeak/89ea3b.wgsl
+++ b/test/intrinsics/gen/atomicCompareExchangeWeak/89ea3b.wgsl
@@ -29,7 +29,7 @@
   var res: vec2<i32> = atomicCompareExchangeWeak(&arg_0, 1, 1);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicCompareExchangeWeak_89ea3b();
 }
diff --git a/test/intrinsics/gen/atomicCompareExchangeWeak/89ea3b.wgsl.expected.wgsl b/test/intrinsics/gen/atomicCompareExchangeWeak/89ea3b.wgsl.expected.wgsl
index 152f1cd..4357511 100644
--- a/test/intrinsics/gen/atomicCompareExchangeWeak/89ea3b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicCompareExchangeWeak/89ea3b.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
   var res : vec2<i32> = atomicCompareExchangeWeak(&(arg_0), 1, 1);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicCompareExchangeWeak_89ea3b();
 }
diff --git a/test/intrinsics/gen/atomicCompareExchangeWeak/b2ab2c.wgsl b/test/intrinsics/gen/atomicCompareExchangeWeak/b2ab2c.wgsl
index a73436f..38cf645 100644
--- a/test/intrinsics/gen/atomicCompareExchangeWeak/b2ab2c.wgsl
+++ b/test/intrinsics/gen/atomicCompareExchangeWeak/b2ab2c.wgsl
@@ -29,7 +29,7 @@
   var res: vec2<u32> = atomicCompareExchangeWeak(&arg_0, 1u, 1u);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicCompareExchangeWeak_b2ab2c();
 }
diff --git a/test/intrinsics/gen/atomicCompareExchangeWeak/b2ab2c.wgsl.expected.wgsl b/test/intrinsics/gen/atomicCompareExchangeWeak/b2ab2c.wgsl.expected.wgsl
index f920acf..d53e099 100644
--- a/test/intrinsics/gen/atomicCompareExchangeWeak/b2ab2c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicCompareExchangeWeak/b2ab2c.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
   var res : vec2<u32> = atomicCompareExchangeWeak(&(arg_0), 1u, 1u);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicCompareExchangeWeak_b2ab2c();
 }
diff --git a/test/intrinsics/gen/atomicExchange/0a5dca.wgsl b/test/intrinsics/gen/atomicExchange/0a5dca.wgsl
index 4e79f0d..44ac264 100644
--- a/test/intrinsics/gen/atomicExchange/0a5dca.wgsl
+++ b/test/intrinsics/gen/atomicExchange/0a5dca.wgsl
@@ -29,7 +29,7 @@
   var res: u32 = atomicExchange(&arg_0, 1u);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicExchange_0a5dca();
 }
diff --git a/test/intrinsics/gen/atomicExchange/0a5dca.wgsl.expected.wgsl b/test/intrinsics/gen/atomicExchange/0a5dca.wgsl.expected.wgsl
index aba05aa..a7acabd 100644
--- a/test/intrinsics/gen/atomicExchange/0a5dca.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicExchange/0a5dca.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
   var res : u32 = atomicExchange(&(arg_0), 1u);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicExchange_0a5dca();
 }
diff --git a/test/intrinsics/gen/atomicExchange/d59712.wgsl b/test/intrinsics/gen/atomicExchange/d59712.wgsl
index 6a5c6f2..fc014ee 100644
--- a/test/intrinsics/gen/atomicExchange/d59712.wgsl
+++ b/test/intrinsics/gen/atomicExchange/d59712.wgsl
@@ -25,19 +25,19 @@
 struct SB_RW {
   arg_0: atomic<u32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn atomicExchange(ptr<storage, atomic<u32>, read_write>, u32) -> u32
 fn atomicExchange_d59712() {
   var res: u32 = atomicExchange(&sb_rw.arg_0, 1u);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicExchange_d59712();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicExchange_d59712();
 }
diff --git a/test/intrinsics/gen/atomicExchange/d59712.wgsl.expected.wgsl b/test/intrinsics/gen/atomicExchange/d59712.wgsl.expected.wgsl
index 9970c9b..0930bd7 100644
--- a/test/intrinsics/gen/atomicExchange/d59712.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicExchange/d59712.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   arg_0 : atomic<u32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn atomicExchange_d59712() {
   var res : u32 = atomicExchange(&(sb_rw.arg_0), 1u);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicExchange_d59712();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicExchange_d59712();
 }
diff --git a/test/intrinsics/gen/atomicExchange/e114ba.wgsl b/test/intrinsics/gen/atomicExchange/e114ba.wgsl
index 8f2acd0..f52534a 100644
--- a/test/intrinsics/gen/atomicExchange/e114ba.wgsl
+++ b/test/intrinsics/gen/atomicExchange/e114ba.wgsl
@@ -29,7 +29,7 @@
   var res: i32 = atomicExchange(&arg_0, 1);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicExchange_e114ba();
 }
diff --git a/test/intrinsics/gen/atomicExchange/e114ba.wgsl.expected.wgsl b/test/intrinsics/gen/atomicExchange/e114ba.wgsl.expected.wgsl
index 0384fca..9735838 100644
--- a/test/intrinsics/gen/atomicExchange/e114ba.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicExchange/e114ba.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
   var res : i32 = atomicExchange(&(arg_0), 1);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicExchange_e114ba();
 }
diff --git a/test/intrinsics/gen/atomicExchange/f2e22f.wgsl b/test/intrinsics/gen/atomicExchange/f2e22f.wgsl
index 990cfb4..be22ff9 100644
--- a/test/intrinsics/gen/atomicExchange/f2e22f.wgsl
+++ b/test/intrinsics/gen/atomicExchange/f2e22f.wgsl
@@ -25,19 +25,19 @@
 struct SB_RW {
   arg_0: atomic<i32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn atomicExchange(ptr<storage, atomic<i32>, read_write>, i32) -> i32
 fn atomicExchange_f2e22f() {
   var res: i32 = atomicExchange(&sb_rw.arg_0, 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicExchange_f2e22f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicExchange_f2e22f();
 }
diff --git a/test/intrinsics/gen/atomicExchange/f2e22f.wgsl.expected.wgsl b/test/intrinsics/gen/atomicExchange/f2e22f.wgsl.expected.wgsl
index 511c02b..79704e4 100644
--- a/test/intrinsics/gen/atomicExchange/f2e22f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicExchange/f2e22f.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   arg_0 : atomic<i32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn atomicExchange_f2e22f() {
   var res : i32 = atomicExchange(&(sb_rw.arg_0), 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicExchange_f2e22f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicExchange_f2e22f();
 }
diff --git a/test/intrinsics/gen/atomicLoad/0806ad.wgsl b/test/intrinsics/gen/atomicLoad/0806ad.wgsl
index 98dd4f5..0981e05 100644
--- a/test/intrinsics/gen/atomicLoad/0806ad.wgsl
+++ b/test/intrinsics/gen/atomicLoad/0806ad.wgsl
@@ -25,19 +25,19 @@
 struct SB_RW {
   arg_0: atomic<i32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn atomicLoad(ptr<storage, atomic<i32>, read_write>) -> i32
 fn atomicLoad_0806ad() {
   var res: i32 = atomicLoad(&sb_rw.arg_0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicLoad_0806ad();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicLoad_0806ad();
 }
diff --git a/test/intrinsics/gen/atomicLoad/0806ad.wgsl.expected.wgsl b/test/intrinsics/gen/atomicLoad/0806ad.wgsl.expected.wgsl
index b0f3f7d..7396ee2 100644
--- a/test/intrinsics/gen/atomicLoad/0806ad.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicLoad/0806ad.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   arg_0 : atomic<i32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn atomicLoad_0806ad() {
   var res : i32 = atomicLoad(&(sb_rw.arg_0));
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicLoad_0806ad();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicLoad_0806ad();
 }
diff --git a/test/intrinsics/gen/atomicLoad/361bf1.wgsl b/test/intrinsics/gen/atomicLoad/361bf1.wgsl
index 622c033..3c51abc 100644
--- a/test/intrinsics/gen/atomicLoad/361bf1.wgsl
+++ b/test/intrinsics/gen/atomicLoad/361bf1.wgsl
@@ -29,7 +29,7 @@
   var res: u32 = atomicLoad(&arg_0);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicLoad_361bf1();
 }
diff --git a/test/intrinsics/gen/atomicLoad/361bf1.wgsl.expected.wgsl b/test/intrinsics/gen/atomicLoad/361bf1.wgsl.expected.wgsl
index ff710c7..1040bf2 100644
--- a/test/intrinsics/gen/atomicLoad/361bf1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicLoad/361bf1.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
   var res : u32 = atomicLoad(&(arg_0));
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicLoad_361bf1();
 }
diff --git a/test/intrinsics/gen/atomicLoad/afcc03.wgsl b/test/intrinsics/gen/atomicLoad/afcc03.wgsl
index c24843d..7585c6f 100644
--- a/test/intrinsics/gen/atomicLoad/afcc03.wgsl
+++ b/test/intrinsics/gen/atomicLoad/afcc03.wgsl
@@ -29,7 +29,7 @@
   var res: i32 = atomicLoad(&arg_0);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicLoad_afcc03();
 }
diff --git a/test/intrinsics/gen/atomicLoad/afcc03.wgsl.expected.wgsl b/test/intrinsics/gen/atomicLoad/afcc03.wgsl.expected.wgsl
index 72d9325..e39317d 100644
--- a/test/intrinsics/gen/atomicLoad/afcc03.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicLoad/afcc03.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
   var res : i32 = atomicLoad(&(arg_0));
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicLoad_afcc03();
 }
diff --git a/test/intrinsics/gen/atomicLoad/fe6cc3.wgsl b/test/intrinsics/gen/atomicLoad/fe6cc3.wgsl
index 3c8ea5e..d337a1e 100644
--- a/test/intrinsics/gen/atomicLoad/fe6cc3.wgsl
+++ b/test/intrinsics/gen/atomicLoad/fe6cc3.wgsl
@@ -25,19 +25,19 @@
 struct SB_RW {
   arg_0: atomic<u32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn atomicLoad(ptr<storage, atomic<u32>, read_write>) -> u32
 fn atomicLoad_fe6cc3() {
   var res: u32 = atomicLoad(&sb_rw.arg_0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicLoad_fe6cc3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicLoad_fe6cc3();
 }
diff --git a/test/intrinsics/gen/atomicLoad/fe6cc3.wgsl.expected.wgsl b/test/intrinsics/gen/atomicLoad/fe6cc3.wgsl.expected.wgsl
index a4b878b..28eca60 100644
--- a/test/intrinsics/gen/atomicLoad/fe6cc3.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicLoad/fe6cc3.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   arg_0 : atomic<u32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn atomicLoad_fe6cc3() {
   var res : u32 = atomicLoad(&(sb_rw.arg_0));
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicLoad_fe6cc3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicLoad_fe6cc3();
 }
diff --git a/test/intrinsics/gen/atomicMax/51b9be.wgsl b/test/intrinsics/gen/atomicMax/51b9be.wgsl
index 8c53dfa..7f2e69c 100644
--- a/test/intrinsics/gen/atomicMax/51b9be.wgsl
+++ b/test/intrinsics/gen/atomicMax/51b9be.wgsl
@@ -25,19 +25,19 @@
 struct SB_RW {
   arg_0: atomic<u32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn atomicMax(ptr<storage, atomic<u32>, read_write>, u32) -> u32
 fn atomicMax_51b9be() {
   var res: u32 = atomicMax(&sb_rw.arg_0, 1u);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicMax_51b9be();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicMax_51b9be();
 }
diff --git a/test/intrinsics/gen/atomicMax/51b9be.wgsl.expected.wgsl b/test/intrinsics/gen/atomicMax/51b9be.wgsl.expected.wgsl
index 3f36fbc..985c763 100644
--- a/test/intrinsics/gen/atomicMax/51b9be.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicMax/51b9be.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   arg_0 : atomic<u32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn atomicMax_51b9be() {
   var res : u32 = atomicMax(&(sb_rw.arg_0), 1u);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicMax_51b9be();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicMax_51b9be();
 }
diff --git a/test/intrinsics/gen/atomicMax/92aa72.wgsl b/test/intrinsics/gen/atomicMax/92aa72.wgsl
index 74431a7..603ea33 100644
--- a/test/intrinsics/gen/atomicMax/92aa72.wgsl
+++ b/test/intrinsics/gen/atomicMax/92aa72.wgsl
@@ -25,19 +25,19 @@
 struct SB_RW {
   arg_0: atomic<i32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn atomicMax(ptr<storage, atomic<i32>, read_write>, i32) -> i32
 fn atomicMax_92aa72() {
   var res: i32 = atomicMax(&sb_rw.arg_0, 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicMax_92aa72();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicMax_92aa72();
 }
diff --git a/test/intrinsics/gen/atomicMax/92aa72.wgsl.expected.wgsl b/test/intrinsics/gen/atomicMax/92aa72.wgsl.expected.wgsl
index d1c9bea..050d266 100644
--- a/test/intrinsics/gen/atomicMax/92aa72.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicMax/92aa72.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   arg_0 : atomic<i32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn atomicMax_92aa72() {
   var res : i32 = atomicMax(&(sb_rw.arg_0), 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicMax_92aa72();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicMax_92aa72();
 }
diff --git a/test/intrinsics/gen/atomicMax/a89cc3.wgsl b/test/intrinsics/gen/atomicMax/a89cc3.wgsl
index f3e4ef9..f6c65cf 100644
--- a/test/intrinsics/gen/atomicMax/a89cc3.wgsl
+++ b/test/intrinsics/gen/atomicMax/a89cc3.wgsl
@@ -29,7 +29,7 @@
   var res: i32 = atomicMax(&arg_0, 1);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicMax_a89cc3();
 }
diff --git a/test/intrinsics/gen/atomicMax/a89cc3.wgsl.expected.wgsl b/test/intrinsics/gen/atomicMax/a89cc3.wgsl.expected.wgsl
index a383c70..d36703e 100644
--- a/test/intrinsics/gen/atomicMax/a89cc3.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicMax/a89cc3.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
   var res : i32 = atomicMax(&(arg_0), 1);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicMax_a89cc3();
 }
diff --git a/test/intrinsics/gen/atomicMax/beccfc.wgsl b/test/intrinsics/gen/atomicMax/beccfc.wgsl
index a5ed85b..c6c4b60 100644
--- a/test/intrinsics/gen/atomicMax/beccfc.wgsl
+++ b/test/intrinsics/gen/atomicMax/beccfc.wgsl
@@ -29,7 +29,7 @@
   var res: u32 = atomicMax(&arg_0, 1u);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicMax_beccfc();
 }
diff --git a/test/intrinsics/gen/atomicMax/beccfc.wgsl.expected.wgsl b/test/intrinsics/gen/atomicMax/beccfc.wgsl.expected.wgsl
index d468d95..f14f91a 100644
--- a/test/intrinsics/gen/atomicMax/beccfc.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicMax/beccfc.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
   var res : u32 = atomicMax(&(arg_0), 1u);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicMax_beccfc();
 }
diff --git a/test/intrinsics/gen/atomicMin/278235.wgsl b/test/intrinsics/gen/atomicMin/278235.wgsl
index c5f1816..2a0cf13 100644
--- a/test/intrinsics/gen/atomicMin/278235.wgsl
+++ b/test/intrinsics/gen/atomicMin/278235.wgsl
@@ -29,7 +29,7 @@
   var res: i32 = atomicMin(&arg_0, 1);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicMin_278235();
 }
diff --git a/test/intrinsics/gen/atomicMin/278235.wgsl.expected.wgsl b/test/intrinsics/gen/atomicMin/278235.wgsl.expected.wgsl
index c3b237c..981a7b3 100644
--- a/test/intrinsics/gen/atomicMin/278235.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicMin/278235.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
   var res : i32 = atomicMin(&(arg_0), 1);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicMin_278235();
 }
diff --git a/test/intrinsics/gen/atomicMin/69d383.wgsl b/test/intrinsics/gen/atomicMin/69d383.wgsl
index 79c5cae..41b6284 100644
--- a/test/intrinsics/gen/atomicMin/69d383.wgsl
+++ b/test/intrinsics/gen/atomicMin/69d383.wgsl
@@ -29,7 +29,7 @@
   var res: u32 = atomicMin(&arg_0, 1u);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicMin_69d383();
 }
diff --git a/test/intrinsics/gen/atomicMin/69d383.wgsl.expected.wgsl b/test/intrinsics/gen/atomicMin/69d383.wgsl.expected.wgsl
index baff1a6..034d1af 100644
--- a/test/intrinsics/gen/atomicMin/69d383.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicMin/69d383.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
   var res : u32 = atomicMin(&(arg_0), 1u);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicMin_69d383();
 }
diff --git a/test/intrinsics/gen/atomicMin/8e38dc.wgsl b/test/intrinsics/gen/atomicMin/8e38dc.wgsl
index 8f50406..9512528 100644
--- a/test/intrinsics/gen/atomicMin/8e38dc.wgsl
+++ b/test/intrinsics/gen/atomicMin/8e38dc.wgsl
@@ -25,19 +25,19 @@
 struct SB_RW {
   arg_0: atomic<i32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn atomicMin(ptr<storage, atomic<i32>, read_write>, i32) -> i32
 fn atomicMin_8e38dc() {
   var res: i32 = atomicMin(&sb_rw.arg_0, 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicMin_8e38dc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicMin_8e38dc();
 }
diff --git a/test/intrinsics/gen/atomicMin/8e38dc.wgsl.expected.wgsl b/test/intrinsics/gen/atomicMin/8e38dc.wgsl.expected.wgsl
index ef74988..445c42c 100644
--- a/test/intrinsics/gen/atomicMin/8e38dc.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicMin/8e38dc.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   arg_0 : atomic<i32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn atomicMin_8e38dc() {
   var res : i32 = atomicMin(&(sb_rw.arg_0), 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicMin_8e38dc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicMin_8e38dc();
 }
diff --git a/test/intrinsics/gen/atomicMin/c67a74.wgsl b/test/intrinsics/gen/atomicMin/c67a74.wgsl
index afcf5d3..fe5bb45 100644
--- a/test/intrinsics/gen/atomicMin/c67a74.wgsl
+++ b/test/intrinsics/gen/atomicMin/c67a74.wgsl
@@ -25,19 +25,19 @@
 struct SB_RW {
   arg_0: atomic<u32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn atomicMin(ptr<storage, atomic<u32>, read_write>, u32) -> u32
 fn atomicMin_c67a74() {
   var res: u32 = atomicMin(&sb_rw.arg_0, 1u);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicMin_c67a74();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicMin_c67a74();
 }
diff --git a/test/intrinsics/gen/atomicMin/c67a74.wgsl.expected.wgsl b/test/intrinsics/gen/atomicMin/c67a74.wgsl.expected.wgsl
index 1e1fb28..85296e7 100644
--- a/test/intrinsics/gen/atomicMin/c67a74.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicMin/c67a74.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   arg_0 : atomic<u32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn atomicMin_c67a74() {
   var res : u32 = atomicMin(&(sb_rw.arg_0), 1u);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicMin_c67a74();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicMin_c67a74();
 }
diff --git a/test/intrinsics/gen/atomicOr/5e3d61.wgsl b/test/intrinsics/gen/atomicOr/5e3d61.wgsl
index 0a2f8c6..be6bc51 100644
--- a/test/intrinsics/gen/atomicOr/5e3d61.wgsl
+++ b/test/intrinsics/gen/atomicOr/5e3d61.wgsl
@@ -29,7 +29,7 @@
   var res: u32 = atomicOr(&arg_0, 1u);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicOr_5e3d61();
 }
diff --git a/test/intrinsics/gen/atomicOr/5e3d61.wgsl.expected.wgsl b/test/intrinsics/gen/atomicOr/5e3d61.wgsl.expected.wgsl
index a06bab1..00f3e66 100644
--- a/test/intrinsics/gen/atomicOr/5e3d61.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicOr/5e3d61.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
   var res : u32 = atomicOr(&(arg_0), 1u);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicOr_5e3d61();
 }
diff --git a/test/intrinsics/gen/atomicOr/5e95d4.wgsl b/test/intrinsics/gen/atomicOr/5e95d4.wgsl
index c90026e..356f0d0 100644
--- a/test/intrinsics/gen/atomicOr/5e95d4.wgsl
+++ b/test/intrinsics/gen/atomicOr/5e95d4.wgsl
@@ -25,19 +25,19 @@
 struct SB_RW {
   arg_0: atomic<u32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn atomicOr(ptr<storage, atomic<u32>, read_write>, u32) -> u32
 fn atomicOr_5e95d4() {
   var res: u32 = atomicOr(&sb_rw.arg_0, 1u);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicOr_5e95d4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicOr_5e95d4();
 }
diff --git a/test/intrinsics/gen/atomicOr/5e95d4.wgsl.expected.wgsl b/test/intrinsics/gen/atomicOr/5e95d4.wgsl.expected.wgsl
index a483962..78414eb 100644
--- a/test/intrinsics/gen/atomicOr/5e95d4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicOr/5e95d4.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   arg_0 : atomic<u32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn atomicOr_5e95d4() {
   var res : u32 = atomicOr(&(sb_rw.arg_0), 1u);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicOr_5e95d4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicOr_5e95d4();
 }
diff --git a/test/intrinsics/gen/atomicOr/8d96a0.wgsl b/test/intrinsics/gen/atomicOr/8d96a0.wgsl
index 7102b0c..c686a28 100644
--- a/test/intrinsics/gen/atomicOr/8d96a0.wgsl
+++ b/test/intrinsics/gen/atomicOr/8d96a0.wgsl
@@ -25,19 +25,19 @@
 struct SB_RW {
   arg_0: atomic<i32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn atomicOr(ptr<storage, atomic<i32>, read_write>, i32) -> i32
 fn atomicOr_8d96a0() {
   var res: i32 = atomicOr(&sb_rw.arg_0, 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicOr_8d96a0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicOr_8d96a0();
 }
diff --git a/test/intrinsics/gen/atomicOr/8d96a0.wgsl.expected.wgsl b/test/intrinsics/gen/atomicOr/8d96a0.wgsl.expected.wgsl
index 57de392..9ce6bd6 100644
--- a/test/intrinsics/gen/atomicOr/8d96a0.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicOr/8d96a0.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   arg_0 : atomic<i32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn atomicOr_8d96a0() {
   var res : i32 = atomicOr(&(sb_rw.arg_0), 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicOr_8d96a0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicOr_8d96a0();
 }
diff --git a/test/intrinsics/gen/atomicOr/d09248.wgsl b/test/intrinsics/gen/atomicOr/d09248.wgsl
index b9280ec..ead0c34 100644
--- a/test/intrinsics/gen/atomicOr/d09248.wgsl
+++ b/test/intrinsics/gen/atomicOr/d09248.wgsl
@@ -29,7 +29,7 @@
   var res: i32 = atomicOr(&arg_0, 1);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicOr_d09248();
 }
diff --git a/test/intrinsics/gen/atomicOr/d09248.wgsl.expected.wgsl b/test/intrinsics/gen/atomicOr/d09248.wgsl.expected.wgsl
index d517bab..c28f1c7 100644
--- a/test/intrinsics/gen/atomicOr/d09248.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicOr/d09248.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
   var res : i32 = atomicOr(&(arg_0), 1);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicOr_d09248();
 }
diff --git a/test/intrinsics/gen/atomicStore/726882.wgsl b/test/intrinsics/gen/atomicStore/726882.wgsl
index f6066f2..3994efb 100644
--- a/test/intrinsics/gen/atomicStore/726882.wgsl
+++ b/test/intrinsics/gen/atomicStore/726882.wgsl
@@ -29,7 +29,7 @@
   atomicStore(&arg_0, 1u);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicStore_726882();
 }
diff --git a/test/intrinsics/gen/atomicStore/726882.wgsl.expected.wgsl b/test/intrinsics/gen/atomicStore/726882.wgsl.expected.wgsl
index e275dcf..d81b71e 100644
--- a/test/intrinsics/gen/atomicStore/726882.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicStore/726882.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
   atomicStore(&(arg_0), 1u);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicStore_726882();
 }
diff --git a/test/intrinsics/gen/atomicStore/8bea94.wgsl b/test/intrinsics/gen/atomicStore/8bea94.wgsl
index 8906c61..3ce1a43 100644
--- a/test/intrinsics/gen/atomicStore/8bea94.wgsl
+++ b/test/intrinsics/gen/atomicStore/8bea94.wgsl
@@ -29,7 +29,7 @@
   atomicStore(&arg_0, 1);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicStore_8bea94();
 }
diff --git a/test/intrinsics/gen/atomicStore/8bea94.wgsl.expected.wgsl b/test/intrinsics/gen/atomicStore/8bea94.wgsl.expected.wgsl
index 22cd2b0..2616d87 100644
--- a/test/intrinsics/gen/atomicStore/8bea94.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicStore/8bea94.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
   atomicStore(&(arg_0), 1);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicStore_8bea94();
 }
diff --git a/test/intrinsics/gen/atomicStore/cdc29e.wgsl b/test/intrinsics/gen/atomicStore/cdc29e.wgsl
index 5961171..b9cb390 100644
--- a/test/intrinsics/gen/atomicStore/cdc29e.wgsl
+++ b/test/intrinsics/gen/atomicStore/cdc29e.wgsl
@@ -25,19 +25,19 @@
 struct SB_RW {
   arg_0: atomic<u32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn atomicStore(ptr<storage, atomic<u32>, read_write>, u32)
 fn atomicStore_cdc29e() {
   atomicStore(&sb_rw.arg_0, 1u);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicStore_cdc29e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicStore_cdc29e();
 }
diff --git a/test/intrinsics/gen/atomicStore/cdc29e.wgsl.expected.wgsl b/test/intrinsics/gen/atomicStore/cdc29e.wgsl.expected.wgsl
index 9f19d43..d0b2386 100644
--- a/test/intrinsics/gen/atomicStore/cdc29e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicStore/cdc29e.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   arg_0 : atomic<u32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn atomicStore_cdc29e() {
   atomicStore(&(sb_rw.arg_0), 1u);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicStore_cdc29e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicStore_cdc29e();
 }
diff --git a/test/intrinsics/gen/atomicStore/d1e9a6.wgsl b/test/intrinsics/gen/atomicStore/d1e9a6.wgsl
index cbbec6e..a4ff095 100644
--- a/test/intrinsics/gen/atomicStore/d1e9a6.wgsl
+++ b/test/intrinsics/gen/atomicStore/d1e9a6.wgsl
@@ -25,19 +25,19 @@
 struct SB_RW {
   arg_0: atomic<i32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn atomicStore(ptr<storage, atomic<i32>, read_write>, i32)
 fn atomicStore_d1e9a6() {
   atomicStore(&sb_rw.arg_0, 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicStore_d1e9a6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicStore_d1e9a6();
 }
diff --git a/test/intrinsics/gen/atomicStore/d1e9a6.wgsl.expected.wgsl b/test/intrinsics/gen/atomicStore/d1e9a6.wgsl.expected.wgsl
index 803cb0d..5518552 100644
--- a/test/intrinsics/gen/atomicStore/d1e9a6.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicStore/d1e9a6.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   arg_0 : atomic<i32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn atomicStore_d1e9a6() {
   atomicStore(&(sb_rw.arg_0), 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicStore_d1e9a6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicStore_d1e9a6();
 }
diff --git a/test/intrinsics/gen/atomicSub/051100.wgsl b/test/intrinsics/gen/atomicSub/051100.wgsl
index d8083ad..698b794 100644
--- a/test/intrinsics/gen/atomicSub/051100.wgsl
+++ b/test/intrinsics/gen/atomicSub/051100.wgsl
@@ -25,19 +25,19 @@
 struct SB_RW {
   arg_0: atomic<i32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn atomicSub(ptr<storage, atomic<i32>, read_write>, i32) -> i32
 fn atomicSub_051100() {
   var res: i32 = atomicSub(&sb_rw.arg_0, 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicSub_051100();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicSub_051100();
 }
diff --git a/test/intrinsics/gen/atomicSub/051100.wgsl.expected.wgsl b/test/intrinsics/gen/atomicSub/051100.wgsl.expected.wgsl
index 1059294..27b8857 100644
--- a/test/intrinsics/gen/atomicSub/051100.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicSub/051100.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   arg_0 : atomic<i32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn atomicSub_051100() {
   var res : i32 = atomicSub(&(sb_rw.arg_0), 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicSub_051100();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicSub_051100();
 }
diff --git a/test/intrinsics/gen/atomicSub/0d26c2.wgsl b/test/intrinsics/gen/atomicSub/0d26c2.wgsl
index 0aab47d..84cfa43 100644
--- a/test/intrinsics/gen/atomicSub/0d26c2.wgsl
+++ b/test/intrinsics/gen/atomicSub/0d26c2.wgsl
@@ -29,7 +29,7 @@
   var res: u32 = atomicSub(&arg_0, 1u);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicSub_0d26c2();
 }
diff --git a/test/intrinsics/gen/atomicSub/0d26c2.wgsl.expected.wgsl b/test/intrinsics/gen/atomicSub/0d26c2.wgsl.expected.wgsl
index c5c104b..6b75ecb 100644
--- a/test/intrinsics/gen/atomicSub/0d26c2.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicSub/0d26c2.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
   var res : u32 = atomicSub(&(arg_0), 1u);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicSub_0d26c2();
 }
diff --git a/test/intrinsics/gen/atomicSub/15bfc9.wgsl b/test/intrinsics/gen/atomicSub/15bfc9.wgsl
index a8ad318..e46889e 100644
--- a/test/intrinsics/gen/atomicSub/15bfc9.wgsl
+++ b/test/intrinsics/gen/atomicSub/15bfc9.wgsl
@@ -25,19 +25,19 @@
 struct SB_RW {
   arg_0: atomic<u32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn atomicSub(ptr<storage, atomic<u32>, read_write>, u32) -> u32
 fn atomicSub_15bfc9() {
   var res: u32 = atomicSub(&sb_rw.arg_0, 1u);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicSub_15bfc9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicSub_15bfc9();
 }
diff --git a/test/intrinsics/gen/atomicSub/15bfc9.wgsl.expected.wgsl b/test/intrinsics/gen/atomicSub/15bfc9.wgsl.expected.wgsl
index 26c3cbe..537edd1 100644
--- a/test/intrinsics/gen/atomicSub/15bfc9.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicSub/15bfc9.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   arg_0 : atomic<u32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn atomicSub_15bfc9() {
   var res : u32 = atomicSub(&(sb_rw.arg_0), 1u);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicSub_15bfc9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicSub_15bfc9();
 }
diff --git a/test/intrinsics/gen/atomicSub/77883a.wgsl b/test/intrinsics/gen/atomicSub/77883a.wgsl
index 8243dad..fc8fa76 100644
--- a/test/intrinsics/gen/atomicSub/77883a.wgsl
+++ b/test/intrinsics/gen/atomicSub/77883a.wgsl
@@ -29,7 +29,7 @@
   var res: i32 = atomicSub(&arg_0, 1);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicSub_77883a();
 }
diff --git a/test/intrinsics/gen/atomicSub/77883a.wgsl.expected.wgsl b/test/intrinsics/gen/atomicSub/77883a.wgsl.expected.wgsl
index b6452a3..4a49222 100644
--- a/test/intrinsics/gen/atomicSub/77883a.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicSub/77883a.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
   var res : i32 = atomicSub(&(arg_0), 1);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicSub_77883a();
 }
diff --git a/test/intrinsics/gen/atomicXor/54510e.wgsl b/test/intrinsics/gen/atomicXor/54510e.wgsl
index b7c85f0..6928f87 100644
--- a/test/intrinsics/gen/atomicXor/54510e.wgsl
+++ b/test/intrinsics/gen/atomicXor/54510e.wgsl
@@ -25,19 +25,19 @@
 struct SB_RW {
   arg_0: atomic<u32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn atomicXor(ptr<storage, atomic<u32>, read_write>, u32) -> u32
 fn atomicXor_54510e() {
   var res: u32 = atomicXor(&sb_rw.arg_0, 1u);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicXor_54510e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicXor_54510e();
 }
diff --git a/test/intrinsics/gen/atomicXor/54510e.wgsl.expected.wgsl b/test/intrinsics/gen/atomicXor/54510e.wgsl.expected.wgsl
index e0ef7e7..bc674c9 100644
--- a/test/intrinsics/gen/atomicXor/54510e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicXor/54510e.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   arg_0 : atomic<u32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn atomicXor_54510e() {
   var res : u32 = atomicXor(&(sb_rw.arg_0), 1u);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicXor_54510e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicXor_54510e();
 }
diff --git a/test/intrinsics/gen/atomicXor/75dc95.wgsl b/test/intrinsics/gen/atomicXor/75dc95.wgsl
index 9874eb7..061d653 100644
--- a/test/intrinsics/gen/atomicXor/75dc95.wgsl
+++ b/test/intrinsics/gen/atomicXor/75dc95.wgsl
@@ -29,7 +29,7 @@
   var res: i32 = atomicXor(&arg_0, 1);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicXor_75dc95();
 }
diff --git a/test/intrinsics/gen/atomicXor/75dc95.wgsl.expected.wgsl b/test/intrinsics/gen/atomicXor/75dc95.wgsl.expected.wgsl
index 6dd0569..cae6c21 100644
--- a/test/intrinsics/gen/atomicXor/75dc95.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicXor/75dc95.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
   var res : i32 = atomicXor(&(arg_0), 1);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicXor_75dc95();
 }
diff --git a/test/intrinsics/gen/atomicXor/c1b78c.wgsl b/test/intrinsics/gen/atomicXor/c1b78c.wgsl
index eb665b4..5bbc251 100644
--- a/test/intrinsics/gen/atomicXor/c1b78c.wgsl
+++ b/test/intrinsics/gen/atomicXor/c1b78c.wgsl
@@ -25,19 +25,19 @@
 struct SB_RW {
   arg_0: atomic<i32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 // fn atomicXor(ptr<storage, atomic<i32>, read_write>, i32) -> i32
 fn atomicXor_c1b78c() {
   var res: i32 = atomicXor(&sb_rw.arg_0, 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicXor_c1b78c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicXor_c1b78c();
 }
diff --git a/test/intrinsics/gen/atomicXor/c1b78c.wgsl.expected.wgsl b/test/intrinsics/gen/atomicXor/c1b78c.wgsl.expected.wgsl
index 6840482..0d49f18 100644
--- a/test/intrinsics/gen/atomicXor/c1b78c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicXor/c1b78c.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   arg_0 : atomic<i32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 
 fn atomicXor_c1b78c() {
   var res : i32 = atomicXor(&(sb_rw.arg_0), 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   atomicXor_c1b78c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicXor_c1b78c();
 }
diff --git a/test/intrinsics/gen/atomicXor/c8e6be.wgsl b/test/intrinsics/gen/atomicXor/c8e6be.wgsl
index 0dbadf1..ce24118 100644
--- a/test/intrinsics/gen/atomicXor/c8e6be.wgsl
+++ b/test/intrinsics/gen/atomicXor/c8e6be.wgsl
@@ -29,7 +29,7 @@
   var res: u32 = atomicXor(&arg_0, 1u);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicXor_c8e6be();
 }
diff --git a/test/intrinsics/gen/atomicXor/c8e6be.wgsl.expected.wgsl b/test/intrinsics/gen/atomicXor/c8e6be.wgsl.expected.wgsl
index 938ed3d..d422ea0 100644
--- a/test/intrinsics/gen/atomicXor/c8e6be.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/atomicXor/c8e6be.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
   var res : u32 = atomicXor(&(arg_0), 1u);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   atomicXor_c8e6be();
 }
diff --git a/test/intrinsics/gen/ceil/34064b.wgsl b/test/intrinsics/gen/ceil/34064b.wgsl
index 3be3ad0..3d79d91 100644
--- a/test/intrinsics/gen/ceil/34064b.wgsl
+++ b/test/intrinsics/gen/ceil/34064b.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = ceil(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ceil_34064b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ceil_34064b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ceil_34064b();
 }
diff --git a/test/intrinsics/gen/ceil/34064b.wgsl.expected.wgsl b/test/intrinsics/gen/ceil/34064b.wgsl.expected.wgsl
index d67b150..a72e184 100644
--- a/test/intrinsics/gen/ceil/34064b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/ceil/34064b.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = ceil(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ceil_34064b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ceil_34064b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ceil_34064b();
 }
diff --git a/test/intrinsics/gen/ceil/678655.wgsl b/test/intrinsics/gen/ceil/678655.wgsl
index 0ba06bd..0a49b58 100644
--- a/test/intrinsics/gen/ceil/678655.wgsl
+++ b/test/intrinsics/gen/ceil/678655.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = ceil(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ceil_678655();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ceil_678655();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ceil_678655();
 }
diff --git a/test/intrinsics/gen/ceil/678655.wgsl.expected.wgsl b/test/intrinsics/gen/ceil/678655.wgsl.expected.wgsl
index 139e6de..bb57a0a 100644
--- a/test/intrinsics/gen/ceil/678655.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/ceil/678655.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = ceil(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ceil_678655();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ceil_678655();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ceil_678655();
 }
diff --git a/test/intrinsics/gen/ceil/96f597.wgsl b/test/intrinsics/gen/ceil/96f597.wgsl
index 63d6e1a..84647b9 100644
--- a/test/intrinsics/gen/ceil/96f597.wgsl
+++ b/test/intrinsics/gen/ceil/96f597.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = ceil(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ceil_96f597();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ceil_96f597();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ceil_96f597();
 }
diff --git a/test/intrinsics/gen/ceil/96f597.wgsl.expected.wgsl b/test/intrinsics/gen/ceil/96f597.wgsl.expected.wgsl
index 65004c4..bf6d138 100644
--- a/test/intrinsics/gen/ceil/96f597.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/ceil/96f597.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = ceil(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ceil_96f597();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ceil_96f597();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ceil_96f597();
 }
diff --git a/test/intrinsics/gen/ceil/b74c16.wgsl b/test/intrinsics/gen/ceil/b74c16.wgsl
index e5ca670..46a48b4 100644
--- a/test/intrinsics/gen/ceil/b74c16.wgsl
+++ b/test/intrinsics/gen/ceil/b74c16.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = ceil(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ceil_b74c16();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ceil_b74c16();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ceil_b74c16();
 }
diff --git a/test/intrinsics/gen/ceil/b74c16.wgsl.expected.wgsl b/test/intrinsics/gen/ceil/b74c16.wgsl.expected.wgsl
index 492a415..c019db4 100644
--- a/test/intrinsics/gen/ceil/b74c16.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/ceil/b74c16.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = ceil(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ceil_b74c16();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ceil_b74c16();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ceil_b74c16();
 }
diff --git a/test/intrinsics/gen/clamp/0acf8f.wgsl b/test/intrinsics/gen/clamp/0acf8f.wgsl
index 8ef1355..a55d7dc 100644
--- a/test/intrinsics/gen/clamp/0acf8f.wgsl
+++ b/test/intrinsics/gen/clamp/0acf8f.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = clamp(vec2<f32>(), vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_0acf8f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_0acf8f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_0acf8f();
 }
diff --git a/test/intrinsics/gen/clamp/0acf8f.wgsl.expected.wgsl b/test/intrinsics/gen/clamp/0acf8f.wgsl.expected.wgsl
index 08f126c..a6f58e5 100644
--- a/test/intrinsics/gen/clamp/0acf8f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/clamp/0acf8f.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = clamp(vec2<f32>(), vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_0acf8f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_0acf8f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_0acf8f();
 }
diff --git a/test/intrinsics/gen/clamp/1a32e3.wgsl b/test/intrinsics/gen/clamp/1a32e3.wgsl
index a52ae96..723c134 100644
--- a/test/intrinsics/gen/clamp/1a32e3.wgsl
+++ b/test/intrinsics/gen/clamp/1a32e3.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<i32> = clamp(vec4<i32>(), vec4<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_1a32e3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_1a32e3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_1a32e3();
 }
diff --git a/test/intrinsics/gen/clamp/1a32e3.wgsl.expected.wgsl b/test/intrinsics/gen/clamp/1a32e3.wgsl.expected.wgsl
index 59887fc..4ca8d1e 100644
--- a/test/intrinsics/gen/clamp/1a32e3.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/clamp/1a32e3.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<i32> = clamp(vec4<i32>(), vec4<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_1a32e3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_1a32e3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_1a32e3();
 }
diff --git a/test/intrinsics/gen/clamp/2bd567.wgsl b/test/intrinsics/gen/clamp/2bd567.wgsl
index 6e280b5..e8d2ed2 100644
--- a/test/intrinsics/gen/clamp/2bd567.wgsl
+++ b/test/intrinsics/gen/clamp/2bd567.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = clamp(1.0, 1.0, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_2bd567();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_2bd567();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_2bd567();
 }
diff --git a/test/intrinsics/gen/clamp/2bd567.wgsl.expected.wgsl b/test/intrinsics/gen/clamp/2bd567.wgsl.expected.wgsl
index 5e338a5..fdd1c3c 100644
--- a/test/intrinsics/gen/clamp/2bd567.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/clamp/2bd567.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = clamp(1.0, 1.0, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_2bd567();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_2bd567();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_2bd567();
 }
diff --git a/test/intrinsics/gen/clamp/2bde41.wgsl b/test/intrinsics/gen/clamp/2bde41.wgsl
index 7a46d6a..582549c 100644
--- a/test/intrinsics/gen/clamp/2bde41.wgsl
+++ b/test/intrinsics/gen/clamp/2bde41.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = clamp(vec4<f32>(), vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_2bde41();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_2bde41();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_2bde41();
 }
diff --git a/test/intrinsics/gen/clamp/2bde41.wgsl.expected.wgsl b/test/intrinsics/gen/clamp/2bde41.wgsl.expected.wgsl
index 091e04c..21f3a2d 100644
--- a/test/intrinsics/gen/clamp/2bde41.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/clamp/2bde41.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = clamp(vec4<f32>(), vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_2bde41();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_2bde41();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_2bde41();
 }
diff --git a/test/intrinsics/gen/clamp/548fc7.wgsl b/test/intrinsics/gen/clamp/548fc7.wgsl
index 696b661..8863032 100644
--- a/test/intrinsics/gen/clamp/548fc7.wgsl
+++ b/test/intrinsics/gen/clamp/548fc7.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<u32> = clamp(vec3<u32>(), vec3<u32>(), vec3<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_548fc7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_548fc7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_548fc7();
 }
diff --git a/test/intrinsics/gen/clamp/548fc7.wgsl.expected.wgsl b/test/intrinsics/gen/clamp/548fc7.wgsl.expected.wgsl
index 67ef881..05f4d9e 100644
--- a/test/intrinsics/gen/clamp/548fc7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/clamp/548fc7.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<u32> = clamp(vec3<u32>(), vec3<u32>(), vec3<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_548fc7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_548fc7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_548fc7();
 }
diff --git a/test/intrinsics/gen/clamp/5f0819.wgsl b/test/intrinsics/gen/clamp/5f0819.wgsl
index 2dd85e2..c128db4 100644
--- a/test/intrinsics/gen/clamp/5f0819.wgsl
+++ b/test/intrinsics/gen/clamp/5f0819.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<i32> = clamp(vec3<i32>(), vec3<i32>(), vec3<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_5f0819();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_5f0819();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_5f0819();
 }
diff --git a/test/intrinsics/gen/clamp/5f0819.wgsl.expected.wgsl b/test/intrinsics/gen/clamp/5f0819.wgsl.expected.wgsl
index 3a47502..6265d72 100644
--- a/test/intrinsics/gen/clamp/5f0819.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/clamp/5f0819.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<i32> = clamp(vec3<i32>(), vec3<i32>(), vec3<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_5f0819();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_5f0819();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_5f0819();
 }
diff --git a/test/intrinsics/gen/clamp/6c1749.wgsl b/test/intrinsics/gen/clamp/6c1749.wgsl
index 30eae79..3592939 100644
--- a/test/intrinsics/gen/clamp/6c1749.wgsl
+++ b/test/intrinsics/gen/clamp/6c1749.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<i32> = clamp(vec2<i32>(), vec2<i32>(), vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_6c1749();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_6c1749();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_6c1749();
 }
diff --git a/test/intrinsics/gen/clamp/6c1749.wgsl.expected.wgsl b/test/intrinsics/gen/clamp/6c1749.wgsl.expected.wgsl
index 7047f4d..58ea370 100644
--- a/test/intrinsics/gen/clamp/6c1749.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/clamp/6c1749.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<i32> = clamp(vec2<i32>(), vec2<i32>(), vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_6c1749();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_6c1749();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_6c1749();
 }
diff --git a/test/intrinsics/gen/clamp/7706d7.wgsl b/test/intrinsics/gen/clamp/7706d7.wgsl
index 88badad..5e648fe 100644
--- a/test/intrinsics/gen/clamp/7706d7.wgsl
+++ b/test/intrinsics/gen/clamp/7706d7.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<u32> = clamp(vec2<u32>(), vec2<u32>(), vec2<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_7706d7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_7706d7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_7706d7();
 }
diff --git a/test/intrinsics/gen/clamp/7706d7.wgsl.expected.wgsl b/test/intrinsics/gen/clamp/7706d7.wgsl.expected.wgsl
index 0d83014..b21343c 100644
--- a/test/intrinsics/gen/clamp/7706d7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/clamp/7706d7.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<u32> = clamp(vec2<u32>(), vec2<u32>(), vec2<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_7706d7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_7706d7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_7706d7();
 }
diff --git a/test/intrinsics/gen/clamp/867397.wgsl b/test/intrinsics/gen/clamp/867397.wgsl
index fdcf1f3..96596d0 100644
--- a/test/intrinsics/gen/clamp/867397.wgsl
+++ b/test/intrinsics/gen/clamp/867397.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = clamp(vec3<f32>(), vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_867397();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_867397();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_867397();
 }
diff --git a/test/intrinsics/gen/clamp/867397.wgsl.expected.wgsl b/test/intrinsics/gen/clamp/867397.wgsl.expected.wgsl
index 38fde0a..0c74877 100644
--- a/test/intrinsics/gen/clamp/867397.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/clamp/867397.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = clamp(vec3<f32>(), vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_867397();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_867397();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_867397();
 }
diff --git a/test/intrinsics/gen/clamp/a2de25.wgsl b/test/intrinsics/gen/clamp/a2de25.wgsl
index e0c41c7..403c5bf 100644
--- a/test/intrinsics/gen/clamp/a2de25.wgsl
+++ b/test/intrinsics/gen/clamp/a2de25.wgsl
@@ -28,18 +28,18 @@
   var res: u32 = clamp(1u, 1u, 1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_a2de25();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_a2de25();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_a2de25();
 }
diff --git a/test/intrinsics/gen/clamp/a2de25.wgsl.expected.wgsl b/test/intrinsics/gen/clamp/a2de25.wgsl.expected.wgsl
index 70dc29b..28aa330 100644
--- a/test/intrinsics/gen/clamp/a2de25.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/clamp/a2de25.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : u32 = clamp(1u, 1u, 1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_a2de25();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_a2de25();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_a2de25();
 }
diff --git a/test/intrinsics/gen/clamp/b07c65.wgsl b/test/intrinsics/gen/clamp/b07c65.wgsl
index d285b90..1d18709 100644
--- a/test/intrinsics/gen/clamp/b07c65.wgsl
+++ b/test/intrinsics/gen/clamp/b07c65.wgsl
@@ -28,18 +28,18 @@
   var res: i32 = clamp(1, 1, 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_b07c65();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_b07c65();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_b07c65();
 }
diff --git a/test/intrinsics/gen/clamp/b07c65.wgsl.expected.wgsl b/test/intrinsics/gen/clamp/b07c65.wgsl.expected.wgsl
index ddab54b..3ed77bc 100644
--- a/test/intrinsics/gen/clamp/b07c65.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/clamp/b07c65.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : i32 = clamp(1, 1, 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_b07c65();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_b07c65();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_b07c65();
 }
diff --git a/test/intrinsics/gen/clamp/bd43ce.wgsl b/test/intrinsics/gen/clamp/bd43ce.wgsl
index 16a43fb..45085ef 100644
--- a/test/intrinsics/gen/clamp/bd43ce.wgsl
+++ b/test/intrinsics/gen/clamp/bd43ce.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<u32> = clamp(vec4<u32>(), vec4<u32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_bd43ce();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_bd43ce();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_bd43ce();
 }
diff --git a/test/intrinsics/gen/clamp/bd43ce.wgsl.expected.wgsl b/test/intrinsics/gen/clamp/bd43ce.wgsl.expected.wgsl
index 00f69c5..51f94ba 100644
--- a/test/intrinsics/gen/clamp/bd43ce.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/clamp/bd43ce.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<u32> = clamp(vec4<u32>(), vec4<u32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   clamp_bd43ce();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   clamp_bd43ce();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   clamp_bd43ce();
 }
diff --git a/test/intrinsics/gen/cos/16dc15.wgsl b/test/intrinsics/gen/cos/16dc15.wgsl
index 9ca499a..9f92844 100644
--- a/test/intrinsics/gen/cos/16dc15.wgsl
+++ b/test/intrinsics/gen/cos/16dc15.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = cos(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   cos_16dc15();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   cos_16dc15();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   cos_16dc15();
 }
diff --git a/test/intrinsics/gen/cos/16dc15.wgsl.expected.wgsl b/test/intrinsics/gen/cos/16dc15.wgsl.expected.wgsl
index bd4f752..fb24d34 100644
--- a/test/intrinsics/gen/cos/16dc15.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/cos/16dc15.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = cos(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   cos_16dc15();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   cos_16dc15();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   cos_16dc15();
 }
diff --git a/test/intrinsics/gen/cos/29d66d.wgsl b/test/intrinsics/gen/cos/29d66d.wgsl
index bd16f34..d0082a4 100644
--- a/test/intrinsics/gen/cos/29d66d.wgsl
+++ b/test/intrinsics/gen/cos/29d66d.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = cos(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   cos_29d66d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   cos_29d66d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   cos_29d66d();
 }
diff --git a/test/intrinsics/gen/cos/29d66d.wgsl.expected.wgsl b/test/intrinsics/gen/cos/29d66d.wgsl.expected.wgsl
index 466a4db..7bd0947 100644
--- a/test/intrinsics/gen/cos/29d66d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/cos/29d66d.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = cos(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   cos_29d66d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   cos_29d66d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   cos_29d66d();
 }
diff --git a/test/intrinsics/gen/cos/c3b486.wgsl b/test/intrinsics/gen/cos/c3b486.wgsl
index afc2d9d..58bf973 100644
--- a/test/intrinsics/gen/cos/c3b486.wgsl
+++ b/test/intrinsics/gen/cos/c3b486.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = cos(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   cos_c3b486();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   cos_c3b486();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   cos_c3b486();
 }
diff --git a/test/intrinsics/gen/cos/c3b486.wgsl.expected.wgsl b/test/intrinsics/gen/cos/c3b486.wgsl.expected.wgsl
index b6ebf94..3dfb7da 100644
--- a/test/intrinsics/gen/cos/c3b486.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/cos/c3b486.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = cos(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   cos_c3b486();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   cos_c3b486();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   cos_c3b486();
 }
diff --git a/test/intrinsics/gen/cos/c5c28e.wgsl b/test/intrinsics/gen/cos/c5c28e.wgsl
index 7d8990d..249a587 100644
--- a/test/intrinsics/gen/cos/c5c28e.wgsl
+++ b/test/intrinsics/gen/cos/c5c28e.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = cos(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   cos_c5c28e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   cos_c5c28e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   cos_c5c28e();
 }
diff --git a/test/intrinsics/gen/cos/c5c28e.wgsl.expected.wgsl b/test/intrinsics/gen/cos/c5c28e.wgsl.expected.wgsl
index f3a7337..e298621 100644
--- a/test/intrinsics/gen/cos/c5c28e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/cos/c5c28e.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = cos(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   cos_c5c28e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   cos_c5c28e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   cos_c5c28e();
 }
diff --git a/test/intrinsics/gen/cosh/377652.wgsl b/test/intrinsics/gen/cosh/377652.wgsl
index b7dc4f1..b528307 100644
--- a/test/intrinsics/gen/cosh/377652.wgsl
+++ b/test/intrinsics/gen/cosh/377652.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = cosh(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   cosh_377652();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   cosh_377652();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   cosh_377652();
 }
diff --git a/test/intrinsics/gen/cosh/377652.wgsl.expected.wgsl b/test/intrinsics/gen/cosh/377652.wgsl.expected.wgsl
index cce3776..bfcc51a 100644
--- a/test/intrinsics/gen/cosh/377652.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/cosh/377652.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = cosh(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   cosh_377652();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   cosh_377652();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   cosh_377652();
 }
diff --git a/test/intrinsics/gen/cosh/c13756.wgsl b/test/intrinsics/gen/cosh/c13756.wgsl
index 635c6da..fa11315 100644
--- a/test/intrinsics/gen/cosh/c13756.wgsl
+++ b/test/intrinsics/gen/cosh/c13756.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = cosh(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   cosh_c13756();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   cosh_c13756();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   cosh_c13756();
 }
diff --git a/test/intrinsics/gen/cosh/c13756.wgsl.expected.wgsl b/test/intrinsics/gen/cosh/c13756.wgsl.expected.wgsl
index b949555..3940b8e 100644
--- a/test/intrinsics/gen/cosh/c13756.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/cosh/c13756.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = cosh(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   cosh_c13756();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   cosh_c13756();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   cosh_c13756();
 }
diff --git a/test/intrinsics/gen/cosh/da92dd.wgsl b/test/intrinsics/gen/cosh/da92dd.wgsl
index fd939da..59eb8df 100644
--- a/test/intrinsics/gen/cosh/da92dd.wgsl
+++ b/test/intrinsics/gen/cosh/da92dd.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = cosh(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   cosh_da92dd();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   cosh_da92dd();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   cosh_da92dd();
 }
diff --git a/test/intrinsics/gen/cosh/da92dd.wgsl.expected.wgsl b/test/intrinsics/gen/cosh/da92dd.wgsl.expected.wgsl
index f79c746..e653a5c 100644
--- a/test/intrinsics/gen/cosh/da92dd.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/cosh/da92dd.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = cosh(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   cosh_da92dd();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   cosh_da92dd();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   cosh_da92dd();
 }
diff --git a/test/intrinsics/gen/cosh/e0c1de.wgsl b/test/intrinsics/gen/cosh/e0c1de.wgsl
index f6e958c..961d55f 100644
--- a/test/intrinsics/gen/cosh/e0c1de.wgsl
+++ b/test/intrinsics/gen/cosh/e0c1de.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = cosh(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   cosh_e0c1de();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   cosh_e0c1de();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   cosh_e0c1de();
 }
diff --git a/test/intrinsics/gen/cosh/e0c1de.wgsl.expected.wgsl b/test/intrinsics/gen/cosh/e0c1de.wgsl.expected.wgsl
index 1a86db7..64b0a08 100644
--- a/test/intrinsics/gen/cosh/e0c1de.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/cosh/e0c1de.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = cosh(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   cosh_e0c1de();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   cosh_e0c1de();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   cosh_e0c1de();
 }
diff --git a/test/intrinsics/gen/countOneBits/0d0e46.wgsl b/test/intrinsics/gen/countOneBits/0d0e46.wgsl
index ca8afcb..dc6b49e 100644
--- a/test/intrinsics/gen/countOneBits/0d0e46.wgsl
+++ b/test/intrinsics/gen/countOneBits/0d0e46.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<u32> = countOneBits(vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   countOneBits_0d0e46();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   countOneBits_0d0e46();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   countOneBits_0d0e46();
 }
diff --git a/test/intrinsics/gen/countOneBits/0d0e46.wgsl.expected.wgsl b/test/intrinsics/gen/countOneBits/0d0e46.wgsl.expected.wgsl
index f0d484a..271af00 100644
--- a/test/intrinsics/gen/countOneBits/0d0e46.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/countOneBits/0d0e46.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<u32> = countOneBits(vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   countOneBits_0d0e46();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   countOneBits_0d0e46();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   countOneBits_0d0e46();
 }
diff --git a/test/intrinsics/gen/countOneBits/0f7980.wgsl b/test/intrinsics/gen/countOneBits/0f7980.wgsl
index 569a857..cf4b27b 100644
--- a/test/intrinsics/gen/countOneBits/0f7980.wgsl
+++ b/test/intrinsics/gen/countOneBits/0f7980.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<i32> = countOneBits(vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   countOneBits_0f7980();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   countOneBits_0f7980();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   countOneBits_0f7980();
 }
diff --git a/test/intrinsics/gen/countOneBits/0f7980.wgsl.expected.wgsl b/test/intrinsics/gen/countOneBits/0f7980.wgsl.expected.wgsl
index e2529f4..1291aa3 100644
--- a/test/intrinsics/gen/countOneBits/0f7980.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/countOneBits/0f7980.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<i32> = countOneBits(vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   countOneBits_0f7980();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   countOneBits_0f7980();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   countOneBits_0f7980();
 }
diff --git a/test/intrinsics/gen/countOneBits/65d2ae.wgsl b/test/intrinsics/gen/countOneBits/65d2ae.wgsl
index 625620c..ba29117 100644
--- a/test/intrinsics/gen/countOneBits/65d2ae.wgsl
+++ b/test/intrinsics/gen/countOneBits/65d2ae.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<i32> = countOneBits(vec3<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   countOneBits_65d2ae();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   countOneBits_65d2ae();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   countOneBits_65d2ae();
 }
diff --git a/test/intrinsics/gen/countOneBits/65d2ae.wgsl.expected.wgsl b/test/intrinsics/gen/countOneBits/65d2ae.wgsl.expected.wgsl
index 4afc66d..e142860 100644
--- a/test/intrinsics/gen/countOneBits/65d2ae.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/countOneBits/65d2ae.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<i32> = countOneBits(vec3<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   countOneBits_65d2ae();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   countOneBits_65d2ae();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   countOneBits_65d2ae();
 }
diff --git a/test/intrinsics/gen/countOneBits/690cfc.wgsl b/test/intrinsics/gen/countOneBits/690cfc.wgsl
index 555889d..77ce9c4 100644
--- a/test/intrinsics/gen/countOneBits/690cfc.wgsl
+++ b/test/intrinsics/gen/countOneBits/690cfc.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<u32> = countOneBits(vec3<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   countOneBits_690cfc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   countOneBits_690cfc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   countOneBits_690cfc();
 }
diff --git a/test/intrinsics/gen/countOneBits/690cfc.wgsl.expected.wgsl b/test/intrinsics/gen/countOneBits/690cfc.wgsl.expected.wgsl
index 7ca3c8e..b74eb79 100644
--- a/test/intrinsics/gen/countOneBits/690cfc.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/countOneBits/690cfc.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<u32> = countOneBits(vec3<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   countOneBits_690cfc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   countOneBits_690cfc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   countOneBits_690cfc();
 }
diff --git a/test/intrinsics/gen/countOneBits/94fd81.wgsl b/test/intrinsics/gen/countOneBits/94fd81.wgsl
index e39137e..ec7f081 100644
--- a/test/intrinsics/gen/countOneBits/94fd81.wgsl
+++ b/test/intrinsics/gen/countOneBits/94fd81.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<u32> = countOneBits(vec2<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   countOneBits_94fd81();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   countOneBits_94fd81();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   countOneBits_94fd81();
 }
diff --git a/test/intrinsics/gen/countOneBits/94fd81.wgsl.expected.wgsl b/test/intrinsics/gen/countOneBits/94fd81.wgsl.expected.wgsl
index a5711ac..e713f92 100644
--- a/test/intrinsics/gen/countOneBits/94fd81.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/countOneBits/94fd81.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<u32> = countOneBits(vec2<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   countOneBits_94fd81();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   countOneBits_94fd81();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   countOneBits_94fd81();
 }
diff --git a/test/intrinsics/gen/countOneBits/ae44f9.wgsl b/test/intrinsics/gen/countOneBits/ae44f9.wgsl
index 2c31ae7..db56395 100644
--- a/test/intrinsics/gen/countOneBits/ae44f9.wgsl
+++ b/test/intrinsics/gen/countOneBits/ae44f9.wgsl
@@ -28,18 +28,18 @@
   var res: u32 = countOneBits(1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   countOneBits_ae44f9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   countOneBits_ae44f9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   countOneBits_ae44f9();
 }
diff --git a/test/intrinsics/gen/countOneBits/ae44f9.wgsl.expected.wgsl b/test/intrinsics/gen/countOneBits/ae44f9.wgsl.expected.wgsl
index 0591a40..3a54993 100644
--- a/test/intrinsics/gen/countOneBits/ae44f9.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/countOneBits/ae44f9.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : u32 = countOneBits(1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   countOneBits_ae44f9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   countOneBits_ae44f9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   countOneBits_ae44f9();
 }
diff --git a/test/intrinsics/gen/countOneBits/af90e2.wgsl b/test/intrinsics/gen/countOneBits/af90e2.wgsl
index 4cf6b08..f57048c 100644
--- a/test/intrinsics/gen/countOneBits/af90e2.wgsl
+++ b/test/intrinsics/gen/countOneBits/af90e2.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<i32> = countOneBits(vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   countOneBits_af90e2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   countOneBits_af90e2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   countOneBits_af90e2();
 }
diff --git a/test/intrinsics/gen/countOneBits/af90e2.wgsl.expected.wgsl b/test/intrinsics/gen/countOneBits/af90e2.wgsl.expected.wgsl
index 5a6fdaa..c2d693a 100644
--- a/test/intrinsics/gen/countOneBits/af90e2.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/countOneBits/af90e2.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<i32> = countOneBits(vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   countOneBits_af90e2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   countOneBits_af90e2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   countOneBits_af90e2();
 }
diff --git a/test/intrinsics/gen/countOneBits/fd88b2.wgsl b/test/intrinsics/gen/countOneBits/fd88b2.wgsl
index 5213267..f95dcc2 100644
--- a/test/intrinsics/gen/countOneBits/fd88b2.wgsl
+++ b/test/intrinsics/gen/countOneBits/fd88b2.wgsl
@@ -28,18 +28,18 @@
   var res: i32 = countOneBits(1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   countOneBits_fd88b2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   countOneBits_fd88b2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   countOneBits_fd88b2();
 }
diff --git a/test/intrinsics/gen/countOneBits/fd88b2.wgsl.expected.wgsl b/test/intrinsics/gen/countOneBits/fd88b2.wgsl.expected.wgsl
index e1b4ef2..c9e437b 100644
--- a/test/intrinsics/gen/countOneBits/fd88b2.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/countOneBits/fd88b2.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : i32 = countOneBits(1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   countOneBits_fd88b2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   countOneBits_fd88b2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   countOneBits_fd88b2();
 }
diff --git a/test/intrinsics/gen/cross/041cb0.wgsl b/test/intrinsics/gen/cross/041cb0.wgsl
index 38427b6..50f8539 100644
--- a/test/intrinsics/gen/cross/041cb0.wgsl
+++ b/test/intrinsics/gen/cross/041cb0.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = cross(vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   cross_041cb0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   cross_041cb0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   cross_041cb0();
 }
diff --git a/test/intrinsics/gen/cross/041cb0.wgsl.expected.wgsl b/test/intrinsics/gen/cross/041cb0.wgsl.expected.wgsl
index b650bd4..c3548ce 100644
--- a/test/intrinsics/gen/cross/041cb0.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/cross/041cb0.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = cross(vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   cross_041cb0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   cross_041cb0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   cross_041cb0();
 }
diff --git a/test/intrinsics/gen/degrees/0d170c.wgsl b/test/intrinsics/gen/degrees/0d170c.wgsl
index c1bb01e..b2ee663 100644
--- a/test/intrinsics/gen/degrees/0d170c.wgsl
+++ b/test/intrinsics/gen/degrees/0d170c.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = degrees(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   degrees_0d170c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   degrees_0d170c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   degrees_0d170c();
 }
diff --git a/test/intrinsics/gen/degrees/0d170c.wgsl.expected.wgsl b/test/intrinsics/gen/degrees/0d170c.wgsl.expected.wgsl
index fa7bd7c..6c62108 100644
--- a/test/intrinsics/gen/degrees/0d170c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/degrees/0d170c.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = degrees(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   degrees_0d170c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   degrees_0d170c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   degrees_0d170c();
 }
diff --git a/test/intrinsics/gen/degrees/1ad5df.wgsl b/test/intrinsics/gen/degrees/1ad5df.wgsl
index ce4a3cb..b4c46db 100644
--- a/test/intrinsics/gen/degrees/1ad5df.wgsl
+++ b/test/intrinsics/gen/degrees/1ad5df.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = degrees(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   degrees_1ad5df();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   degrees_1ad5df();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   degrees_1ad5df();
 }
diff --git a/test/intrinsics/gen/degrees/1ad5df.wgsl.expected.wgsl b/test/intrinsics/gen/degrees/1ad5df.wgsl.expected.wgsl
index 09968ce..db91a65 100644
--- a/test/intrinsics/gen/degrees/1ad5df.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/degrees/1ad5df.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = degrees(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   degrees_1ad5df();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   degrees_1ad5df();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   degrees_1ad5df();
 }
diff --git a/test/intrinsics/gen/degrees/2af623.wgsl b/test/intrinsics/gen/degrees/2af623.wgsl
index bf8e6cb..22772dd 100644
--- a/test/intrinsics/gen/degrees/2af623.wgsl
+++ b/test/intrinsics/gen/degrees/2af623.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = degrees(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   degrees_2af623();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   degrees_2af623();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   degrees_2af623();
 }
diff --git a/test/intrinsics/gen/degrees/2af623.wgsl.expected.wgsl b/test/intrinsics/gen/degrees/2af623.wgsl.expected.wgsl
index fc42984..d3af418 100644
--- a/test/intrinsics/gen/degrees/2af623.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/degrees/2af623.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = degrees(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   degrees_2af623();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   degrees_2af623();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   degrees_2af623();
 }
diff --git a/test/intrinsics/gen/degrees/51f705.wgsl b/test/intrinsics/gen/degrees/51f705.wgsl
index 2bbd952..71c2e93 100644
--- a/test/intrinsics/gen/degrees/51f705.wgsl
+++ b/test/intrinsics/gen/degrees/51f705.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = degrees(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   degrees_51f705();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   degrees_51f705();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   degrees_51f705();
 }
diff --git a/test/intrinsics/gen/degrees/51f705.wgsl.expected.wgsl b/test/intrinsics/gen/degrees/51f705.wgsl.expected.wgsl
index 6524f5b..5ec8b91 100644
--- a/test/intrinsics/gen/degrees/51f705.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/degrees/51f705.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = degrees(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   degrees_51f705();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   degrees_51f705();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   degrees_51f705();
 }
diff --git a/test/intrinsics/gen/determinant/2b62ba.wgsl b/test/intrinsics/gen/determinant/2b62ba.wgsl
index 2b24d16..10fd4e4 100644
--- a/test/intrinsics/gen/determinant/2b62ba.wgsl
+++ b/test/intrinsics/gen/determinant/2b62ba.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = determinant(mat3x3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   determinant_2b62ba();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   determinant_2b62ba();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   determinant_2b62ba();
 }
diff --git a/test/intrinsics/gen/determinant/2b62ba.wgsl.expected.wgsl b/test/intrinsics/gen/determinant/2b62ba.wgsl.expected.wgsl
index a2ee672..b9c8bcd 100644
--- a/test/intrinsics/gen/determinant/2b62ba.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/determinant/2b62ba.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = determinant(mat3x3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   determinant_2b62ba();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   determinant_2b62ba();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   determinant_2b62ba();
 }
diff --git a/test/intrinsics/gen/determinant/a0a87c.wgsl b/test/intrinsics/gen/determinant/a0a87c.wgsl
index 9ce49d9..b7720f5 100644
--- a/test/intrinsics/gen/determinant/a0a87c.wgsl
+++ b/test/intrinsics/gen/determinant/a0a87c.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = determinant(mat4x4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   determinant_a0a87c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   determinant_a0a87c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   determinant_a0a87c();
 }
diff --git a/test/intrinsics/gen/determinant/a0a87c.wgsl.expected.wgsl b/test/intrinsics/gen/determinant/a0a87c.wgsl.expected.wgsl
index 948c1dc..1352baf 100644
--- a/test/intrinsics/gen/determinant/a0a87c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/determinant/a0a87c.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = determinant(mat4x4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   determinant_a0a87c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   determinant_a0a87c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   determinant_a0a87c();
 }
diff --git a/test/intrinsics/gen/determinant/e19305.wgsl b/test/intrinsics/gen/determinant/e19305.wgsl
index f930316..1406a13 100644
--- a/test/intrinsics/gen/determinant/e19305.wgsl
+++ b/test/intrinsics/gen/determinant/e19305.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = determinant(mat2x2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   determinant_e19305();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   determinant_e19305();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   determinant_e19305();
 }
diff --git a/test/intrinsics/gen/determinant/e19305.wgsl.expected.wgsl b/test/intrinsics/gen/determinant/e19305.wgsl.expected.wgsl
index 418bbd7..67724c6 100644
--- a/test/intrinsics/gen/determinant/e19305.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/determinant/e19305.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = determinant(mat2x2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   determinant_e19305();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   determinant_e19305();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   determinant_e19305();
 }
diff --git a/test/intrinsics/gen/distance/0657d4.wgsl b/test/intrinsics/gen/distance/0657d4.wgsl
index bb646dd..2c57d82 100644
--- a/test/intrinsics/gen/distance/0657d4.wgsl
+++ b/test/intrinsics/gen/distance/0657d4.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = distance(vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   distance_0657d4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   distance_0657d4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   distance_0657d4();
 }
diff --git a/test/intrinsics/gen/distance/0657d4.wgsl.expected.wgsl b/test/intrinsics/gen/distance/0657d4.wgsl.expected.wgsl
index 49a4c4f..1945bbb 100644
--- a/test/intrinsics/gen/distance/0657d4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/distance/0657d4.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = distance(vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   distance_0657d4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   distance_0657d4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   distance_0657d4();
 }
diff --git a/test/intrinsics/gen/distance/9646ea.wgsl b/test/intrinsics/gen/distance/9646ea.wgsl
index f41be54..009877c 100644
--- a/test/intrinsics/gen/distance/9646ea.wgsl
+++ b/test/intrinsics/gen/distance/9646ea.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = distance(vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   distance_9646ea();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   distance_9646ea();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   distance_9646ea();
 }
diff --git a/test/intrinsics/gen/distance/9646ea.wgsl.expected.wgsl b/test/intrinsics/gen/distance/9646ea.wgsl.expected.wgsl
index 81a8e1a..0e02dff 100644
--- a/test/intrinsics/gen/distance/9646ea.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/distance/9646ea.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = distance(vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   distance_9646ea();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   distance_9646ea();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   distance_9646ea();
 }
diff --git a/test/intrinsics/gen/distance/aa4055.wgsl b/test/intrinsics/gen/distance/aa4055.wgsl
index ae403c7..0094477 100644
--- a/test/intrinsics/gen/distance/aa4055.wgsl
+++ b/test/intrinsics/gen/distance/aa4055.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = distance(vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   distance_aa4055();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   distance_aa4055();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   distance_aa4055();
 }
diff --git a/test/intrinsics/gen/distance/aa4055.wgsl.expected.wgsl b/test/intrinsics/gen/distance/aa4055.wgsl.expected.wgsl
index 5043729..307399d 100644
--- a/test/intrinsics/gen/distance/aa4055.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/distance/aa4055.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = distance(vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   distance_aa4055();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   distance_aa4055();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   distance_aa4055();
 }
diff --git a/test/intrinsics/gen/distance/cfed73.wgsl b/test/intrinsics/gen/distance/cfed73.wgsl
index a14dc1b..c40408d 100644
--- a/test/intrinsics/gen/distance/cfed73.wgsl
+++ b/test/intrinsics/gen/distance/cfed73.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = distance(1.0, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   distance_cfed73();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   distance_cfed73();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   distance_cfed73();
 }
diff --git a/test/intrinsics/gen/distance/cfed73.wgsl.expected.wgsl b/test/intrinsics/gen/distance/cfed73.wgsl.expected.wgsl
index 86ed9e5..db5bc7d 100644
--- a/test/intrinsics/gen/distance/cfed73.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/distance/cfed73.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = distance(1.0, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   distance_cfed73();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   distance_cfed73();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   distance_cfed73();
 }
diff --git a/test/intrinsics/gen/dot/0c577b.wgsl b/test/intrinsics/gen/dot/0c577b.wgsl
index 304528f..745f4c4 100644
--- a/test/intrinsics/gen/dot/0c577b.wgsl
+++ b/test/intrinsics/gen/dot/0c577b.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = dot(vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   dot_0c577b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dot_0c577b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   dot_0c577b();
 }
diff --git a/test/intrinsics/gen/dot/0c577b.wgsl.expected.wgsl b/test/intrinsics/gen/dot/0c577b.wgsl.expected.wgsl
index 8c624bb..22411b9 100644
--- a/test/intrinsics/gen/dot/0c577b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dot/0c577b.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = dot(vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   dot_0c577b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dot_0c577b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   dot_0c577b();
 }
diff --git a/test/intrinsics/gen/dot/7548a0.wgsl b/test/intrinsics/gen/dot/7548a0.wgsl
index 62d39d6..4ee9011 100644
--- a/test/intrinsics/gen/dot/7548a0.wgsl
+++ b/test/intrinsics/gen/dot/7548a0.wgsl
@@ -28,18 +28,18 @@
   var res: u32 = dot(vec3<u32>(), vec3<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   dot_7548a0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dot_7548a0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   dot_7548a0();
 }
diff --git a/test/intrinsics/gen/dot/7548a0.wgsl.expected.wgsl b/test/intrinsics/gen/dot/7548a0.wgsl.expected.wgsl
index 27b8265..c8b9017 100644
--- a/test/intrinsics/gen/dot/7548a0.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dot/7548a0.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : u32 = dot(vec3<u32>(), vec3<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   dot_7548a0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dot_7548a0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   dot_7548a0();
 }
diff --git a/test/intrinsics/gen/dot/883f0e.wgsl b/test/intrinsics/gen/dot/883f0e.wgsl
index 4d73292..3a42f8c 100644
--- a/test/intrinsics/gen/dot/883f0e.wgsl
+++ b/test/intrinsics/gen/dot/883f0e.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = dot(vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   dot_883f0e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dot_883f0e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   dot_883f0e();
 }
diff --git a/test/intrinsics/gen/dot/883f0e.wgsl.expected.wgsl b/test/intrinsics/gen/dot/883f0e.wgsl.expected.wgsl
index c27252a..4be39c5 100644
--- a/test/intrinsics/gen/dot/883f0e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dot/883f0e.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = dot(vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   dot_883f0e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dot_883f0e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   dot_883f0e();
 }
diff --git a/test/intrinsics/gen/dot/97c7ee.wgsl b/test/intrinsics/gen/dot/97c7ee.wgsl
index d2e7e5d..c8f9459 100644
--- a/test/intrinsics/gen/dot/97c7ee.wgsl
+++ b/test/intrinsics/gen/dot/97c7ee.wgsl
@@ -28,18 +28,18 @@
   var res: u32 = dot(vec2<u32>(), vec2<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   dot_97c7ee();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dot_97c7ee();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   dot_97c7ee();
 }
diff --git a/test/intrinsics/gen/dot/97c7ee.wgsl.expected.wgsl b/test/intrinsics/gen/dot/97c7ee.wgsl.expected.wgsl
index 7741f7d..488052d 100644
--- a/test/intrinsics/gen/dot/97c7ee.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dot/97c7ee.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : u32 = dot(vec2<u32>(), vec2<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   dot_97c7ee();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dot_97c7ee();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   dot_97c7ee();
 }
diff --git a/test/intrinsics/gen/dot/ba4246.wgsl b/test/intrinsics/gen/dot/ba4246.wgsl
index b64f32b..fbeb139 100644
--- a/test/intrinsics/gen/dot/ba4246.wgsl
+++ b/test/intrinsics/gen/dot/ba4246.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = dot(vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   dot_ba4246();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dot_ba4246();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   dot_ba4246();
 }
diff --git a/test/intrinsics/gen/dot/ba4246.wgsl.expected.wgsl b/test/intrinsics/gen/dot/ba4246.wgsl.expected.wgsl
index 52ca2da..7ddc8d1 100644
--- a/test/intrinsics/gen/dot/ba4246.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dot/ba4246.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = dot(vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   dot_ba4246();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dot_ba4246();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   dot_ba4246();
 }
diff --git a/test/intrinsics/gen/dot/e994c7.wgsl b/test/intrinsics/gen/dot/e994c7.wgsl
index 8ffe117..b78cbc4 100644
--- a/test/intrinsics/gen/dot/e994c7.wgsl
+++ b/test/intrinsics/gen/dot/e994c7.wgsl
@@ -28,18 +28,18 @@
   var res: u32 = dot(vec4<u32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   dot_e994c7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dot_e994c7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   dot_e994c7();
 }
diff --git a/test/intrinsics/gen/dot/e994c7.wgsl.expected.wgsl b/test/intrinsics/gen/dot/e994c7.wgsl.expected.wgsl
index 365e0ce..2b54959 100644
--- a/test/intrinsics/gen/dot/e994c7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dot/e994c7.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : u32 = dot(vec4<u32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   dot_e994c7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dot_e994c7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   dot_e994c7();
 }
diff --git a/test/intrinsics/gen/dot/ef6b1d.wgsl b/test/intrinsics/gen/dot/ef6b1d.wgsl
index b6e5eac..2e01ee2 100644
--- a/test/intrinsics/gen/dot/ef6b1d.wgsl
+++ b/test/intrinsics/gen/dot/ef6b1d.wgsl
@@ -28,18 +28,18 @@
   var res: i32 = dot(vec4<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   dot_ef6b1d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dot_ef6b1d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   dot_ef6b1d();
 }
diff --git a/test/intrinsics/gen/dot/ef6b1d.wgsl.expected.wgsl b/test/intrinsics/gen/dot/ef6b1d.wgsl.expected.wgsl
index 4c35395..075cfcd 100644
--- a/test/intrinsics/gen/dot/ef6b1d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dot/ef6b1d.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : i32 = dot(vec4<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   dot_ef6b1d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dot_ef6b1d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   dot_ef6b1d();
 }
diff --git a/test/intrinsics/gen/dot/f1312c.wgsl b/test/intrinsics/gen/dot/f1312c.wgsl
index f08b6f2..6bb0876 100644
--- a/test/intrinsics/gen/dot/f1312c.wgsl
+++ b/test/intrinsics/gen/dot/f1312c.wgsl
@@ -28,18 +28,18 @@
   var res: i32 = dot(vec3<i32>(), vec3<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   dot_f1312c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dot_f1312c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   dot_f1312c();
 }
diff --git a/test/intrinsics/gen/dot/f1312c.wgsl.expected.wgsl b/test/intrinsics/gen/dot/f1312c.wgsl.expected.wgsl
index 1e9ffe1..7440cf9 100644
--- a/test/intrinsics/gen/dot/f1312c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dot/f1312c.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : i32 = dot(vec3<i32>(), vec3<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   dot_f1312c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dot_f1312c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   dot_f1312c();
 }
diff --git a/test/intrinsics/gen/dot/fc5f7c.wgsl b/test/intrinsics/gen/dot/fc5f7c.wgsl
index 7b0ae29..bbadae8 100644
--- a/test/intrinsics/gen/dot/fc5f7c.wgsl
+++ b/test/intrinsics/gen/dot/fc5f7c.wgsl
@@ -28,18 +28,18 @@
   var res: i32 = dot(vec2<i32>(), vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   dot_fc5f7c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dot_fc5f7c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   dot_fc5f7c();
 }
diff --git a/test/intrinsics/gen/dot/fc5f7c.wgsl.expected.wgsl b/test/intrinsics/gen/dot/fc5f7c.wgsl.expected.wgsl
index 4aaabfc..6d30122 100644
--- a/test/intrinsics/gen/dot/fc5f7c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dot/fc5f7c.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : i32 = dot(vec2<i32>(), vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   dot_fc5f7c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dot_fc5f7c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   dot_fc5f7c();
 }
diff --git a/test/intrinsics/gen/dpdx/0763f7.wgsl b/test/intrinsics/gen/dpdx/0763f7.wgsl
index fc6a536..cbfc41a 100644
--- a/test/intrinsics/gen/dpdx/0763f7.wgsl
+++ b/test/intrinsics/gen/dpdx/0763f7.wgsl
@@ -28,7 +28,7 @@
   var res: vec3<f32> = dpdx(vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdx_0763f7();
 }
diff --git a/test/intrinsics/gen/dpdx/0763f7.wgsl.expected.wgsl b/test/intrinsics/gen/dpdx/0763f7.wgsl.expected.wgsl
index be5f4e0..15235d6 100644
--- a/test/intrinsics/gen/dpdx/0763f7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdx/0763f7.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec3<f32> = dpdx(vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdx_0763f7();
 }
diff --git a/test/intrinsics/gen/dpdx/99edb1.wgsl b/test/intrinsics/gen/dpdx/99edb1.wgsl
index 1ca0b06..84f5126 100644
--- a/test/intrinsics/gen/dpdx/99edb1.wgsl
+++ b/test/intrinsics/gen/dpdx/99edb1.wgsl
@@ -28,7 +28,7 @@
   var res: vec2<f32> = dpdx(vec2<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdx_99edb1();
 }
diff --git a/test/intrinsics/gen/dpdx/99edb1.wgsl.expected.wgsl b/test/intrinsics/gen/dpdx/99edb1.wgsl.expected.wgsl
index aafee00..7405f0f 100644
--- a/test/intrinsics/gen/dpdx/99edb1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdx/99edb1.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec2<f32> = dpdx(vec2<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdx_99edb1();
 }
diff --git a/test/intrinsics/gen/dpdx/c487fa.wgsl b/test/intrinsics/gen/dpdx/c487fa.wgsl
index ed27ff0..7b477fb 100644
--- a/test/intrinsics/gen/dpdx/c487fa.wgsl
+++ b/test/intrinsics/gen/dpdx/c487fa.wgsl
@@ -28,7 +28,7 @@
   var res: vec4<f32> = dpdx(vec4<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdx_c487fa();
 }
diff --git a/test/intrinsics/gen/dpdx/c487fa.wgsl.expected.wgsl b/test/intrinsics/gen/dpdx/c487fa.wgsl.expected.wgsl
index 350f0c2..f2ebe8e 100644
--- a/test/intrinsics/gen/dpdx/c487fa.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdx/c487fa.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec4<f32> = dpdx(vec4<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdx_c487fa();
 }
diff --git a/test/intrinsics/gen/dpdx/e263de.wgsl b/test/intrinsics/gen/dpdx/e263de.wgsl
index 58fdd1f..60498a7 100644
--- a/test/intrinsics/gen/dpdx/e263de.wgsl
+++ b/test/intrinsics/gen/dpdx/e263de.wgsl
@@ -28,7 +28,7 @@
   var res: f32 = dpdx(1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdx_e263de();
 }
diff --git a/test/intrinsics/gen/dpdx/e263de.wgsl.expected.wgsl b/test/intrinsics/gen/dpdx/e263de.wgsl.expected.wgsl
index 03939a6..ac653d8 100644
--- a/test/intrinsics/gen/dpdx/e263de.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdx/e263de.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : f32 = dpdx(1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdx_e263de();
 }
diff --git a/test/intrinsics/gen/dpdxCoarse/029152.wgsl b/test/intrinsics/gen/dpdxCoarse/029152.wgsl
index e6d8ea6..1a7cc1d 100644
--- a/test/intrinsics/gen/dpdxCoarse/029152.wgsl
+++ b/test/intrinsics/gen/dpdxCoarse/029152.wgsl
@@ -28,7 +28,7 @@
   var res: f32 = dpdxCoarse(1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdxCoarse_029152();
 }
diff --git a/test/intrinsics/gen/dpdxCoarse/029152.wgsl.expected.wgsl b/test/intrinsics/gen/dpdxCoarse/029152.wgsl.expected.wgsl
index 9f2d250..38fe60c 100644
--- a/test/intrinsics/gen/dpdxCoarse/029152.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdxCoarse/029152.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : f32 = dpdxCoarse(1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdxCoarse_029152();
 }
diff --git a/test/intrinsics/gen/dpdxCoarse/9581cf.wgsl b/test/intrinsics/gen/dpdxCoarse/9581cf.wgsl
index 3e5bfe5..5ccf411 100644
--- a/test/intrinsics/gen/dpdxCoarse/9581cf.wgsl
+++ b/test/intrinsics/gen/dpdxCoarse/9581cf.wgsl
@@ -28,7 +28,7 @@
   var res: vec2<f32> = dpdxCoarse(vec2<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdxCoarse_9581cf();
 }
diff --git a/test/intrinsics/gen/dpdxCoarse/9581cf.wgsl.expected.wgsl b/test/intrinsics/gen/dpdxCoarse/9581cf.wgsl.expected.wgsl
index a341150..51ac0a5 100644
--- a/test/intrinsics/gen/dpdxCoarse/9581cf.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdxCoarse/9581cf.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec2<f32> = dpdxCoarse(vec2<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdxCoarse_9581cf();
 }
diff --git a/test/intrinsics/gen/dpdxCoarse/c28641.wgsl b/test/intrinsics/gen/dpdxCoarse/c28641.wgsl
index a2b5d79..8777156 100644
--- a/test/intrinsics/gen/dpdxCoarse/c28641.wgsl
+++ b/test/intrinsics/gen/dpdxCoarse/c28641.wgsl
@@ -28,7 +28,7 @@
   var res: vec4<f32> = dpdxCoarse(vec4<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdxCoarse_c28641();
 }
diff --git a/test/intrinsics/gen/dpdxCoarse/c28641.wgsl.expected.wgsl b/test/intrinsics/gen/dpdxCoarse/c28641.wgsl.expected.wgsl
index 17c714b..51fa7dc 100644
--- a/test/intrinsics/gen/dpdxCoarse/c28641.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdxCoarse/c28641.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec4<f32> = dpdxCoarse(vec4<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdxCoarse_c28641();
 }
diff --git a/test/intrinsics/gen/dpdxCoarse/f64d7b.wgsl b/test/intrinsics/gen/dpdxCoarse/f64d7b.wgsl
index d3843af..40b501c 100644
--- a/test/intrinsics/gen/dpdxCoarse/f64d7b.wgsl
+++ b/test/intrinsics/gen/dpdxCoarse/f64d7b.wgsl
@@ -28,7 +28,7 @@
   var res: vec3<f32> = dpdxCoarse(vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdxCoarse_f64d7b();
 }
diff --git a/test/intrinsics/gen/dpdxCoarse/f64d7b.wgsl.expected.wgsl b/test/intrinsics/gen/dpdxCoarse/f64d7b.wgsl.expected.wgsl
index 6182abe..f5a9d29 100644
--- a/test/intrinsics/gen/dpdxCoarse/f64d7b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdxCoarse/f64d7b.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec3<f32> = dpdxCoarse(vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdxCoarse_f64d7b();
 }
diff --git a/test/intrinsics/gen/dpdxFine/8c5069.wgsl b/test/intrinsics/gen/dpdxFine/8c5069.wgsl
index 58bf252..b1db7e3 100644
--- a/test/intrinsics/gen/dpdxFine/8c5069.wgsl
+++ b/test/intrinsics/gen/dpdxFine/8c5069.wgsl
@@ -28,7 +28,7 @@
   var res: vec4<f32> = dpdxFine(vec4<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdxFine_8c5069();
 }
diff --git a/test/intrinsics/gen/dpdxFine/8c5069.wgsl.expected.wgsl b/test/intrinsics/gen/dpdxFine/8c5069.wgsl.expected.wgsl
index a83e763..6de1a1c 100644
--- a/test/intrinsics/gen/dpdxFine/8c5069.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdxFine/8c5069.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec4<f32> = dpdxFine(vec4<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdxFine_8c5069();
 }
diff --git a/test/intrinsics/gen/dpdxFine/9631de.wgsl b/test/intrinsics/gen/dpdxFine/9631de.wgsl
index 2ca05c3..f29dffb 100644
--- a/test/intrinsics/gen/dpdxFine/9631de.wgsl
+++ b/test/intrinsics/gen/dpdxFine/9631de.wgsl
@@ -28,7 +28,7 @@
   var res: vec2<f32> = dpdxFine(vec2<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdxFine_9631de();
 }
diff --git a/test/intrinsics/gen/dpdxFine/9631de.wgsl.expected.wgsl b/test/intrinsics/gen/dpdxFine/9631de.wgsl.expected.wgsl
index 002e44e..a56d3c4 100644
--- a/test/intrinsics/gen/dpdxFine/9631de.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdxFine/9631de.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec2<f32> = dpdxFine(vec2<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdxFine_9631de();
 }
diff --git a/test/intrinsics/gen/dpdxFine/f401a2.wgsl b/test/intrinsics/gen/dpdxFine/f401a2.wgsl
index a723328..405291f 100644
--- a/test/intrinsics/gen/dpdxFine/f401a2.wgsl
+++ b/test/intrinsics/gen/dpdxFine/f401a2.wgsl
@@ -28,7 +28,7 @@
   var res: f32 = dpdxFine(1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdxFine_f401a2();
 }
diff --git a/test/intrinsics/gen/dpdxFine/f401a2.wgsl.expected.wgsl b/test/intrinsics/gen/dpdxFine/f401a2.wgsl.expected.wgsl
index 2790d8d..3f5c836 100644
--- a/test/intrinsics/gen/dpdxFine/f401a2.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdxFine/f401a2.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : f32 = dpdxFine(1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdxFine_f401a2();
 }
diff --git a/test/intrinsics/gen/dpdxFine/f92fb6.wgsl b/test/intrinsics/gen/dpdxFine/f92fb6.wgsl
index 97ceac3..8a3b66d 100644
--- a/test/intrinsics/gen/dpdxFine/f92fb6.wgsl
+++ b/test/intrinsics/gen/dpdxFine/f92fb6.wgsl
@@ -28,7 +28,7 @@
   var res: vec3<f32> = dpdxFine(vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdxFine_f92fb6();
 }
diff --git a/test/intrinsics/gen/dpdxFine/f92fb6.wgsl.expected.wgsl b/test/intrinsics/gen/dpdxFine/f92fb6.wgsl.expected.wgsl
index a40c3fb..5189c7f 100644
--- a/test/intrinsics/gen/dpdxFine/f92fb6.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdxFine/f92fb6.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec3<f32> = dpdxFine(vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdxFine_f92fb6();
 }
diff --git a/test/intrinsics/gen/dpdy/699a05.wgsl b/test/intrinsics/gen/dpdy/699a05.wgsl
index 3ae6234..dc14668 100644
--- a/test/intrinsics/gen/dpdy/699a05.wgsl
+++ b/test/intrinsics/gen/dpdy/699a05.wgsl
@@ -28,7 +28,7 @@
   var res: vec4<f32> = dpdy(vec4<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdy_699a05();
 }
diff --git a/test/intrinsics/gen/dpdy/699a05.wgsl.expected.wgsl b/test/intrinsics/gen/dpdy/699a05.wgsl.expected.wgsl
index 5be383d..9aa244c 100644
--- a/test/intrinsics/gen/dpdy/699a05.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdy/699a05.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec4<f32> = dpdy(vec4<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdy_699a05();
 }
diff --git a/test/intrinsics/gen/dpdy/7f8d84.wgsl b/test/intrinsics/gen/dpdy/7f8d84.wgsl
index d712959..c468777 100644
--- a/test/intrinsics/gen/dpdy/7f8d84.wgsl
+++ b/test/intrinsics/gen/dpdy/7f8d84.wgsl
@@ -28,7 +28,7 @@
   var res: f32 = dpdy(1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdy_7f8d84();
 }
diff --git a/test/intrinsics/gen/dpdy/7f8d84.wgsl.expected.wgsl b/test/intrinsics/gen/dpdy/7f8d84.wgsl.expected.wgsl
index 9d96009..732458e 100644
--- a/test/intrinsics/gen/dpdy/7f8d84.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdy/7f8d84.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : f32 = dpdy(1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdy_7f8d84();
 }
diff --git a/test/intrinsics/gen/dpdy/a8b56e.wgsl b/test/intrinsics/gen/dpdy/a8b56e.wgsl
index 011d813..e79bff9 100644
--- a/test/intrinsics/gen/dpdy/a8b56e.wgsl
+++ b/test/intrinsics/gen/dpdy/a8b56e.wgsl
@@ -28,7 +28,7 @@
   var res: vec2<f32> = dpdy(vec2<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdy_a8b56e();
 }
diff --git a/test/intrinsics/gen/dpdy/a8b56e.wgsl.expected.wgsl b/test/intrinsics/gen/dpdy/a8b56e.wgsl.expected.wgsl
index bfe028f..3493de8 100644
--- a/test/intrinsics/gen/dpdy/a8b56e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdy/a8b56e.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec2<f32> = dpdy(vec2<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdy_a8b56e();
 }
diff --git a/test/intrinsics/gen/dpdy/feb40f.wgsl b/test/intrinsics/gen/dpdy/feb40f.wgsl
index 31ce8bc..f3afdc2 100644
--- a/test/intrinsics/gen/dpdy/feb40f.wgsl
+++ b/test/intrinsics/gen/dpdy/feb40f.wgsl
@@ -28,7 +28,7 @@
   var res: vec3<f32> = dpdy(vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdy_feb40f();
 }
diff --git a/test/intrinsics/gen/dpdy/feb40f.wgsl.expected.wgsl b/test/intrinsics/gen/dpdy/feb40f.wgsl.expected.wgsl
index f75381c..bdcb51d 100644
--- a/test/intrinsics/gen/dpdy/feb40f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdy/feb40f.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec3<f32> = dpdy(vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdy_feb40f();
 }
diff --git a/test/intrinsics/gen/dpdyCoarse/3e1ab4.wgsl b/test/intrinsics/gen/dpdyCoarse/3e1ab4.wgsl
index 073440f..15007a3 100644
--- a/test/intrinsics/gen/dpdyCoarse/3e1ab4.wgsl
+++ b/test/intrinsics/gen/dpdyCoarse/3e1ab4.wgsl
@@ -28,7 +28,7 @@
   var res: vec2<f32> = dpdyCoarse(vec2<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdyCoarse_3e1ab4();
 }
diff --git a/test/intrinsics/gen/dpdyCoarse/3e1ab4.wgsl.expected.wgsl b/test/intrinsics/gen/dpdyCoarse/3e1ab4.wgsl.expected.wgsl
index d109629..347ad73 100644
--- a/test/intrinsics/gen/dpdyCoarse/3e1ab4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdyCoarse/3e1ab4.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec2<f32> = dpdyCoarse(vec2<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdyCoarse_3e1ab4();
 }
diff --git a/test/intrinsics/gen/dpdyCoarse/445d24.wgsl b/test/intrinsics/gen/dpdyCoarse/445d24.wgsl
index eeed8c9..b397d4e 100644
--- a/test/intrinsics/gen/dpdyCoarse/445d24.wgsl
+++ b/test/intrinsics/gen/dpdyCoarse/445d24.wgsl
@@ -28,7 +28,7 @@
   var res: vec4<f32> = dpdyCoarse(vec4<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdyCoarse_445d24();
 }
diff --git a/test/intrinsics/gen/dpdyCoarse/445d24.wgsl.expected.wgsl b/test/intrinsics/gen/dpdyCoarse/445d24.wgsl.expected.wgsl
index c5659f6..db347c4 100644
--- a/test/intrinsics/gen/dpdyCoarse/445d24.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdyCoarse/445d24.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec4<f32> = dpdyCoarse(vec4<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdyCoarse_445d24();
 }
diff --git a/test/intrinsics/gen/dpdyCoarse/870a7e.wgsl b/test/intrinsics/gen/dpdyCoarse/870a7e.wgsl
index a2414d7..7fc7907 100644
--- a/test/intrinsics/gen/dpdyCoarse/870a7e.wgsl
+++ b/test/intrinsics/gen/dpdyCoarse/870a7e.wgsl
@@ -28,7 +28,7 @@
   var res: f32 = dpdyCoarse(1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdyCoarse_870a7e();
 }
diff --git a/test/intrinsics/gen/dpdyCoarse/870a7e.wgsl.expected.wgsl b/test/intrinsics/gen/dpdyCoarse/870a7e.wgsl.expected.wgsl
index 1bf505f..b3d7586 100644
--- a/test/intrinsics/gen/dpdyCoarse/870a7e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdyCoarse/870a7e.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : f32 = dpdyCoarse(1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdyCoarse_870a7e();
 }
diff --git a/test/intrinsics/gen/dpdyCoarse/ae1873.wgsl b/test/intrinsics/gen/dpdyCoarse/ae1873.wgsl
index 36cfd7b..b1f32ef 100644
--- a/test/intrinsics/gen/dpdyCoarse/ae1873.wgsl
+++ b/test/intrinsics/gen/dpdyCoarse/ae1873.wgsl
@@ -28,7 +28,7 @@
   var res: vec3<f32> = dpdyCoarse(vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdyCoarse_ae1873();
 }
diff --git a/test/intrinsics/gen/dpdyCoarse/ae1873.wgsl.expected.wgsl b/test/intrinsics/gen/dpdyCoarse/ae1873.wgsl.expected.wgsl
index e625403..c116a9e 100644
--- a/test/intrinsics/gen/dpdyCoarse/ae1873.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdyCoarse/ae1873.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec3<f32> = dpdyCoarse(vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdyCoarse_ae1873();
 }
diff --git a/test/intrinsics/gen/dpdyFine/1fb7ab.wgsl b/test/intrinsics/gen/dpdyFine/1fb7ab.wgsl
index 352890b..3a28460 100644
--- a/test/intrinsics/gen/dpdyFine/1fb7ab.wgsl
+++ b/test/intrinsics/gen/dpdyFine/1fb7ab.wgsl
@@ -28,7 +28,7 @@
   var res: vec3<f32> = dpdyFine(vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdyFine_1fb7ab();
 }
diff --git a/test/intrinsics/gen/dpdyFine/1fb7ab.wgsl.expected.wgsl b/test/intrinsics/gen/dpdyFine/1fb7ab.wgsl.expected.wgsl
index 852459c..96fd518 100644
--- a/test/intrinsics/gen/dpdyFine/1fb7ab.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdyFine/1fb7ab.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec3<f32> = dpdyFine(vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdyFine_1fb7ab();
 }
diff --git a/test/intrinsics/gen/dpdyFine/6eb673.wgsl b/test/intrinsics/gen/dpdyFine/6eb673.wgsl
index d2bb96c..9469533 100644
--- a/test/intrinsics/gen/dpdyFine/6eb673.wgsl
+++ b/test/intrinsics/gen/dpdyFine/6eb673.wgsl
@@ -28,7 +28,7 @@
   var res: f32 = dpdyFine(1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdyFine_6eb673();
 }
diff --git a/test/intrinsics/gen/dpdyFine/6eb673.wgsl.expected.wgsl b/test/intrinsics/gen/dpdyFine/6eb673.wgsl.expected.wgsl
index 60caecd..8fbc820 100644
--- a/test/intrinsics/gen/dpdyFine/6eb673.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdyFine/6eb673.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : f32 = dpdyFine(1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdyFine_6eb673();
 }
diff --git a/test/intrinsics/gen/dpdyFine/d0a648.wgsl b/test/intrinsics/gen/dpdyFine/d0a648.wgsl
index 57e48fe..436f5a1 100644
--- a/test/intrinsics/gen/dpdyFine/d0a648.wgsl
+++ b/test/intrinsics/gen/dpdyFine/d0a648.wgsl
@@ -28,7 +28,7 @@
   var res: vec4<f32> = dpdyFine(vec4<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdyFine_d0a648();
 }
diff --git a/test/intrinsics/gen/dpdyFine/d0a648.wgsl.expected.wgsl b/test/intrinsics/gen/dpdyFine/d0a648.wgsl.expected.wgsl
index 160b27b..5d4fc7d 100644
--- a/test/intrinsics/gen/dpdyFine/d0a648.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdyFine/d0a648.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec4<f32> = dpdyFine(vec4<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdyFine_d0a648();
 }
diff --git a/test/intrinsics/gen/dpdyFine/df33aa.wgsl b/test/intrinsics/gen/dpdyFine/df33aa.wgsl
index 4d84817..fdfc9c8 100644
--- a/test/intrinsics/gen/dpdyFine/df33aa.wgsl
+++ b/test/intrinsics/gen/dpdyFine/df33aa.wgsl
@@ -28,7 +28,7 @@
   var res: vec2<f32> = dpdyFine(vec2<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdyFine_df33aa();
 }
diff --git a/test/intrinsics/gen/dpdyFine/df33aa.wgsl.expected.wgsl b/test/intrinsics/gen/dpdyFine/df33aa.wgsl.expected.wgsl
index b541ecf..876948a 100644
--- a/test/intrinsics/gen/dpdyFine/df33aa.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/dpdyFine/df33aa.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec2<f32> = dpdyFine(vec2<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   dpdyFine_df33aa();
 }
diff --git a/test/intrinsics/gen/exp/0f70eb.wgsl b/test/intrinsics/gen/exp/0f70eb.wgsl
index a641b6c..e65faa4 100644
--- a/test/intrinsics/gen/exp/0f70eb.wgsl
+++ b/test/intrinsics/gen/exp/0f70eb.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = exp(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   exp_0f70eb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   exp_0f70eb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   exp_0f70eb();
 }
diff --git a/test/intrinsics/gen/exp/0f70eb.wgsl.expected.wgsl b/test/intrinsics/gen/exp/0f70eb.wgsl.expected.wgsl
index 56d1828..bdcd32b 100644
--- a/test/intrinsics/gen/exp/0f70eb.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/exp/0f70eb.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = exp(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   exp_0f70eb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   exp_0f70eb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   exp_0f70eb();
 }
diff --git a/test/intrinsics/gen/exp/1951e7.wgsl b/test/intrinsics/gen/exp/1951e7.wgsl
index e8a0ecc..6e006f3 100644
--- a/test/intrinsics/gen/exp/1951e7.wgsl
+++ b/test/intrinsics/gen/exp/1951e7.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = exp(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   exp_1951e7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   exp_1951e7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   exp_1951e7();
 }
diff --git a/test/intrinsics/gen/exp/1951e7.wgsl.expected.wgsl b/test/intrinsics/gen/exp/1951e7.wgsl.expected.wgsl
index 81e9694..f3dd502 100644
--- a/test/intrinsics/gen/exp/1951e7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/exp/1951e7.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = exp(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   exp_1951e7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   exp_1951e7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   exp_1951e7();
 }
diff --git a/test/intrinsics/gen/exp/771fd2.wgsl b/test/intrinsics/gen/exp/771fd2.wgsl
index e44b635..a1cb3cd 100644
--- a/test/intrinsics/gen/exp/771fd2.wgsl
+++ b/test/intrinsics/gen/exp/771fd2.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = exp(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   exp_771fd2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   exp_771fd2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   exp_771fd2();
 }
diff --git a/test/intrinsics/gen/exp/771fd2.wgsl.expected.wgsl b/test/intrinsics/gen/exp/771fd2.wgsl.expected.wgsl
index 4fdeb25..31bfd18 100644
--- a/test/intrinsics/gen/exp/771fd2.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/exp/771fd2.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = exp(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   exp_771fd2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   exp_771fd2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   exp_771fd2();
 }
diff --git a/test/intrinsics/gen/exp/d98450.wgsl b/test/intrinsics/gen/exp/d98450.wgsl
index c74af04..2404a17 100644
--- a/test/intrinsics/gen/exp/d98450.wgsl
+++ b/test/intrinsics/gen/exp/d98450.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = exp(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   exp_d98450();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   exp_d98450();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   exp_d98450();
 }
diff --git a/test/intrinsics/gen/exp/d98450.wgsl.expected.wgsl b/test/intrinsics/gen/exp/d98450.wgsl.expected.wgsl
index 06ffea3..168c3c2 100644
--- a/test/intrinsics/gen/exp/d98450.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/exp/d98450.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = exp(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   exp_d98450();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   exp_d98450();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   exp_d98450();
 }
diff --git a/test/intrinsics/gen/exp2/1f8680.wgsl b/test/intrinsics/gen/exp2/1f8680.wgsl
index 40852d4..0fdaeba 100644
--- a/test/intrinsics/gen/exp2/1f8680.wgsl
+++ b/test/intrinsics/gen/exp2/1f8680.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = exp2(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   exp2_1f8680();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   exp2_1f8680();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   exp2_1f8680();
 }
diff --git a/test/intrinsics/gen/exp2/1f8680.wgsl.expected.wgsl b/test/intrinsics/gen/exp2/1f8680.wgsl.expected.wgsl
index be2ee95..a4cba82 100644
--- a/test/intrinsics/gen/exp2/1f8680.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/exp2/1f8680.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = exp2(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   exp2_1f8680();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   exp2_1f8680();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   exp2_1f8680();
 }
diff --git a/test/intrinsics/gen/exp2/a9d0a7.wgsl b/test/intrinsics/gen/exp2/a9d0a7.wgsl
index ac64102..46e47f7 100644
--- a/test/intrinsics/gen/exp2/a9d0a7.wgsl
+++ b/test/intrinsics/gen/exp2/a9d0a7.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = exp2(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   exp2_a9d0a7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   exp2_a9d0a7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   exp2_a9d0a7();
 }
diff --git a/test/intrinsics/gen/exp2/a9d0a7.wgsl.expected.wgsl b/test/intrinsics/gen/exp2/a9d0a7.wgsl.expected.wgsl
index ebdaf6d..6a9160b 100644
--- a/test/intrinsics/gen/exp2/a9d0a7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/exp2/a9d0a7.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = exp2(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   exp2_a9d0a7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   exp2_a9d0a7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   exp2_a9d0a7();
 }
diff --git a/test/intrinsics/gen/exp2/d6777c.wgsl b/test/intrinsics/gen/exp2/d6777c.wgsl
index 7206fe6..42933c0 100644
--- a/test/intrinsics/gen/exp2/d6777c.wgsl
+++ b/test/intrinsics/gen/exp2/d6777c.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = exp2(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   exp2_d6777c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   exp2_d6777c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   exp2_d6777c();
 }
diff --git a/test/intrinsics/gen/exp2/d6777c.wgsl.expected.wgsl b/test/intrinsics/gen/exp2/d6777c.wgsl.expected.wgsl
index 3a6b02b..7c84e15 100644
--- a/test/intrinsics/gen/exp2/d6777c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/exp2/d6777c.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = exp2(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   exp2_d6777c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   exp2_d6777c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   exp2_d6777c();
 }
diff --git a/test/intrinsics/gen/exp2/dea523.wgsl b/test/intrinsics/gen/exp2/dea523.wgsl
index 1ca1f3d..26e836a 100644
--- a/test/intrinsics/gen/exp2/dea523.wgsl
+++ b/test/intrinsics/gen/exp2/dea523.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = exp2(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   exp2_dea523();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   exp2_dea523();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   exp2_dea523();
 }
diff --git a/test/intrinsics/gen/exp2/dea523.wgsl.expected.wgsl b/test/intrinsics/gen/exp2/dea523.wgsl.expected.wgsl
index 548eaea..92ea06d 100644
--- a/test/intrinsics/gen/exp2/dea523.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/exp2/dea523.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = exp2(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   exp2_dea523();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   exp2_dea523();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   exp2_dea523();
 }
diff --git a/test/intrinsics/gen/faceForward/5afbd5.wgsl b/test/intrinsics/gen/faceForward/5afbd5.wgsl
index 70d32a9..3e036f3 100644
--- a/test/intrinsics/gen/faceForward/5afbd5.wgsl
+++ b/test/intrinsics/gen/faceForward/5afbd5.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = faceForward(vec3<f32>(), vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   faceForward_5afbd5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   faceForward_5afbd5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   faceForward_5afbd5();
 }
diff --git a/test/intrinsics/gen/faceForward/5afbd5.wgsl.expected.wgsl b/test/intrinsics/gen/faceForward/5afbd5.wgsl.expected.wgsl
index 60f43f7..65e8800 100644
--- a/test/intrinsics/gen/faceForward/5afbd5.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/faceForward/5afbd5.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = faceForward(vec3<f32>(), vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   faceForward_5afbd5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   faceForward_5afbd5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   faceForward_5afbd5();
 }
diff --git a/test/intrinsics/gen/faceForward/b316e5.wgsl b/test/intrinsics/gen/faceForward/b316e5.wgsl
index bccaf38..2e31ca6 100644
--- a/test/intrinsics/gen/faceForward/b316e5.wgsl
+++ b/test/intrinsics/gen/faceForward/b316e5.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = faceForward(vec4<f32>(), vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   faceForward_b316e5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   faceForward_b316e5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   faceForward_b316e5();
 }
diff --git a/test/intrinsics/gen/faceForward/b316e5.wgsl.expected.wgsl b/test/intrinsics/gen/faceForward/b316e5.wgsl.expected.wgsl
index accacf2..e3cc002 100644
--- a/test/intrinsics/gen/faceForward/b316e5.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/faceForward/b316e5.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = faceForward(vec4<f32>(), vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   faceForward_b316e5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   faceForward_b316e5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   faceForward_b316e5();
 }
diff --git a/test/intrinsics/gen/faceForward/e6908b.wgsl b/test/intrinsics/gen/faceForward/e6908b.wgsl
index 626e2ab..4c9a2be 100644
--- a/test/intrinsics/gen/faceForward/e6908b.wgsl
+++ b/test/intrinsics/gen/faceForward/e6908b.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = faceForward(vec2<f32>(), vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   faceForward_e6908b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   faceForward_e6908b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   faceForward_e6908b();
 }
diff --git a/test/intrinsics/gen/faceForward/e6908b.wgsl.expected.wgsl b/test/intrinsics/gen/faceForward/e6908b.wgsl.expected.wgsl
index c5a1a40..96c2c87 100644
--- a/test/intrinsics/gen/faceForward/e6908b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/faceForward/e6908b.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = faceForward(vec2<f32>(), vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   faceForward_e6908b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   faceForward_e6908b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   faceForward_e6908b();
 }
diff --git a/test/intrinsics/gen/floor/3bccc4.wgsl b/test/intrinsics/gen/floor/3bccc4.wgsl
index 21c16ee..3d27b57 100644
--- a/test/intrinsics/gen/floor/3bccc4.wgsl
+++ b/test/intrinsics/gen/floor/3bccc4.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = floor(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   floor_3bccc4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   floor_3bccc4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   floor_3bccc4();
 }
diff --git a/test/intrinsics/gen/floor/3bccc4.wgsl.expected.wgsl b/test/intrinsics/gen/floor/3bccc4.wgsl.expected.wgsl
index a9a17da..878e104 100644
--- a/test/intrinsics/gen/floor/3bccc4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/floor/3bccc4.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = floor(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   floor_3bccc4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   floor_3bccc4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   floor_3bccc4();
 }
diff --git a/test/intrinsics/gen/floor/5fc9ac.wgsl b/test/intrinsics/gen/floor/5fc9ac.wgsl
index 8b9bb2c..49afc11 100644
--- a/test/intrinsics/gen/floor/5fc9ac.wgsl
+++ b/test/intrinsics/gen/floor/5fc9ac.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = floor(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   floor_5fc9ac();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   floor_5fc9ac();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   floor_5fc9ac();
 }
diff --git a/test/intrinsics/gen/floor/5fc9ac.wgsl.expected.wgsl b/test/intrinsics/gen/floor/5fc9ac.wgsl.expected.wgsl
index 5ab196a..1b6fadd 100644
--- a/test/intrinsics/gen/floor/5fc9ac.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/floor/5fc9ac.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = floor(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   floor_5fc9ac();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   floor_5fc9ac();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   floor_5fc9ac();
 }
diff --git a/test/intrinsics/gen/floor/60d7ea.wgsl b/test/intrinsics/gen/floor/60d7ea.wgsl
index 90c0a3b..6e4c944 100644
--- a/test/intrinsics/gen/floor/60d7ea.wgsl
+++ b/test/intrinsics/gen/floor/60d7ea.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = floor(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   floor_60d7ea();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   floor_60d7ea();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   floor_60d7ea();
 }
diff --git a/test/intrinsics/gen/floor/60d7ea.wgsl.expected.wgsl b/test/intrinsics/gen/floor/60d7ea.wgsl.expected.wgsl
index 62b956f..bfc5a83 100644
--- a/test/intrinsics/gen/floor/60d7ea.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/floor/60d7ea.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = floor(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   floor_60d7ea();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   floor_60d7ea();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   floor_60d7ea();
 }
diff --git a/test/intrinsics/gen/floor/66f154.wgsl b/test/intrinsics/gen/floor/66f154.wgsl
index afec159..8020bf6 100644
--- a/test/intrinsics/gen/floor/66f154.wgsl
+++ b/test/intrinsics/gen/floor/66f154.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = floor(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   floor_66f154();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   floor_66f154();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   floor_66f154();
 }
diff --git a/test/intrinsics/gen/floor/66f154.wgsl.expected.wgsl b/test/intrinsics/gen/floor/66f154.wgsl.expected.wgsl
index 45144a4..11de386 100644
--- a/test/intrinsics/gen/floor/66f154.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/floor/66f154.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = floor(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   floor_66f154();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   floor_66f154();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   floor_66f154();
 }
diff --git a/test/intrinsics/gen/fma/26a7a9.wgsl b/test/intrinsics/gen/fma/26a7a9.wgsl
index 314493b..bb6f1c0 100644
--- a/test/intrinsics/gen/fma/26a7a9.wgsl
+++ b/test/intrinsics/gen/fma/26a7a9.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = fma(vec2<f32>(), vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   fma_26a7a9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fma_26a7a9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   fma_26a7a9();
 }
diff --git a/test/intrinsics/gen/fma/26a7a9.wgsl.expected.wgsl b/test/intrinsics/gen/fma/26a7a9.wgsl.expected.wgsl
index fb9bdef..f1edf4e 100644
--- a/test/intrinsics/gen/fma/26a7a9.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/fma/26a7a9.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = fma(vec2<f32>(), vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   fma_26a7a9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fma_26a7a9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   fma_26a7a9();
 }
diff --git a/test/intrinsics/gen/fma/6a3283.wgsl b/test/intrinsics/gen/fma/6a3283.wgsl
index e722ec9..2074905 100644
--- a/test/intrinsics/gen/fma/6a3283.wgsl
+++ b/test/intrinsics/gen/fma/6a3283.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = fma(vec4<f32>(), vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   fma_6a3283();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fma_6a3283();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   fma_6a3283();
 }
diff --git a/test/intrinsics/gen/fma/6a3283.wgsl.expected.wgsl b/test/intrinsics/gen/fma/6a3283.wgsl.expected.wgsl
index 5040b3b..267c2b1 100644
--- a/test/intrinsics/gen/fma/6a3283.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/fma/6a3283.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = fma(vec4<f32>(), vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   fma_6a3283();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fma_6a3283();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   fma_6a3283();
 }
diff --git a/test/intrinsics/gen/fma/c10ba3.wgsl b/test/intrinsics/gen/fma/c10ba3.wgsl
index 39b6af3..9bd4277 100644
--- a/test/intrinsics/gen/fma/c10ba3.wgsl
+++ b/test/intrinsics/gen/fma/c10ba3.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = fma(1.0, 1.0, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   fma_c10ba3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fma_c10ba3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   fma_c10ba3();
 }
diff --git a/test/intrinsics/gen/fma/c10ba3.wgsl.expected.wgsl b/test/intrinsics/gen/fma/c10ba3.wgsl.expected.wgsl
index f43de8f..baec69d 100644
--- a/test/intrinsics/gen/fma/c10ba3.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/fma/c10ba3.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = fma(1.0, 1.0, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   fma_c10ba3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fma_c10ba3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   fma_c10ba3();
 }
diff --git a/test/intrinsics/gen/fma/e17c5c.wgsl b/test/intrinsics/gen/fma/e17c5c.wgsl
index 6fa8a4f..a9adbb0 100644
--- a/test/intrinsics/gen/fma/e17c5c.wgsl
+++ b/test/intrinsics/gen/fma/e17c5c.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = fma(vec3<f32>(), vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   fma_e17c5c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fma_e17c5c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   fma_e17c5c();
 }
diff --git a/test/intrinsics/gen/fma/e17c5c.wgsl.expected.wgsl b/test/intrinsics/gen/fma/e17c5c.wgsl.expected.wgsl
index 35874f4..adc6a88 100644
--- a/test/intrinsics/gen/fma/e17c5c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/fma/e17c5c.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = fma(vec3<f32>(), vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   fma_e17c5c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fma_e17c5c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   fma_e17c5c();
 }
diff --git a/test/intrinsics/gen/fract/8bc1e9.wgsl b/test/intrinsics/gen/fract/8bc1e9.wgsl
index 79c9611..d064af2 100644
--- a/test/intrinsics/gen/fract/8bc1e9.wgsl
+++ b/test/intrinsics/gen/fract/8bc1e9.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = fract(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   fract_8bc1e9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fract_8bc1e9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   fract_8bc1e9();
 }
diff --git a/test/intrinsics/gen/fract/8bc1e9.wgsl.expected.wgsl b/test/intrinsics/gen/fract/8bc1e9.wgsl.expected.wgsl
index 77b2630..6476408 100644
--- a/test/intrinsics/gen/fract/8bc1e9.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/fract/8bc1e9.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = fract(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   fract_8bc1e9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fract_8bc1e9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   fract_8bc1e9();
 }
diff --git a/test/intrinsics/gen/fract/943cb1.wgsl b/test/intrinsics/gen/fract/943cb1.wgsl
index 9c9552a..50d0038 100644
--- a/test/intrinsics/gen/fract/943cb1.wgsl
+++ b/test/intrinsics/gen/fract/943cb1.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = fract(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   fract_943cb1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fract_943cb1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   fract_943cb1();
 }
diff --git a/test/intrinsics/gen/fract/943cb1.wgsl.expected.wgsl b/test/intrinsics/gen/fract/943cb1.wgsl.expected.wgsl
index 26a6f25..977e3f9 100644
--- a/test/intrinsics/gen/fract/943cb1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/fract/943cb1.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = fract(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   fract_943cb1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fract_943cb1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   fract_943cb1();
 }
diff --git a/test/intrinsics/gen/fract/a49758.wgsl b/test/intrinsics/gen/fract/a49758.wgsl
index 9617954..567a336 100644
--- a/test/intrinsics/gen/fract/a49758.wgsl
+++ b/test/intrinsics/gen/fract/a49758.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = fract(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   fract_a49758();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fract_a49758();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   fract_a49758();
 }
diff --git a/test/intrinsics/gen/fract/a49758.wgsl.expected.wgsl b/test/intrinsics/gen/fract/a49758.wgsl.expected.wgsl
index 8adc33c..7ab47df 100644
--- a/test/intrinsics/gen/fract/a49758.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/fract/a49758.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = fract(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   fract_a49758();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fract_a49758();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   fract_a49758();
 }
diff --git a/test/intrinsics/gen/fract/fa5c71.wgsl b/test/intrinsics/gen/fract/fa5c71.wgsl
index b6eaefe..35a24e1 100644
--- a/test/intrinsics/gen/fract/fa5c71.wgsl
+++ b/test/intrinsics/gen/fract/fa5c71.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = fract(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   fract_fa5c71();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fract_fa5c71();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   fract_fa5c71();
 }
diff --git a/test/intrinsics/gen/fract/fa5c71.wgsl.expected.wgsl b/test/intrinsics/gen/fract/fa5c71.wgsl.expected.wgsl
index 292a7bf..3599c79 100644
--- a/test/intrinsics/gen/fract/fa5c71.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/fract/fa5c71.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = fract(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   fract_fa5c71();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fract_fa5c71();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   fract_fa5c71();
 }
diff --git a/test/intrinsics/gen/frexp/368997.wgsl b/test/intrinsics/gen/frexp/368997.wgsl
index af00ee5..f7d9a71 100644
--- a/test/intrinsics/gen/frexp/368997.wgsl
+++ b/test/intrinsics/gen/frexp/368997.wgsl
@@ -28,18 +28,18 @@
   var res = frexp(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   frexp_368997();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   frexp_368997();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   frexp_368997();
 }
diff --git a/test/intrinsics/gen/frexp/368997.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/368997.wgsl.expected.wgsl
index d0f86b4..914f1d5 100644
--- a/test/intrinsics/gen/frexp/368997.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/368997.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res = frexp(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   frexp_368997();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   frexp_368997();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   frexp_368997();
 }
diff --git a/test/intrinsics/gen/frexp/3c4f48.wgsl b/test/intrinsics/gen/frexp/3c4f48.wgsl
index ce58325..2dd0849 100644
--- a/test/intrinsics/gen/frexp/3c4f48.wgsl
+++ b/test/intrinsics/gen/frexp/3c4f48.wgsl
@@ -28,18 +28,18 @@
   var res = frexp(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   frexp_3c4f48();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   frexp_3c4f48();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   frexp_3c4f48();
 }
diff --git a/test/intrinsics/gen/frexp/3c4f48.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/3c4f48.wgsl.expected.wgsl
index 07b50b6..2129fb6 100644
--- a/test/intrinsics/gen/frexp/3c4f48.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/3c4f48.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res = frexp(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   frexp_3c4f48();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   frexp_3c4f48();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   frexp_3c4f48();
 }
diff --git a/test/intrinsics/gen/frexp/4bdfc7.wgsl b/test/intrinsics/gen/frexp/4bdfc7.wgsl
index 4b48ab8..eff4518 100644
--- a/test/intrinsics/gen/frexp/4bdfc7.wgsl
+++ b/test/intrinsics/gen/frexp/4bdfc7.wgsl
@@ -28,18 +28,18 @@
   var res = frexp(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   frexp_4bdfc7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   frexp_4bdfc7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   frexp_4bdfc7();
 }
diff --git a/test/intrinsics/gen/frexp/4bdfc7.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/4bdfc7.wgsl.expected.wgsl
index 6473fd5..8dfe70c 100644
--- a/test/intrinsics/gen/frexp/4bdfc7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/4bdfc7.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res = frexp(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   frexp_4bdfc7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   frexp_4bdfc7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   frexp_4bdfc7();
 }
diff --git a/test/intrinsics/gen/frexp/eabd40.wgsl b/test/intrinsics/gen/frexp/eabd40.wgsl
index a2f580f..3f2f00d 100644
--- a/test/intrinsics/gen/frexp/eabd40.wgsl
+++ b/test/intrinsics/gen/frexp/eabd40.wgsl
@@ -28,18 +28,18 @@
   var res = frexp(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   frexp_eabd40();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   frexp_eabd40();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   frexp_eabd40();
 }
diff --git a/test/intrinsics/gen/frexp/eabd40.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/eabd40.wgsl.expected.wgsl
index 8dd5d1c..3bcd2b6 100644
--- a/test/intrinsics/gen/frexp/eabd40.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/eabd40.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res = frexp(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   frexp_eabd40();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   frexp_eabd40();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   frexp_eabd40();
 }
diff --git a/test/intrinsics/gen/fwidth/5d1b39.wgsl b/test/intrinsics/gen/fwidth/5d1b39.wgsl
index f323aca..8400934 100644
--- a/test/intrinsics/gen/fwidth/5d1b39.wgsl
+++ b/test/intrinsics/gen/fwidth/5d1b39.wgsl
@@ -28,7 +28,7 @@
   var res: vec3<f32> = fwidth(vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidth_5d1b39();
 }
diff --git a/test/intrinsics/gen/fwidth/5d1b39.wgsl.expected.wgsl b/test/intrinsics/gen/fwidth/5d1b39.wgsl.expected.wgsl
index b2f0692..f3c53fa 100644
--- a/test/intrinsics/gen/fwidth/5d1b39.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/fwidth/5d1b39.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec3<f32> = fwidth(vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidth_5d1b39();
 }
diff --git a/test/intrinsics/gen/fwidth/b83ebb.wgsl b/test/intrinsics/gen/fwidth/b83ebb.wgsl
index e528240..36592fd 100644
--- a/test/intrinsics/gen/fwidth/b83ebb.wgsl
+++ b/test/intrinsics/gen/fwidth/b83ebb.wgsl
@@ -28,7 +28,7 @@
   var res: vec2<f32> = fwidth(vec2<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidth_b83ebb();
 }
diff --git a/test/intrinsics/gen/fwidth/b83ebb.wgsl.expected.wgsl b/test/intrinsics/gen/fwidth/b83ebb.wgsl.expected.wgsl
index a858363..aa9e984 100644
--- a/test/intrinsics/gen/fwidth/b83ebb.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/fwidth/b83ebb.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec2<f32> = fwidth(vec2<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidth_b83ebb();
 }
diff --git a/test/intrinsics/gen/fwidth/d2ab9a.wgsl b/test/intrinsics/gen/fwidth/d2ab9a.wgsl
index 615e251..49c41ea 100644
--- a/test/intrinsics/gen/fwidth/d2ab9a.wgsl
+++ b/test/intrinsics/gen/fwidth/d2ab9a.wgsl
@@ -28,7 +28,7 @@
   var res: vec4<f32> = fwidth(vec4<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidth_d2ab9a();
 }
diff --git a/test/intrinsics/gen/fwidth/d2ab9a.wgsl.expected.wgsl b/test/intrinsics/gen/fwidth/d2ab9a.wgsl.expected.wgsl
index ee3c551..d5ba206 100644
--- a/test/intrinsics/gen/fwidth/d2ab9a.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/fwidth/d2ab9a.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec4<f32> = fwidth(vec4<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidth_d2ab9a();
 }
diff --git a/test/intrinsics/gen/fwidth/df38ef.wgsl b/test/intrinsics/gen/fwidth/df38ef.wgsl
index 5cd698d..9388812 100644
--- a/test/intrinsics/gen/fwidth/df38ef.wgsl
+++ b/test/intrinsics/gen/fwidth/df38ef.wgsl
@@ -28,7 +28,7 @@
   var res: f32 = fwidth(1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidth_df38ef();
 }
diff --git a/test/intrinsics/gen/fwidth/df38ef.wgsl.expected.wgsl b/test/intrinsics/gen/fwidth/df38ef.wgsl.expected.wgsl
index a0fcaec..b98137e 100644
--- a/test/intrinsics/gen/fwidth/df38ef.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/fwidth/df38ef.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : f32 = fwidth(1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidth_df38ef();
 }
diff --git a/test/intrinsics/gen/fwidthCoarse/159c8a.wgsl b/test/intrinsics/gen/fwidthCoarse/159c8a.wgsl
index 35df109..a7c4cd3 100644
--- a/test/intrinsics/gen/fwidthCoarse/159c8a.wgsl
+++ b/test/intrinsics/gen/fwidthCoarse/159c8a.wgsl
@@ -28,7 +28,7 @@
   var res: f32 = fwidthCoarse(1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidthCoarse_159c8a();
 }
diff --git a/test/intrinsics/gen/fwidthCoarse/159c8a.wgsl.expected.wgsl b/test/intrinsics/gen/fwidthCoarse/159c8a.wgsl.expected.wgsl
index f4c9169..1e592ef 100644
--- a/test/intrinsics/gen/fwidthCoarse/159c8a.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/fwidthCoarse/159c8a.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : f32 = fwidthCoarse(1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidthCoarse_159c8a();
 }
diff --git a/test/intrinsics/gen/fwidthCoarse/1e59d9.wgsl b/test/intrinsics/gen/fwidthCoarse/1e59d9.wgsl
index c1c41e1..044c582 100644
--- a/test/intrinsics/gen/fwidthCoarse/1e59d9.wgsl
+++ b/test/intrinsics/gen/fwidthCoarse/1e59d9.wgsl
@@ -28,7 +28,7 @@
   var res: vec3<f32> = fwidthCoarse(vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidthCoarse_1e59d9();
 }
diff --git a/test/intrinsics/gen/fwidthCoarse/1e59d9.wgsl.expected.wgsl b/test/intrinsics/gen/fwidthCoarse/1e59d9.wgsl.expected.wgsl
index 838c5e0..1352bf6 100644
--- a/test/intrinsics/gen/fwidthCoarse/1e59d9.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/fwidthCoarse/1e59d9.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec3<f32> = fwidthCoarse(vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidthCoarse_1e59d9();
 }
diff --git a/test/intrinsics/gen/fwidthCoarse/4e4fc4.wgsl b/test/intrinsics/gen/fwidthCoarse/4e4fc4.wgsl
index 1d7272e..da66152 100644
--- a/test/intrinsics/gen/fwidthCoarse/4e4fc4.wgsl
+++ b/test/intrinsics/gen/fwidthCoarse/4e4fc4.wgsl
@@ -28,7 +28,7 @@
   var res: vec4<f32> = fwidthCoarse(vec4<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidthCoarse_4e4fc4();
 }
diff --git a/test/intrinsics/gen/fwidthCoarse/4e4fc4.wgsl.expected.wgsl b/test/intrinsics/gen/fwidthCoarse/4e4fc4.wgsl.expected.wgsl
index 01eae21..3fea38a 100644
--- a/test/intrinsics/gen/fwidthCoarse/4e4fc4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/fwidthCoarse/4e4fc4.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec4<f32> = fwidthCoarse(vec4<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidthCoarse_4e4fc4();
 }
diff --git a/test/intrinsics/gen/fwidthCoarse/e653f7.wgsl b/test/intrinsics/gen/fwidthCoarse/e653f7.wgsl
index b27d20d..bfd46bb 100644
--- a/test/intrinsics/gen/fwidthCoarse/e653f7.wgsl
+++ b/test/intrinsics/gen/fwidthCoarse/e653f7.wgsl
@@ -28,7 +28,7 @@
   var res: vec2<f32> = fwidthCoarse(vec2<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidthCoarse_e653f7();
 }
diff --git a/test/intrinsics/gen/fwidthCoarse/e653f7.wgsl.expected.wgsl b/test/intrinsics/gen/fwidthCoarse/e653f7.wgsl.expected.wgsl
index 2bed1c7..9e5a1da 100644
--- a/test/intrinsics/gen/fwidthCoarse/e653f7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/fwidthCoarse/e653f7.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec2<f32> = fwidthCoarse(vec2<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidthCoarse_e653f7();
 }
diff --git a/test/intrinsics/gen/fwidthFine/523fdc.wgsl b/test/intrinsics/gen/fwidthFine/523fdc.wgsl
index a882b5c..d02b674 100644
--- a/test/intrinsics/gen/fwidthFine/523fdc.wgsl
+++ b/test/intrinsics/gen/fwidthFine/523fdc.wgsl
@@ -28,7 +28,7 @@
   var res: vec3<f32> = fwidthFine(vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidthFine_523fdc();
 }
diff --git a/test/intrinsics/gen/fwidthFine/523fdc.wgsl.expected.wgsl b/test/intrinsics/gen/fwidthFine/523fdc.wgsl.expected.wgsl
index d0fff42..41cb66c 100644
--- a/test/intrinsics/gen/fwidthFine/523fdc.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/fwidthFine/523fdc.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec3<f32> = fwidthFine(vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidthFine_523fdc();
 }
diff --git a/test/intrinsics/gen/fwidthFine/68f4ef.wgsl b/test/intrinsics/gen/fwidthFine/68f4ef.wgsl
index f3fce3b..cd641a0 100644
--- a/test/intrinsics/gen/fwidthFine/68f4ef.wgsl
+++ b/test/intrinsics/gen/fwidthFine/68f4ef.wgsl
@@ -28,7 +28,7 @@
   var res: vec4<f32> = fwidthFine(vec4<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidthFine_68f4ef();
 }
diff --git a/test/intrinsics/gen/fwidthFine/68f4ef.wgsl.expected.wgsl b/test/intrinsics/gen/fwidthFine/68f4ef.wgsl.expected.wgsl
index 19389eb..97f1033 100644
--- a/test/intrinsics/gen/fwidthFine/68f4ef.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/fwidthFine/68f4ef.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec4<f32> = fwidthFine(vec4<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidthFine_68f4ef();
 }
diff --git a/test/intrinsics/gen/fwidthFine/f1742d.wgsl b/test/intrinsics/gen/fwidthFine/f1742d.wgsl
index 8d6c71c..c78f9b0 100644
--- a/test/intrinsics/gen/fwidthFine/f1742d.wgsl
+++ b/test/intrinsics/gen/fwidthFine/f1742d.wgsl
@@ -28,7 +28,7 @@
   var res: f32 = fwidthFine(1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidthFine_f1742d();
 }
diff --git a/test/intrinsics/gen/fwidthFine/f1742d.wgsl.expected.wgsl b/test/intrinsics/gen/fwidthFine/f1742d.wgsl.expected.wgsl
index 6985860..4a764a5 100644
--- a/test/intrinsics/gen/fwidthFine/f1742d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/fwidthFine/f1742d.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : f32 = fwidthFine(1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidthFine_f1742d();
 }
diff --git a/test/intrinsics/gen/fwidthFine/ff6aa0.wgsl b/test/intrinsics/gen/fwidthFine/ff6aa0.wgsl
index ba6726e..4176ec2 100644
--- a/test/intrinsics/gen/fwidthFine/ff6aa0.wgsl
+++ b/test/intrinsics/gen/fwidthFine/ff6aa0.wgsl
@@ -28,7 +28,7 @@
   var res: vec2<f32> = fwidthFine(vec2<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidthFine_ff6aa0();
 }
diff --git a/test/intrinsics/gen/fwidthFine/ff6aa0.wgsl.expected.wgsl b/test/intrinsics/gen/fwidthFine/ff6aa0.wgsl.expected.wgsl
index c9b1e24..7ca7637 100644
--- a/test/intrinsics/gen/fwidthFine/ff6aa0.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/fwidthFine/ff6aa0.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   var res : vec2<f32> = fwidthFine(vec2<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fwidthFine_ff6aa0();
 }
diff --git a/test/intrinsics/gen/ignore/2a6ac2.wgsl b/test/intrinsics/gen/ignore/2a6ac2.wgsl
index a7bb0c6..b754307 100644
--- a/test/intrinsics/gen/ignore/2a6ac2.wgsl
+++ b/test/intrinsics/gen/ignore/2a6ac2.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_multisampled_2d;
+@group(1) @binding(0) var arg_0: texture_depth_multisampled_2d;
 
 // fn ignore(texture_depth_multisampled_2d)
 fn ignore_2a6ac2() {
   ignore(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_2a6ac2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_2a6ac2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_2a6ac2();
 }
diff --git a/test/intrinsics/gen/ignore/2a6ac2.wgsl.expected.wgsl b/test/intrinsics/gen/ignore/2a6ac2.wgsl.expected.wgsl
index c035b52..c6a2145 100644
--- a/test/intrinsics/gen/ignore/2a6ac2.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/ignore/2a6ac2.wgsl.expected.wgsl
@@ -2,24 +2,24 @@
   ignore(arg_0);
   ^^^^^^
 
-[[group(1), binding(0)]] var arg_0 : texture_depth_multisampled_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_multisampled_2d;
 
 fn ignore_2a6ac2() {
   ignore(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_2a6ac2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_2a6ac2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_2a6ac2();
 }
diff --git a/test/intrinsics/gen/ignore/5016e5.wgsl b/test/intrinsics/gen/ignore/5016e5.wgsl
index 8628618..0e49fb6 100644
--- a/test/intrinsics/gen/ignore/5016e5.wgsl
+++ b/test/intrinsics/gen/ignore/5016e5.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: sampler;
+@group(1) @binding(0) var arg_0: sampler;
 
 // fn ignore(sampler)
 fn ignore_5016e5() {
   ignore(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_5016e5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_5016e5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_5016e5();
 }
diff --git a/test/intrinsics/gen/ignore/5016e5.wgsl.expected.wgsl b/test/intrinsics/gen/ignore/5016e5.wgsl.expected.wgsl
index e422693..2d1c7b6 100644
--- a/test/intrinsics/gen/ignore/5016e5.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/ignore/5016e5.wgsl.expected.wgsl
@@ -2,24 +2,24 @@
   ignore(arg_0);
   ^^^^^^
 
-[[group(1), binding(0)]] var arg_0 : sampler;
+@group(1) @binding(0) var arg_0 : sampler;
 
 fn ignore_5016e5() {
   ignore(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_5016e5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_5016e5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_5016e5();
 }
diff --git a/test/intrinsics/gen/ignore/509355.wgsl b/test/intrinsics/gen/ignore/509355.wgsl
index 161002c..30557aa 100644
--- a/test/intrinsics/gen/ignore/509355.wgsl
+++ b/test/intrinsics/gen/ignore/509355.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_cube;
+@group(1) @binding(0) var arg_0: texture_depth_cube;
 
 // fn ignore(texture_depth_cube)
 fn ignore_509355() {
   ignore(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_509355();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_509355();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_509355();
 }
diff --git a/test/intrinsics/gen/ignore/509355.wgsl.expected.wgsl b/test/intrinsics/gen/ignore/509355.wgsl.expected.wgsl
index edfc4af..39d4815 100644
--- a/test/intrinsics/gen/ignore/509355.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/ignore/509355.wgsl.expected.wgsl
@@ -2,24 +2,24 @@
   ignore(arg_0);
   ^^^^^^
 
-[[group(1), binding(0)]] var arg_0 : texture_depth_cube;
+@group(1) @binding(0) var arg_0 : texture_depth_cube;
 
 fn ignore_509355() {
   ignore(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_509355();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_509355();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_509355();
 }
diff --git a/test/intrinsics/gen/ignore/51aeb7.wgsl b/test/intrinsics/gen/ignore/51aeb7.wgsl
index becd6dd..1f986d2 100644
--- a/test/intrinsics/gen/ignore/51aeb7.wgsl
+++ b/test/intrinsics/gen/ignore/51aeb7.wgsl
@@ -28,18 +28,18 @@
   ignore(1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_51aeb7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_51aeb7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_51aeb7();
 }
diff --git a/test/intrinsics/gen/ignore/51aeb7.wgsl.expected.wgsl b/test/intrinsics/gen/ignore/51aeb7.wgsl.expected.wgsl
index 8d35e83..9ecccc7 100644
--- a/test/intrinsics/gen/ignore/51aeb7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/ignore/51aeb7.wgsl.expected.wgsl
@@ -6,18 +6,18 @@
   ignore(1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_51aeb7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_51aeb7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_51aeb7();
 }
diff --git a/test/intrinsics/gen/ignore/5c9edf.wgsl b/test/intrinsics/gen/ignore/5c9edf.wgsl
index 74e0717..e53a664 100644
--- a/test/intrinsics/gen/ignore/5c9edf.wgsl
+++ b/test/intrinsics/gen/ignore/5c9edf.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_external;
+@group(1) @binding(0) var arg_0: texture_external;
 
 // fn ignore(texture_external)
 fn ignore_5c9edf() {
   ignore(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_5c9edf();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_5c9edf();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_5c9edf();
 }
diff --git a/test/intrinsics/gen/ignore/5c9edf.wgsl.expected.wgsl b/test/intrinsics/gen/ignore/5c9edf.wgsl.expected.wgsl
index d078cac..8249e9a 100644
--- a/test/intrinsics/gen/ignore/5c9edf.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/ignore/5c9edf.wgsl.expected.wgsl
@@ -2,24 +2,24 @@
   ignore(arg_0);
   ^^^^^^
 
-[[group(1), binding(0)]] var arg_0 : texture_external;
+@group(1) @binding(0) var arg_0 : texture_external;
 
 fn ignore_5c9edf() {
   ignore(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_5c9edf();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_5c9edf();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_5c9edf();
 }
diff --git a/test/intrinsics/gen/ignore/6698df.wgsl b/test/intrinsics/gen/ignore/6698df.wgsl
index 1952b04..b14856c 100644
--- a/test/intrinsics/gen/ignore/6698df.wgsl
+++ b/test/intrinsics/gen/ignore/6698df.wgsl
@@ -28,18 +28,18 @@
   ignore(1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_6698df();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_6698df();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_6698df();
 }
diff --git a/test/intrinsics/gen/ignore/6698df.wgsl.expected.wgsl b/test/intrinsics/gen/ignore/6698df.wgsl.expected.wgsl
index af3f6b5..1754276 100644
--- a/test/intrinsics/gen/ignore/6698df.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/ignore/6698df.wgsl.expected.wgsl
@@ -6,18 +6,18 @@
   ignore(1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_6698df();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_6698df();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_6698df();
 }
diff --git a/test/intrinsics/gen/ignore/ad88be.wgsl b/test/intrinsics/gen/ignore/ad88be.wgsl
index b957959..3812ea1 100644
--- a/test/intrinsics/gen/ignore/ad88be.wgsl
+++ b/test/intrinsics/gen/ignore/ad88be.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_cube_array;
+@group(1) @binding(0) var arg_0: texture_depth_cube_array;
 
 // fn ignore(texture_depth_cube_array)
 fn ignore_ad88be() {
   ignore(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_ad88be();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_ad88be();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_ad88be();
 }
diff --git a/test/intrinsics/gen/ignore/ad88be.wgsl.expected.wgsl b/test/intrinsics/gen/ignore/ad88be.wgsl.expected.wgsl
index a371726..08fa4ea 100644
--- a/test/intrinsics/gen/ignore/ad88be.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/ignore/ad88be.wgsl.expected.wgsl
@@ -2,24 +2,24 @@
   ignore(arg_0);
   ^^^^^^
 
-[[group(1), binding(0)]] var arg_0 : texture_depth_cube_array;
+@group(1) @binding(0) var arg_0 : texture_depth_cube_array;
 
 fn ignore_ad88be() {
   ignore(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_ad88be();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_ad88be();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_ad88be();
 }
diff --git a/test/intrinsics/gen/ignore/b469af.wgsl b/test/intrinsics/gen/ignore/b469af.wgsl
index 581ebef..a640d8b 100644
--- a/test/intrinsics/gen/ignore/b469af.wgsl
+++ b/test/intrinsics/gen/ignore/b469af.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: sampler_comparison;
+@group(1) @binding(0) var arg_0: sampler_comparison;
 
 // fn ignore(sampler_comparison)
 fn ignore_b469af() {
   ignore(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_b469af();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_b469af();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_b469af();
 }
diff --git a/test/intrinsics/gen/ignore/b469af.wgsl.expected.wgsl b/test/intrinsics/gen/ignore/b469af.wgsl.expected.wgsl
index d2270a8..0c42c5c 100644
--- a/test/intrinsics/gen/ignore/b469af.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/ignore/b469af.wgsl.expected.wgsl
@@ -2,24 +2,24 @@
   ignore(arg_0);
   ^^^^^^
 
-[[group(1), binding(0)]] var arg_0 : sampler_comparison;
+@group(1) @binding(0) var arg_0 : sampler_comparison;
 
 fn ignore_b469af() {
   ignore(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_b469af();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_b469af();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_b469af();
 }
diff --git a/test/intrinsics/gen/ignore/c8a0ee.wgsl b/test/intrinsics/gen/ignore/c8a0ee.wgsl
index 747f59b..773996b 100644
--- a/test/intrinsics/gen/ignore/c8a0ee.wgsl
+++ b/test/intrinsics/gen/ignore/c8a0ee.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d_array;
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
 
 // fn ignore(texture_depth_2d_array)
 fn ignore_c8a0ee() {
   ignore(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_c8a0ee();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_c8a0ee();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_c8a0ee();
 }
diff --git a/test/intrinsics/gen/ignore/c8a0ee.wgsl.expected.wgsl b/test/intrinsics/gen/ignore/c8a0ee.wgsl.expected.wgsl
index abb1ae9..6b3aa11 100644
--- a/test/intrinsics/gen/ignore/c8a0ee.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/ignore/c8a0ee.wgsl.expected.wgsl
@@ -2,24 +2,24 @@
   ignore(arg_0);
   ^^^^^^
 
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d_array;
+@group(1) @binding(0) var arg_0 : texture_depth_2d_array;
 
 fn ignore_c8a0ee() {
   ignore(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_c8a0ee();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_c8a0ee();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_c8a0ee();
 }
diff --git a/test/intrinsics/gen/ignore/d91a2f.wgsl b/test/intrinsics/gen/ignore/d91a2f.wgsl
index 22a8df5..5bda0fb 100644
--- a/test/intrinsics/gen/ignore/d91a2f.wgsl
+++ b/test/intrinsics/gen/ignore/d91a2f.wgsl
@@ -28,18 +28,18 @@
   ignore(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_d91a2f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_d91a2f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_d91a2f();
 }
diff --git a/test/intrinsics/gen/ignore/d91a2f.wgsl.expected.wgsl b/test/intrinsics/gen/ignore/d91a2f.wgsl.expected.wgsl
index d1d3f3e..b877665 100644
--- a/test/intrinsics/gen/ignore/d91a2f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/ignore/d91a2f.wgsl.expected.wgsl
@@ -6,18 +6,18 @@
   ignore(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_d91a2f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_d91a2f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_d91a2f();
 }
diff --git a/test/intrinsics/gen/ignore/e0187b.wgsl b/test/intrinsics/gen/ignore/e0187b.wgsl
index d62957c..0a7b36d 100644
--- a/test/intrinsics/gen/ignore/e0187b.wgsl
+++ b/test/intrinsics/gen/ignore/e0187b.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d;
+@group(1) @binding(0) var arg_0: texture_depth_2d;
 
 // fn ignore(texture_depth_2d)
 fn ignore_e0187b() {
   ignore(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_e0187b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_e0187b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_e0187b();
 }
diff --git a/test/intrinsics/gen/ignore/e0187b.wgsl.expected.wgsl b/test/intrinsics/gen/ignore/e0187b.wgsl.expected.wgsl
index aca8c14..0c3eb9d 100644
--- a/test/intrinsics/gen/ignore/e0187b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/ignore/e0187b.wgsl.expected.wgsl
@@ -2,24 +2,24 @@
   ignore(arg_0);
   ^^^^^^
 
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_2d;
 
 fn ignore_e0187b() {
   ignore(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_e0187b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_e0187b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_e0187b();
 }
diff --git a/test/intrinsics/gen/ignore/f414a6.wgsl b/test/intrinsics/gen/ignore/f414a6.wgsl
index 48b3a9b..a032392 100644
--- a/test/intrinsics/gen/ignore/f414a6.wgsl
+++ b/test/intrinsics/gen/ignore/f414a6.wgsl
@@ -28,18 +28,18 @@
   ignore(bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_f414a6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_f414a6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_f414a6();
 }
diff --git a/test/intrinsics/gen/ignore/f414a6.wgsl.expected.wgsl b/test/intrinsics/gen/ignore/f414a6.wgsl.expected.wgsl
index 389da66..bf60901 100644
--- a/test/intrinsics/gen/ignore/f414a6.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/ignore/f414a6.wgsl.expected.wgsl
@@ -6,18 +6,18 @@
   ignore(bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ignore_f414a6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ignore_f414a6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ignore_f414a6();
 }
diff --git a/test/intrinsics/gen/inverseSqrt/84407e.wgsl b/test/intrinsics/gen/inverseSqrt/84407e.wgsl
index 39e9b85..f6160f1 100644
--- a/test/intrinsics/gen/inverseSqrt/84407e.wgsl
+++ b/test/intrinsics/gen/inverseSqrt/84407e.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = inverseSqrt(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   inverseSqrt_84407e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   inverseSqrt_84407e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   inverseSqrt_84407e();
 }
diff --git a/test/intrinsics/gen/inverseSqrt/84407e.wgsl.expected.wgsl b/test/intrinsics/gen/inverseSqrt/84407e.wgsl.expected.wgsl
index a8350fc..707e317 100644
--- a/test/intrinsics/gen/inverseSqrt/84407e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/inverseSqrt/84407e.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = inverseSqrt(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   inverseSqrt_84407e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   inverseSqrt_84407e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   inverseSqrt_84407e();
 }
diff --git a/test/intrinsics/gen/inverseSqrt/8f2bd2.wgsl b/test/intrinsics/gen/inverseSqrt/8f2bd2.wgsl
index 96b1555..e94567e 100644
--- a/test/intrinsics/gen/inverseSqrt/8f2bd2.wgsl
+++ b/test/intrinsics/gen/inverseSqrt/8f2bd2.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = inverseSqrt(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   inverseSqrt_8f2bd2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   inverseSqrt_8f2bd2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   inverseSqrt_8f2bd2();
 }
diff --git a/test/intrinsics/gen/inverseSqrt/8f2bd2.wgsl.expected.wgsl b/test/intrinsics/gen/inverseSqrt/8f2bd2.wgsl.expected.wgsl
index 303dfaf..5554030 100644
--- a/test/intrinsics/gen/inverseSqrt/8f2bd2.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/inverseSqrt/8f2bd2.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = inverseSqrt(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   inverseSqrt_8f2bd2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   inverseSqrt_8f2bd2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   inverseSqrt_8f2bd2();
 }
diff --git a/test/intrinsics/gen/inverseSqrt/b197b1.wgsl b/test/intrinsics/gen/inverseSqrt/b197b1.wgsl
index 1f24f0f..c189515 100644
--- a/test/intrinsics/gen/inverseSqrt/b197b1.wgsl
+++ b/test/intrinsics/gen/inverseSqrt/b197b1.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = inverseSqrt(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   inverseSqrt_b197b1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   inverseSqrt_b197b1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   inverseSqrt_b197b1();
 }
diff --git a/test/intrinsics/gen/inverseSqrt/b197b1.wgsl.expected.wgsl b/test/intrinsics/gen/inverseSqrt/b197b1.wgsl.expected.wgsl
index 471c231..dd8bd71 100644
--- a/test/intrinsics/gen/inverseSqrt/b197b1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/inverseSqrt/b197b1.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = inverseSqrt(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   inverseSqrt_b197b1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   inverseSqrt_b197b1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   inverseSqrt_b197b1();
 }
diff --git a/test/intrinsics/gen/inverseSqrt/c22347.wgsl b/test/intrinsics/gen/inverseSqrt/c22347.wgsl
index 0d3f7b0..20e13f2 100644
--- a/test/intrinsics/gen/inverseSqrt/c22347.wgsl
+++ b/test/intrinsics/gen/inverseSqrt/c22347.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = inverseSqrt(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   inverseSqrt_c22347();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   inverseSqrt_c22347();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   inverseSqrt_c22347();
 }
diff --git a/test/intrinsics/gen/inverseSqrt/c22347.wgsl.expected.wgsl b/test/intrinsics/gen/inverseSqrt/c22347.wgsl.expected.wgsl
index 486a611..cc9c1a9 100644
--- a/test/intrinsics/gen/inverseSqrt/c22347.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/inverseSqrt/c22347.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = inverseSqrt(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   inverseSqrt_c22347();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   inverseSqrt_c22347();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   inverseSqrt_c22347();
 }
diff --git a/test/intrinsics/gen/isFinite/34d32b.wgsl b/test/intrinsics/gen/isFinite/34d32b.wgsl
index ea71b39..20d8b32 100644
--- a/test/intrinsics/gen/isFinite/34d32b.wgsl
+++ b/test/intrinsics/gen/isFinite/34d32b.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<bool> = isFinite(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isFinite_34d32b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isFinite_34d32b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isFinite_34d32b();
 }
diff --git a/test/intrinsics/gen/isFinite/34d32b.wgsl.expected.wgsl b/test/intrinsics/gen/isFinite/34d32b.wgsl.expected.wgsl
index e4cfe3f..8b38ba9 100644
--- a/test/intrinsics/gen/isFinite/34d32b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/isFinite/34d32b.wgsl.expected.wgsl
@@ -6,18 +6,18 @@
   var res : vec2<bool> = isFinite(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isFinite_34d32b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isFinite_34d32b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isFinite_34d32b();
 }
diff --git a/test/intrinsics/gen/isFinite/426f9f.wgsl b/test/intrinsics/gen/isFinite/426f9f.wgsl
index fd56d26..e43f7a6 100644
--- a/test/intrinsics/gen/isFinite/426f9f.wgsl
+++ b/test/intrinsics/gen/isFinite/426f9f.wgsl
@@ -28,18 +28,18 @@
   var res: bool = isFinite(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isFinite_426f9f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isFinite_426f9f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isFinite_426f9f();
 }
diff --git a/test/intrinsics/gen/isFinite/426f9f.wgsl.expected.wgsl b/test/intrinsics/gen/isFinite/426f9f.wgsl.expected.wgsl
index a0d931c..6dd9547 100644
--- a/test/intrinsics/gen/isFinite/426f9f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/isFinite/426f9f.wgsl.expected.wgsl
@@ -6,18 +6,18 @@
   var res : bool = isFinite(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isFinite_426f9f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isFinite_426f9f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isFinite_426f9f();
 }
diff --git a/test/intrinsics/gen/isFinite/8a23ad.wgsl b/test/intrinsics/gen/isFinite/8a23ad.wgsl
index b5611da..24a52c0 100644
--- a/test/intrinsics/gen/isFinite/8a23ad.wgsl
+++ b/test/intrinsics/gen/isFinite/8a23ad.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<bool> = isFinite(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isFinite_8a23ad();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isFinite_8a23ad();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isFinite_8a23ad();
 }
diff --git a/test/intrinsics/gen/isFinite/8a23ad.wgsl.expected.wgsl b/test/intrinsics/gen/isFinite/8a23ad.wgsl.expected.wgsl
index 807cfde..6aa23a5 100644
--- a/test/intrinsics/gen/isFinite/8a23ad.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/isFinite/8a23ad.wgsl.expected.wgsl
@@ -6,18 +6,18 @@
   var res : vec3<bool> = isFinite(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isFinite_8a23ad();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isFinite_8a23ad();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isFinite_8a23ad();
 }
diff --git a/test/intrinsics/gen/isFinite/f31987.wgsl b/test/intrinsics/gen/isFinite/f31987.wgsl
index f7e6e54..0a3f631 100644
--- a/test/intrinsics/gen/isFinite/f31987.wgsl
+++ b/test/intrinsics/gen/isFinite/f31987.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<bool> = isFinite(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isFinite_f31987();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isFinite_f31987();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isFinite_f31987();
 }
diff --git a/test/intrinsics/gen/isFinite/f31987.wgsl.expected.wgsl b/test/intrinsics/gen/isFinite/f31987.wgsl.expected.wgsl
index a1361e1..a5e86db 100644
--- a/test/intrinsics/gen/isFinite/f31987.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/isFinite/f31987.wgsl.expected.wgsl
@@ -6,18 +6,18 @@
   var res : vec4<bool> = isFinite(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isFinite_f31987();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isFinite_f31987();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isFinite_f31987();
 }
diff --git a/test/intrinsics/gen/isInf/666f2a.wgsl b/test/intrinsics/gen/isInf/666f2a.wgsl
index 7199b08..7550d27 100644
--- a/test/intrinsics/gen/isInf/666f2a.wgsl
+++ b/test/intrinsics/gen/isInf/666f2a.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<bool> = isInf(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isInf_666f2a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isInf_666f2a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isInf_666f2a();
 }
diff --git a/test/intrinsics/gen/isInf/666f2a.wgsl.expected.wgsl b/test/intrinsics/gen/isInf/666f2a.wgsl.expected.wgsl
index e5076f5..4fa25cb 100644
--- a/test/intrinsics/gen/isInf/666f2a.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/isInf/666f2a.wgsl.expected.wgsl
@@ -6,18 +6,18 @@
   var res : vec3<bool> = isInf(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isInf_666f2a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isInf_666f2a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isInf_666f2a();
 }
diff --git a/test/intrinsics/gen/isInf/7bd98f.wgsl b/test/intrinsics/gen/isInf/7bd98f.wgsl
index e178e40..eaea74d 100644
--- a/test/intrinsics/gen/isInf/7bd98f.wgsl
+++ b/test/intrinsics/gen/isInf/7bd98f.wgsl
@@ -28,18 +28,18 @@
   var res: bool = isInf(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isInf_7bd98f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isInf_7bd98f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isInf_7bd98f();
 }
diff --git a/test/intrinsics/gen/isInf/7bd98f.wgsl.expected.wgsl b/test/intrinsics/gen/isInf/7bd98f.wgsl.expected.wgsl
index 281dc74..82deb30 100644
--- a/test/intrinsics/gen/isInf/7bd98f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/isInf/7bd98f.wgsl.expected.wgsl
@@ -6,18 +6,18 @@
   var res : bool = isInf(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isInf_7bd98f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isInf_7bd98f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isInf_7bd98f();
 }
diff --git a/test/intrinsics/gen/isInf/7e81b5.wgsl b/test/intrinsics/gen/isInf/7e81b5.wgsl
index d6fc7d2..0a96753 100644
--- a/test/intrinsics/gen/isInf/7e81b5.wgsl
+++ b/test/intrinsics/gen/isInf/7e81b5.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<bool> = isInf(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isInf_7e81b5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isInf_7e81b5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isInf_7e81b5();
 }
diff --git a/test/intrinsics/gen/isInf/7e81b5.wgsl.expected.wgsl b/test/intrinsics/gen/isInf/7e81b5.wgsl.expected.wgsl
index 24b76af..3fced5a 100644
--- a/test/intrinsics/gen/isInf/7e81b5.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/isInf/7e81b5.wgsl.expected.wgsl
@@ -6,18 +6,18 @@
   var res : vec4<bool> = isInf(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isInf_7e81b5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isInf_7e81b5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isInf_7e81b5();
 }
diff --git a/test/intrinsics/gen/isInf/a46d6f.wgsl b/test/intrinsics/gen/isInf/a46d6f.wgsl
index 9919b5d..5841a41 100644
--- a/test/intrinsics/gen/isInf/a46d6f.wgsl
+++ b/test/intrinsics/gen/isInf/a46d6f.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<bool> = isInf(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isInf_a46d6f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isInf_a46d6f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isInf_a46d6f();
 }
diff --git a/test/intrinsics/gen/isInf/a46d6f.wgsl.expected.wgsl b/test/intrinsics/gen/isInf/a46d6f.wgsl.expected.wgsl
index 26cac94..3fa68d9 100644
--- a/test/intrinsics/gen/isInf/a46d6f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/isInf/a46d6f.wgsl.expected.wgsl
@@ -6,18 +6,18 @@
   var res : vec2<bool> = isInf(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isInf_a46d6f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isInf_a46d6f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isInf_a46d6f();
 }
diff --git a/test/intrinsics/gen/isNan/1280ab.wgsl b/test/intrinsics/gen/isNan/1280ab.wgsl
index 6601a11..fb5e25c 100644
--- a/test/intrinsics/gen/isNan/1280ab.wgsl
+++ b/test/intrinsics/gen/isNan/1280ab.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<bool> = isNan(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isNan_1280ab();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isNan_1280ab();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isNan_1280ab();
 }
diff --git a/test/intrinsics/gen/isNan/1280ab.wgsl.expected.wgsl b/test/intrinsics/gen/isNan/1280ab.wgsl.expected.wgsl
index c4fd059..ec27bcd 100644
--- a/test/intrinsics/gen/isNan/1280ab.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/isNan/1280ab.wgsl.expected.wgsl
@@ -6,18 +6,18 @@
   var res : vec3<bool> = isNan(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isNan_1280ab();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isNan_1280ab();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isNan_1280ab();
 }
diff --git a/test/intrinsics/gen/isNan/4d280d.wgsl b/test/intrinsics/gen/isNan/4d280d.wgsl
index 058d425..330440d 100644
--- a/test/intrinsics/gen/isNan/4d280d.wgsl
+++ b/test/intrinsics/gen/isNan/4d280d.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<bool> = isNan(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isNan_4d280d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isNan_4d280d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isNan_4d280d();
 }
diff --git a/test/intrinsics/gen/isNan/4d280d.wgsl.expected.wgsl b/test/intrinsics/gen/isNan/4d280d.wgsl.expected.wgsl
index 097488c..57ba354 100644
--- a/test/intrinsics/gen/isNan/4d280d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/isNan/4d280d.wgsl.expected.wgsl
@@ -6,18 +6,18 @@
   var res : vec4<bool> = isNan(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isNan_4d280d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isNan_4d280d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isNan_4d280d();
 }
diff --git a/test/intrinsics/gen/isNan/67ecd3.wgsl b/test/intrinsics/gen/isNan/67ecd3.wgsl
index 7237e05..9b082ec 100644
--- a/test/intrinsics/gen/isNan/67ecd3.wgsl
+++ b/test/intrinsics/gen/isNan/67ecd3.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<bool> = isNan(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isNan_67ecd3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isNan_67ecd3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isNan_67ecd3();
 }
diff --git a/test/intrinsics/gen/isNan/67ecd3.wgsl.expected.wgsl b/test/intrinsics/gen/isNan/67ecd3.wgsl.expected.wgsl
index 49b0c8a..2f9573d 100644
--- a/test/intrinsics/gen/isNan/67ecd3.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/isNan/67ecd3.wgsl.expected.wgsl
@@ -6,18 +6,18 @@
   var res : vec2<bool> = isNan(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isNan_67ecd3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isNan_67ecd3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isNan_67ecd3();
 }
diff --git a/test/intrinsics/gen/isNan/e4978e.wgsl b/test/intrinsics/gen/isNan/e4978e.wgsl
index 8cf7130..f28a7d1 100644
--- a/test/intrinsics/gen/isNan/e4978e.wgsl
+++ b/test/intrinsics/gen/isNan/e4978e.wgsl
@@ -28,18 +28,18 @@
   var res: bool = isNan(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isNan_e4978e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isNan_e4978e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isNan_e4978e();
 }
diff --git a/test/intrinsics/gen/isNan/e4978e.wgsl.expected.wgsl b/test/intrinsics/gen/isNan/e4978e.wgsl.expected.wgsl
index 12d2aa0..0e27431 100644
--- a/test/intrinsics/gen/isNan/e4978e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/isNan/e4978e.wgsl.expected.wgsl
@@ -6,18 +6,18 @@
   var res : bool = isNan(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isNan_e4978e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isNan_e4978e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isNan_e4978e();
 }
diff --git a/test/intrinsics/gen/isNormal/863dcd.wgsl b/test/intrinsics/gen/isNormal/863dcd.wgsl
index ab0f294..a814ddb 100644
--- a/test/intrinsics/gen/isNormal/863dcd.wgsl
+++ b/test/intrinsics/gen/isNormal/863dcd.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<bool> = isNormal(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isNormal_863dcd();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isNormal_863dcd();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isNormal_863dcd();
 }
diff --git a/test/intrinsics/gen/isNormal/863dcd.wgsl.expected.wgsl b/test/intrinsics/gen/isNormal/863dcd.wgsl.expected.wgsl
index d9ba428..79f0261 100644
--- a/test/intrinsics/gen/isNormal/863dcd.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/isNormal/863dcd.wgsl.expected.wgsl
@@ -6,18 +6,18 @@
   var res : vec4<bool> = isNormal(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isNormal_863dcd();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isNormal_863dcd();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isNormal_863dcd();
 }
diff --git a/test/intrinsics/gen/isNormal/b00ab1.wgsl b/test/intrinsics/gen/isNormal/b00ab1.wgsl
index 5a67dee..7113dcc 100644
--- a/test/intrinsics/gen/isNormal/b00ab1.wgsl
+++ b/test/intrinsics/gen/isNormal/b00ab1.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<bool> = isNormal(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isNormal_b00ab1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isNormal_b00ab1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isNormal_b00ab1();
 }
diff --git a/test/intrinsics/gen/isNormal/b00ab1.wgsl.expected.wgsl b/test/intrinsics/gen/isNormal/b00ab1.wgsl.expected.wgsl
index b85bc1f..c6b748c 100644
--- a/test/intrinsics/gen/isNormal/b00ab1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/isNormal/b00ab1.wgsl.expected.wgsl
@@ -6,18 +6,18 @@
   var res : vec2<bool> = isNormal(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isNormal_b00ab1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isNormal_b00ab1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isNormal_b00ab1();
 }
diff --git a/test/intrinsics/gen/isNormal/c286b7.wgsl b/test/intrinsics/gen/isNormal/c286b7.wgsl
index 2f87055..b44cb1f 100644
--- a/test/intrinsics/gen/isNormal/c286b7.wgsl
+++ b/test/intrinsics/gen/isNormal/c286b7.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<bool> = isNormal(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isNormal_c286b7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isNormal_c286b7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isNormal_c286b7();
 }
diff --git a/test/intrinsics/gen/isNormal/c286b7.wgsl.expected.wgsl b/test/intrinsics/gen/isNormal/c286b7.wgsl.expected.wgsl
index 4b36826..ca46949 100644
--- a/test/intrinsics/gen/isNormal/c286b7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/isNormal/c286b7.wgsl.expected.wgsl
@@ -6,18 +6,18 @@
   var res : vec3<bool> = isNormal(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isNormal_c286b7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isNormal_c286b7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isNormal_c286b7();
 }
diff --git a/test/intrinsics/gen/isNormal/c6e880.wgsl b/test/intrinsics/gen/isNormal/c6e880.wgsl
index d223b08..a5d8390 100644
--- a/test/intrinsics/gen/isNormal/c6e880.wgsl
+++ b/test/intrinsics/gen/isNormal/c6e880.wgsl
@@ -28,18 +28,18 @@
   var res: bool = isNormal(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isNormal_c6e880();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isNormal_c6e880();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isNormal_c6e880();
 }
diff --git a/test/intrinsics/gen/isNormal/c6e880.wgsl.expected.wgsl b/test/intrinsics/gen/isNormal/c6e880.wgsl.expected.wgsl
index 0061366..1dc6685 100644
--- a/test/intrinsics/gen/isNormal/c6e880.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/isNormal/c6e880.wgsl.expected.wgsl
@@ -6,18 +6,18 @@
   var res : bool = isNormal(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   isNormal_c6e880();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   isNormal_c6e880();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   isNormal_c6e880();
 }
diff --git a/test/intrinsics/gen/ldexp/a31cdc.wgsl b/test/intrinsics/gen/ldexp/a31cdc.wgsl
index f5df9a3..2994d5f 100644
--- a/test/intrinsics/gen/ldexp/a31cdc.wgsl
+++ b/test/intrinsics/gen/ldexp/a31cdc.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = ldexp(vec3<f32>(), vec3<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ldexp_a31cdc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ldexp_a31cdc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ldexp_a31cdc();
 }
diff --git a/test/intrinsics/gen/ldexp/a31cdc.wgsl.expected.wgsl b/test/intrinsics/gen/ldexp/a31cdc.wgsl.expected.wgsl
index 975e921..357faa1 100644
--- a/test/intrinsics/gen/ldexp/a31cdc.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/ldexp/a31cdc.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = ldexp(vec3<f32>(), vec3<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ldexp_a31cdc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ldexp_a31cdc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ldexp_a31cdc();
 }
diff --git a/test/intrinsics/gen/ldexp/abd718.wgsl b/test/intrinsics/gen/ldexp/abd718.wgsl
index 94ae023..5fec178 100644
--- a/test/intrinsics/gen/ldexp/abd718.wgsl
+++ b/test/intrinsics/gen/ldexp/abd718.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = ldexp(vec2<f32>(), vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ldexp_abd718();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ldexp_abd718();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ldexp_abd718();
 }
diff --git a/test/intrinsics/gen/ldexp/abd718.wgsl.expected.wgsl b/test/intrinsics/gen/ldexp/abd718.wgsl.expected.wgsl
index bbd48db..87314bf 100644
--- a/test/intrinsics/gen/ldexp/abd718.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/ldexp/abd718.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = ldexp(vec2<f32>(), vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ldexp_abd718();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ldexp_abd718();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ldexp_abd718();
 }
diff --git a/test/intrinsics/gen/ldexp/cc9cde.wgsl b/test/intrinsics/gen/ldexp/cc9cde.wgsl
index a2f0de9..9f4702e 100644
--- a/test/intrinsics/gen/ldexp/cc9cde.wgsl
+++ b/test/intrinsics/gen/ldexp/cc9cde.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = ldexp(vec4<f32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ldexp_cc9cde();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ldexp_cc9cde();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ldexp_cc9cde();
 }
diff --git a/test/intrinsics/gen/ldexp/cc9cde.wgsl.expected.wgsl b/test/intrinsics/gen/ldexp/cc9cde.wgsl.expected.wgsl
index b71f7fb..c2fc1ae 100644
--- a/test/intrinsics/gen/ldexp/cc9cde.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/ldexp/cc9cde.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = ldexp(vec4<f32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ldexp_cc9cde();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ldexp_cc9cde();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ldexp_cc9cde();
 }
diff --git a/test/intrinsics/gen/ldexp/db8b49.wgsl b/test/intrinsics/gen/ldexp/db8b49.wgsl
index 9975cf4..f0f29a1 100644
--- a/test/intrinsics/gen/ldexp/db8b49.wgsl
+++ b/test/intrinsics/gen/ldexp/db8b49.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = ldexp(1.0, 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ldexp_db8b49();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ldexp_db8b49();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ldexp_db8b49();
 }
diff --git a/test/intrinsics/gen/ldexp/db8b49.wgsl.expected.wgsl b/test/intrinsics/gen/ldexp/db8b49.wgsl.expected.wgsl
index 7c5e77d..41f84f9 100644
--- a/test/intrinsics/gen/ldexp/db8b49.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/ldexp/db8b49.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = ldexp(1.0, 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   ldexp_db8b49();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   ldexp_db8b49();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   ldexp_db8b49();
 }
diff --git a/test/intrinsics/gen/length/056071.wgsl b/test/intrinsics/gen/length/056071.wgsl
index e9ada2c..46dfdfe 100644
--- a/test/intrinsics/gen/length/056071.wgsl
+++ b/test/intrinsics/gen/length/056071.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = length(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   length_056071();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   length_056071();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   length_056071();
 }
diff --git a/test/intrinsics/gen/length/056071.wgsl.expected.wgsl b/test/intrinsics/gen/length/056071.wgsl.expected.wgsl
index 7487a7a..a7dddf9 100644
--- a/test/intrinsics/gen/length/056071.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/length/056071.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = length(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   length_056071();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   length_056071();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   length_056071();
 }
diff --git a/test/intrinsics/gen/length/602a17.wgsl b/test/intrinsics/gen/length/602a17.wgsl
index e39f84e..4458a54 100644
--- a/test/intrinsics/gen/length/602a17.wgsl
+++ b/test/intrinsics/gen/length/602a17.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = length(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   length_602a17();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   length_602a17();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   length_602a17();
 }
diff --git a/test/intrinsics/gen/length/602a17.wgsl.expected.wgsl b/test/intrinsics/gen/length/602a17.wgsl.expected.wgsl
index b00a0e1..dbf073b 100644
--- a/test/intrinsics/gen/length/602a17.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/length/602a17.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = length(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   length_602a17();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   length_602a17();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   length_602a17();
 }
diff --git a/test/intrinsics/gen/length/afde8b.wgsl b/test/intrinsics/gen/length/afde8b.wgsl
index d66503f..0e7faf2 100644
--- a/test/intrinsics/gen/length/afde8b.wgsl
+++ b/test/intrinsics/gen/length/afde8b.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = length(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   length_afde8b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   length_afde8b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   length_afde8b();
 }
diff --git a/test/intrinsics/gen/length/afde8b.wgsl.expected.wgsl b/test/intrinsics/gen/length/afde8b.wgsl.expected.wgsl
index 7bc1249..04d7497 100644
--- a/test/intrinsics/gen/length/afde8b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/length/afde8b.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = length(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   length_afde8b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   length_afde8b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   length_afde8b();
 }
diff --git a/test/intrinsics/gen/length/becebf.wgsl b/test/intrinsics/gen/length/becebf.wgsl
index 5682959..5029412 100644
--- a/test/intrinsics/gen/length/becebf.wgsl
+++ b/test/intrinsics/gen/length/becebf.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = length(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   length_becebf();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   length_becebf();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   length_becebf();
 }
diff --git a/test/intrinsics/gen/length/becebf.wgsl.expected.wgsl b/test/intrinsics/gen/length/becebf.wgsl.expected.wgsl
index 2dfa36f..2a90f07 100644
--- a/test/intrinsics/gen/length/becebf.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/length/becebf.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = length(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   length_becebf();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   length_becebf();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   length_becebf();
 }
diff --git a/test/intrinsics/gen/log/3da25a.wgsl b/test/intrinsics/gen/log/3da25a.wgsl
index 785a7f4..12e9fe3 100644
--- a/test/intrinsics/gen/log/3da25a.wgsl
+++ b/test/intrinsics/gen/log/3da25a.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = log(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   log_3da25a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   log_3da25a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   log_3da25a();
 }
diff --git a/test/intrinsics/gen/log/3da25a.wgsl.expected.wgsl b/test/intrinsics/gen/log/3da25a.wgsl.expected.wgsl
index fd72a7e..2265445 100644
--- a/test/intrinsics/gen/log/3da25a.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/log/3da25a.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = log(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   log_3da25a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   log_3da25a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   log_3da25a();
 }
diff --git a/test/intrinsics/gen/log/7114a6.wgsl b/test/intrinsics/gen/log/7114a6.wgsl
index 3d16357..0332f5b 100644
--- a/test/intrinsics/gen/log/7114a6.wgsl
+++ b/test/intrinsics/gen/log/7114a6.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = log(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   log_7114a6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   log_7114a6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   log_7114a6();
 }
diff --git a/test/intrinsics/gen/log/7114a6.wgsl.expected.wgsl b/test/intrinsics/gen/log/7114a6.wgsl.expected.wgsl
index 9e282b4..6a688f0 100644
--- a/test/intrinsics/gen/log/7114a6.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/log/7114a6.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = log(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   log_7114a6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   log_7114a6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   log_7114a6();
 }
diff --git a/test/intrinsics/gen/log/b2ce28.wgsl b/test/intrinsics/gen/log/b2ce28.wgsl
index a302729..be0a07b 100644
--- a/test/intrinsics/gen/log/b2ce28.wgsl
+++ b/test/intrinsics/gen/log/b2ce28.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = log(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   log_b2ce28();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   log_b2ce28();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   log_b2ce28();
 }
diff --git a/test/intrinsics/gen/log/b2ce28.wgsl.expected.wgsl b/test/intrinsics/gen/log/b2ce28.wgsl.expected.wgsl
index 1167e0a..023eb1b 100644
--- a/test/intrinsics/gen/log/b2ce28.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/log/b2ce28.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = log(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   log_b2ce28();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   log_b2ce28();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   log_b2ce28();
 }
diff --git a/test/intrinsics/gen/log/f4c570.wgsl b/test/intrinsics/gen/log/f4c570.wgsl
index 513e900..e705146 100644
--- a/test/intrinsics/gen/log/f4c570.wgsl
+++ b/test/intrinsics/gen/log/f4c570.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = log(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   log_f4c570();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   log_f4c570();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   log_f4c570();
 }
diff --git a/test/intrinsics/gen/log/f4c570.wgsl.expected.wgsl b/test/intrinsics/gen/log/f4c570.wgsl.expected.wgsl
index 01cb910..9317aad 100644
--- a/test/intrinsics/gen/log/f4c570.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/log/f4c570.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = log(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   log_f4c570();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   log_f4c570();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   log_f4c570();
 }
diff --git a/test/intrinsics/gen/log2/4036ed.wgsl b/test/intrinsics/gen/log2/4036ed.wgsl
index b9e6cda..0932fb4 100644
--- a/test/intrinsics/gen/log2/4036ed.wgsl
+++ b/test/intrinsics/gen/log2/4036ed.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = log2(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   log2_4036ed();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   log2_4036ed();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   log2_4036ed();
 }
diff --git a/test/intrinsics/gen/log2/4036ed.wgsl.expected.wgsl b/test/intrinsics/gen/log2/4036ed.wgsl.expected.wgsl
index ab03ce1..e64775f 100644
--- a/test/intrinsics/gen/log2/4036ed.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/log2/4036ed.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = log2(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   log2_4036ed();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   log2_4036ed();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   log2_4036ed();
 }
diff --git a/test/intrinsics/gen/log2/902988.wgsl b/test/intrinsics/gen/log2/902988.wgsl
index 8d01023..83325a2 100644
--- a/test/intrinsics/gen/log2/902988.wgsl
+++ b/test/intrinsics/gen/log2/902988.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = log2(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   log2_902988();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   log2_902988();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   log2_902988();
 }
diff --git a/test/intrinsics/gen/log2/902988.wgsl.expected.wgsl b/test/intrinsics/gen/log2/902988.wgsl.expected.wgsl
index 9d4277b..345da9e 100644
--- a/test/intrinsics/gen/log2/902988.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/log2/902988.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = log2(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   log2_902988();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   log2_902988();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   log2_902988();
 }
diff --git a/test/intrinsics/gen/log2/adb233.wgsl b/test/intrinsics/gen/log2/adb233.wgsl
index 3270689..f231a4a 100644
--- a/test/intrinsics/gen/log2/adb233.wgsl
+++ b/test/intrinsics/gen/log2/adb233.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = log2(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   log2_adb233();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   log2_adb233();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   log2_adb233();
 }
diff --git a/test/intrinsics/gen/log2/adb233.wgsl.expected.wgsl b/test/intrinsics/gen/log2/adb233.wgsl.expected.wgsl
index e41ac20..89634c2 100644
--- a/test/intrinsics/gen/log2/adb233.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/log2/adb233.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = log2(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   log2_adb233();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   log2_adb233();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   log2_adb233();
 }
diff --git a/test/intrinsics/gen/log2/aea659.wgsl b/test/intrinsics/gen/log2/aea659.wgsl
index 3700f20..d874511 100644
--- a/test/intrinsics/gen/log2/aea659.wgsl
+++ b/test/intrinsics/gen/log2/aea659.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = log2(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   log2_aea659();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   log2_aea659();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   log2_aea659();
 }
diff --git a/test/intrinsics/gen/log2/aea659.wgsl.expected.wgsl b/test/intrinsics/gen/log2/aea659.wgsl.expected.wgsl
index aa490dd..a77648e 100644
--- a/test/intrinsics/gen/log2/aea659.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/log2/aea659.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = log2(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   log2_aea659();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   log2_aea659();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   log2_aea659();
 }
diff --git a/test/intrinsics/gen/max/0c0aae.wgsl b/test/intrinsics/gen/max/0c0aae.wgsl
index 9700838..1dcd5e8 100644
--- a/test/intrinsics/gen/max/0c0aae.wgsl
+++ b/test/intrinsics/gen/max/0c0aae.wgsl
@@ -28,18 +28,18 @@
   var res: u32 = max(1u, 1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_0c0aae();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_0c0aae();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_0c0aae();
 }
diff --git a/test/intrinsics/gen/max/0c0aae.wgsl.expected.wgsl b/test/intrinsics/gen/max/0c0aae.wgsl.expected.wgsl
index b463469..a34b9ff 100644
--- a/test/intrinsics/gen/max/0c0aae.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/max/0c0aae.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : u32 = max(1u, 1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_0c0aae();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_0c0aae();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_0c0aae();
 }
diff --git a/test/intrinsics/gen/max/25eafe.wgsl b/test/intrinsics/gen/max/25eafe.wgsl
index 4940f1f..238cba1 100644
--- a/test/intrinsics/gen/max/25eafe.wgsl
+++ b/test/intrinsics/gen/max/25eafe.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<i32> = max(vec3<i32>(), vec3<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_25eafe();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_25eafe();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_25eafe();
 }
diff --git a/test/intrinsics/gen/max/25eafe.wgsl.expected.wgsl b/test/intrinsics/gen/max/25eafe.wgsl.expected.wgsl
index 55e740b..7b9f06a 100644
--- a/test/intrinsics/gen/max/25eafe.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/max/25eafe.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<i32> = max(vec3<i32>(), vec3<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_25eafe();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_25eafe();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_25eafe();
 }
diff --git a/test/intrinsics/gen/max/320815.wgsl b/test/intrinsics/gen/max/320815.wgsl
index 1bf7867..e4b11d1 100644
--- a/test/intrinsics/gen/max/320815.wgsl
+++ b/test/intrinsics/gen/max/320815.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<u32> = max(vec2<u32>(), vec2<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_320815();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_320815();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_320815();
 }
diff --git a/test/intrinsics/gen/max/320815.wgsl.expected.wgsl b/test/intrinsics/gen/max/320815.wgsl.expected.wgsl
index 16d126f..04e54a0 100644
--- a/test/intrinsics/gen/max/320815.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/max/320815.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<u32> = max(vec2<u32>(), vec2<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_320815();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_320815();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_320815();
 }
diff --git a/test/intrinsics/gen/max/44a39d.wgsl b/test/intrinsics/gen/max/44a39d.wgsl
index 039fe2f..9af6704 100644
--- a/test/intrinsics/gen/max/44a39d.wgsl
+++ b/test/intrinsics/gen/max/44a39d.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = max(1.0, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_44a39d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_44a39d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_44a39d();
 }
diff --git a/test/intrinsics/gen/max/44a39d.wgsl.expected.wgsl b/test/intrinsics/gen/max/44a39d.wgsl.expected.wgsl
index d39969c..1913b8f 100644
--- a/test/intrinsics/gen/max/44a39d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/max/44a39d.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = max(1.0, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_44a39d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_44a39d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_44a39d();
 }
diff --git a/test/intrinsics/gen/max/453e04.wgsl b/test/intrinsics/gen/max/453e04.wgsl
index 14eab28..b3813d9 100644
--- a/test/intrinsics/gen/max/453e04.wgsl
+++ b/test/intrinsics/gen/max/453e04.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<u32> = max(vec4<u32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_453e04();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_453e04();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_453e04();
 }
diff --git a/test/intrinsics/gen/max/453e04.wgsl.expected.wgsl b/test/intrinsics/gen/max/453e04.wgsl.expected.wgsl
index ba0921f..39e7e48 100644
--- a/test/intrinsics/gen/max/453e04.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/max/453e04.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<u32> = max(vec4<u32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_453e04();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_453e04();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_453e04();
 }
diff --git a/test/intrinsics/gen/max/462050.wgsl b/test/intrinsics/gen/max/462050.wgsl
index b6bc2da..03523b9 100644
--- a/test/intrinsics/gen/max/462050.wgsl
+++ b/test/intrinsics/gen/max/462050.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = max(vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_462050();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_462050();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_462050();
 }
diff --git a/test/intrinsics/gen/max/462050.wgsl.expected.wgsl b/test/intrinsics/gen/max/462050.wgsl.expected.wgsl
index f0f482f..eec4107 100644
--- a/test/intrinsics/gen/max/462050.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/max/462050.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = max(vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_462050();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_462050();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_462050();
 }
diff --git a/test/intrinsics/gen/max/4883ac.wgsl b/test/intrinsics/gen/max/4883ac.wgsl
index 607e45e..a0244ea 100644
--- a/test/intrinsics/gen/max/4883ac.wgsl
+++ b/test/intrinsics/gen/max/4883ac.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = max(vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_4883ac();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_4883ac();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_4883ac();
 }
diff --git a/test/intrinsics/gen/max/4883ac.wgsl.expected.wgsl b/test/intrinsics/gen/max/4883ac.wgsl.expected.wgsl
index 4f4feab..cc37098 100644
--- a/test/intrinsics/gen/max/4883ac.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/max/4883ac.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = max(vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_4883ac();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_4883ac();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_4883ac();
 }
diff --git a/test/intrinsics/gen/max/85e6bc.wgsl b/test/intrinsics/gen/max/85e6bc.wgsl
index ff478ac..5e8f666 100644
--- a/test/intrinsics/gen/max/85e6bc.wgsl
+++ b/test/intrinsics/gen/max/85e6bc.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<i32> = max(vec4<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_85e6bc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_85e6bc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_85e6bc();
 }
diff --git a/test/intrinsics/gen/max/85e6bc.wgsl.expected.wgsl b/test/intrinsics/gen/max/85e6bc.wgsl.expected.wgsl
index b3d9371..6f6b39f 100644
--- a/test/intrinsics/gen/max/85e6bc.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/max/85e6bc.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<i32> = max(vec4<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_85e6bc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_85e6bc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_85e6bc();
 }
diff --git a/test/intrinsics/gen/max/a93419.wgsl b/test/intrinsics/gen/max/a93419.wgsl
index 60e7ee6..4dc296a 100644
--- a/test/intrinsics/gen/max/a93419.wgsl
+++ b/test/intrinsics/gen/max/a93419.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = max(vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_a93419();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_a93419();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_a93419();
 }
diff --git a/test/intrinsics/gen/max/a93419.wgsl.expected.wgsl b/test/intrinsics/gen/max/a93419.wgsl.expected.wgsl
index 9e06421..8c1c938 100644
--- a/test/intrinsics/gen/max/a93419.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/max/a93419.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = max(vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_a93419();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_a93419();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_a93419();
 }
diff --git a/test/intrinsics/gen/max/b1b73a.wgsl b/test/intrinsics/gen/max/b1b73a.wgsl
index a05dd2a..17a9808 100644
--- a/test/intrinsics/gen/max/b1b73a.wgsl
+++ b/test/intrinsics/gen/max/b1b73a.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<u32> = max(vec3<u32>(), vec3<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_b1b73a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_b1b73a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_b1b73a();
 }
diff --git a/test/intrinsics/gen/max/b1b73a.wgsl.expected.wgsl b/test/intrinsics/gen/max/b1b73a.wgsl.expected.wgsl
index 57ebf45..ffe0dc5 100644
--- a/test/intrinsics/gen/max/b1b73a.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/max/b1b73a.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<u32> = max(vec3<u32>(), vec3<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_b1b73a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_b1b73a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_b1b73a();
 }
diff --git a/test/intrinsics/gen/max/ce7c30.wgsl b/test/intrinsics/gen/max/ce7c30.wgsl
index 109638e..167bd6c 100644
--- a/test/intrinsics/gen/max/ce7c30.wgsl
+++ b/test/intrinsics/gen/max/ce7c30.wgsl
@@ -28,18 +28,18 @@
   var res: i32 = max(1, 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_ce7c30();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_ce7c30();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_ce7c30();
 }
diff --git a/test/intrinsics/gen/max/ce7c30.wgsl.expected.wgsl b/test/intrinsics/gen/max/ce7c30.wgsl.expected.wgsl
index 62b9142..a9c3618 100644
--- a/test/intrinsics/gen/max/ce7c30.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/max/ce7c30.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : i32 = max(1, 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_ce7c30();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_ce7c30();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_ce7c30();
 }
diff --git a/test/intrinsics/gen/max/e8192f.wgsl b/test/intrinsics/gen/max/e8192f.wgsl
index 5f81944..3691990 100644
--- a/test/intrinsics/gen/max/e8192f.wgsl
+++ b/test/intrinsics/gen/max/e8192f.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<i32> = max(vec2<i32>(), vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_e8192f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_e8192f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_e8192f();
 }
diff --git a/test/intrinsics/gen/max/e8192f.wgsl.expected.wgsl b/test/intrinsics/gen/max/e8192f.wgsl.expected.wgsl
index a0f6b1b..08d02f6 100644
--- a/test/intrinsics/gen/max/e8192f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/max/e8192f.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<i32> = max(vec2<i32>(), vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   max_e8192f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   max_e8192f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   max_e8192f();
 }
diff --git a/test/intrinsics/gen/min/03c7e3.wgsl b/test/intrinsics/gen/min/03c7e3.wgsl
index 266a4e7..ed5cb3d 100644
--- a/test/intrinsics/gen/min/03c7e3.wgsl
+++ b/test/intrinsics/gen/min/03c7e3.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<i32> = min(vec2<i32>(), vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_03c7e3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_03c7e3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_03c7e3();
 }
diff --git a/test/intrinsics/gen/min/03c7e3.wgsl.expected.wgsl b/test/intrinsics/gen/min/03c7e3.wgsl.expected.wgsl
index d1d1273..8c0cc93 100644
--- a/test/intrinsics/gen/min/03c7e3.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/min/03c7e3.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<i32> = min(vec2<i32>(), vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_03c7e3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_03c7e3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_03c7e3();
 }
diff --git a/test/intrinsics/gen/min/0dc614.wgsl b/test/intrinsics/gen/min/0dc614.wgsl
index 4834aef..976011e 100644
--- a/test/intrinsics/gen/min/0dc614.wgsl
+++ b/test/intrinsics/gen/min/0dc614.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<u32> = min(vec4<u32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_0dc614();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_0dc614();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_0dc614();
 }
diff --git a/test/intrinsics/gen/min/0dc614.wgsl.expected.wgsl b/test/intrinsics/gen/min/0dc614.wgsl.expected.wgsl
index a9ddda4..9833270 100644
--- a/test/intrinsics/gen/min/0dc614.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/min/0dc614.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<u32> = min(vec4<u32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_0dc614();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_0dc614();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_0dc614();
 }
diff --git a/test/intrinsics/gen/min/3941e1.wgsl b/test/intrinsics/gen/min/3941e1.wgsl
index 3583504..b45498f 100644
--- a/test/intrinsics/gen/min/3941e1.wgsl
+++ b/test/intrinsics/gen/min/3941e1.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<i32> = min(vec4<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_3941e1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_3941e1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_3941e1();
 }
diff --git a/test/intrinsics/gen/min/3941e1.wgsl.expected.wgsl b/test/intrinsics/gen/min/3941e1.wgsl.expected.wgsl
index 8ea9508..19dd5ee 100644
--- a/test/intrinsics/gen/min/3941e1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/min/3941e1.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<i32> = min(vec4<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_3941e1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_3941e1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_3941e1();
 }
diff --git a/test/intrinsics/gen/min/46c5d3.wgsl b/test/intrinsics/gen/min/46c5d3.wgsl
index 764435e..b3d8710 100644
--- a/test/intrinsics/gen/min/46c5d3.wgsl
+++ b/test/intrinsics/gen/min/46c5d3.wgsl
@@ -28,18 +28,18 @@
   var res: u32 = min(1u, 1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_46c5d3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_46c5d3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_46c5d3();
 }
diff --git a/test/intrinsics/gen/min/46c5d3.wgsl.expected.wgsl b/test/intrinsics/gen/min/46c5d3.wgsl.expected.wgsl
index 18b23e5..2beab9a 100644
--- a/test/intrinsics/gen/min/46c5d3.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/min/46c5d3.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : u32 = min(1u, 1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_46c5d3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_46c5d3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_46c5d3();
 }
diff --git a/test/intrinsics/gen/min/82b28f.wgsl b/test/intrinsics/gen/min/82b28f.wgsl
index 37011d3..01dfafd 100644
--- a/test/intrinsics/gen/min/82b28f.wgsl
+++ b/test/intrinsics/gen/min/82b28f.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<u32> = min(vec2<u32>(), vec2<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_82b28f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_82b28f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_82b28f();
 }
diff --git a/test/intrinsics/gen/min/82b28f.wgsl.expected.wgsl b/test/intrinsics/gen/min/82b28f.wgsl.expected.wgsl
index 7ba2e80..a942532 100644
--- a/test/intrinsics/gen/min/82b28f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/min/82b28f.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<u32> = min(vec2<u32>(), vec2<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_82b28f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_82b28f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_82b28f();
 }
diff --git a/test/intrinsics/gen/min/93cfc4.wgsl b/test/intrinsics/gen/min/93cfc4.wgsl
index 88c9a51..91bc5af 100644
--- a/test/intrinsics/gen/min/93cfc4.wgsl
+++ b/test/intrinsics/gen/min/93cfc4.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = min(vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_93cfc4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_93cfc4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_93cfc4();
 }
diff --git a/test/intrinsics/gen/min/93cfc4.wgsl.expected.wgsl b/test/intrinsics/gen/min/93cfc4.wgsl.expected.wgsl
index 0b0cacd..c66aae0 100644
--- a/test/intrinsics/gen/min/93cfc4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/min/93cfc4.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = min(vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_93cfc4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_93cfc4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_93cfc4();
 }
diff --git a/test/intrinsics/gen/min/a45171.wgsl b/test/intrinsics/gen/min/a45171.wgsl
index 68aae17..01b49b4 100644
--- a/test/intrinsics/gen/min/a45171.wgsl
+++ b/test/intrinsics/gen/min/a45171.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<i32> = min(vec3<i32>(), vec3<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_a45171();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_a45171();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_a45171();
 }
diff --git a/test/intrinsics/gen/min/a45171.wgsl.expected.wgsl b/test/intrinsics/gen/min/a45171.wgsl.expected.wgsl
index aca6065..ade6f57 100644
--- a/test/intrinsics/gen/min/a45171.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/min/a45171.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<i32> = min(vec3<i32>(), vec3<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_a45171();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_a45171();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_a45171();
 }
diff --git a/test/intrinsics/gen/min/aa28ad.wgsl b/test/intrinsics/gen/min/aa28ad.wgsl
index c197dbf..cd9775f 100644
--- a/test/intrinsics/gen/min/aa28ad.wgsl
+++ b/test/intrinsics/gen/min/aa28ad.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = min(vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_aa28ad();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_aa28ad();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_aa28ad();
 }
diff --git a/test/intrinsics/gen/min/aa28ad.wgsl.expected.wgsl b/test/intrinsics/gen/min/aa28ad.wgsl.expected.wgsl
index 63f7e84..0830734 100644
--- a/test/intrinsics/gen/min/aa28ad.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/min/aa28ad.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = min(vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_aa28ad();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_aa28ad();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_aa28ad();
 }
diff --git a/test/intrinsics/gen/min/af326d.wgsl b/test/intrinsics/gen/min/af326d.wgsl
index 55c9f80..0a1cde9 100644
--- a/test/intrinsics/gen/min/af326d.wgsl
+++ b/test/intrinsics/gen/min/af326d.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = min(1.0, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_af326d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_af326d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_af326d();
 }
diff --git a/test/intrinsics/gen/min/af326d.wgsl.expected.wgsl b/test/intrinsics/gen/min/af326d.wgsl.expected.wgsl
index a5bc8f3..c0500c3 100644
--- a/test/intrinsics/gen/min/af326d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/min/af326d.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = min(1.0, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_af326d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_af326d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_af326d();
 }
diff --git a/test/intrinsics/gen/min/c70bb7.wgsl b/test/intrinsics/gen/min/c70bb7.wgsl
index 15bf278..20d33ea 100644
--- a/test/intrinsics/gen/min/c70bb7.wgsl
+++ b/test/intrinsics/gen/min/c70bb7.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<u32> = min(vec3<u32>(), vec3<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_c70bb7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_c70bb7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_c70bb7();
 }
diff --git a/test/intrinsics/gen/min/c70bb7.wgsl.expected.wgsl b/test/intrinsics/gen/min/c70bb7.wgsl.expected.wgsl
index 642b600..d113cdb 100644
--- a/test/intrinsics/gen/min/c70bb7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/min/c70bb7.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<u32> = min(vec3<u32>(), vec3<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_c70bb7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_c70bb7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_c70bb7();
 }
diff --git a/test/intrinsics/gen/min/c73147.wgsl b/test/intrinsics/gen/min/c73147.wgsl
index 6bf3b77..25b6ce2 100644
--- a/test/intrinsics/gen/min/c73147.wgsl
+++ b/test/intrinsics/gen/min/c73147.wgsl
@@ -28,18 +28,18 @@
   var res: i32 = min(1, 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_c73147();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_c73147();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_c73147();
 }
diff --git a/test/intrinsics/gen/min/c73147.wgsl.expected.wgsl b/test/intrinsics/gen/min/c73147.wgsl.expected.wgsl
index 220e922..3221e2e 100644
--- a/test/intrinsics/gen/min/c73147.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/min/c73147.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : i32 = min(1, 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_c73147();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_c73147();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_c73147();
 }
diff --git a/test/intrinsics/gen/min/c76fa6.wgsl b/test/intrinsics/gen/min/c76fa6.wgsl
index b8ab82c..367f8f5 100644
--- a/test/intrinsics/gen/min/c76fa6.wgsl
+++ b/test/intrinsics/gen/min/c76fa6.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = min(vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_c76fa6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_c76fa6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_c76fa6();
 }
diff --git a/test/intrinsics/gen/min/c76fa6.wgsl.expected.wgsl b/test/intrinsics/gen/min/c76fa6.wgsl.expected.wgsl
index 460fcc8..3a01a88 100644
--- a/test/intrinsics/gen/min/c76fa6.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/min/c76fa6.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = min(vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   min_c76fa6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   min_c76fa6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   min_c76fa6();
 }
diff --git a/test/intrinsics/gen/mix/0c8c33.wgsl b/test/intrinsics/gen/mix/0c8c33.wgsl
index 001d31d..c2ba55d 100644
--- a/test/intrinsics/gen/mix/0c8c33.wgsl
+++ b/test/intrinsics/gen/mix/0c8c33.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = mix(vec3<f32>(), vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   mix_0c8c33();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   mix_0c8c33();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   mix_0c8c33();
 }
diff --git a/test/intrinsics/gen/mix/0c8c33.wgsl.expected.wgsl b/test/intrinsics/gen/mix/0c8c33.wgsl.expected.wgsl
index 26b1f2e..d76f3e3 100644
--- a/test/intrinsics/gen/mix/0c8c33.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/mix/0c8c33.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = mix(vec3<f32>(), vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   mix_0c8c33();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   mix_0c8c33();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   mix_0c8c33();
 }
diff --git a/test/intrinsics/gen/mix/1faeb1.wgsl b/test/intrinsics/gen/mix/1faeb1.wgsl
index 4d43609..948163b 100644
--- a/test/intrinsics/gen/mix/1faeb1.wgsl
+++ b/test/intrinsics/gen/mix/1faeb1.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = mix(vec4<f32>(), vec4<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   mix_1faeb1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   mix_1faeb1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   mix_1faeb1();
 }
diff --git a/test/intrinsics/gen/mix/1faeb1.wgsl.expected.wgsl b/test/intrinsics/gen/mix/1faeb1.wgsl.expected.wgsl
index 81537b5..ffeab6a 100644
--- a/test/intrinsics/gen/mix/1faeb1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/mix/1faeb1.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = mix(vec4<f32>(), vec4<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   mix_1faeb1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   mix_1faeb1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   mix_1faeb1();
 }
diff --git a/test/intrinsics/gen/mix/2fadab.wgsl b/test/intrinsics/gen/mix/2fadab.wgsl
index e20610b..94551f9 100644
--- a/test/intrinsics/gen/mix/2fadab.wgsl
+++ b/test/intrinsics/gen/mix/2fadab.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = mix(vec2<f32>(), vec2<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   mix_2fadab();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   mix_2fadab();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   mix_2fadab();
 }
diff --git a/test/intrinsics/gen/mix/2fadab.wgsl.expected.wgsl b/test/intrinsics/gen/mix/2fadab.wgsl.expected.wgsl
index bcf0f91..d084ab6 100644
--- a/test/intrinsics/gen/mix/2fadab.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/mix/2fadab.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = mix(vec2<f32>(), vec2<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   mix_2fadab();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   mix_2fadab();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   mix_2fadab();
 }
diff --git a/test/intrinsics/gen/mix/315264.wgsl b/test/intrinsics/gen/mix/315264.wgsl
index 3ccb009..3c8a050 100644
--- a/test/intrinsics/gen/mix/315264.wgsl
+++ b/test/intrinsics/gen/mix/315264.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = mix(vec3<f32>(), vec3<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   mix_315264();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   mix_315264();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   mix_315264();
 }
diff --git a/test/intrinsics/gen/mix/315264.wgsl.expected.wgsl b/test/intrinsics/gen/mix/315264.wgsl.expected.wgsl
index a870423..40fae02 100644
--- a/test/intrinsics/gen/mix/315264.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/mix/315264.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = mix(vec3<f32>(), vec3<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   mix_315264();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   mix_315264();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   mix_315264();
 }
diff --git a/test/intrinsics/gen/mix/4f0b5e.wgsl b/test/intrinsics/gen/mix/4f0b5e.wgsl
index fd14e33..327cd1f 100644
--- a/test/intrinsics/gen/mix/4f0b5e.wgsl
+++ b/test/intrinsics/gen/mix/4f0b5e.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = mix(1.0, 1.0, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   mix_4f0b5e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   mix_4f0b5e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   mix_4f0b5e();
 }
diff --git a/test/intrinsics/gen/mix/4f0b5e.wgsl.expected.wgsl b/test/intrinsics/gen/mix/4f0b5e.wgsl.expected.wgsl
index 7eb76de..67679c4 100644
--- a/test/intrinsics/gen/mix/4f0b5e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/mix/4f0b5e.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = mix(1.0, 1.0, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   mix_4f0b5e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   mix_4f0b5e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   mix_4f0b5e();
 }
diff --git a/test/intrinsics/gen/mix/6f8adc.wgsl b/test/intrinsics/gen/mix/6f8adc.wgsl
index 577a0e9..ed6872f 100644
--- a/test/intrinsics/gen/mix/6f8adc.wgsl
+++ b/test/intrinsics/gen/mix/6f8adc.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = mix(vec2<f32>(), vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   mix_6f8adc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   mix_6f8adc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   mix_6f8adc();
 }
diff --git a/test/intrinsics/gen/mix/6f8adc.wgsl.expected.wgsl b/test/intrinsics/gen/mix/6f8adc.wgsl.expected.wgsl
index ccb03a4..2bd55cc 100644
--- a/test/intrinsics/gen/mix/6f8adc.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/mix/6f8adc.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = mix(vec2<f32>(), vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   mix_6f8adc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   mix_6f8adc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   mix_6f8adc();
 }
diff --git a/test/intrinsics/gen/mix/c37ede.wgsl b/test/intrinsics/gen/mix/c37ede.wgsl
index a66000c..59185cf 100644
--- a/test/intrinsics/gen/mix/c37ede.wgsl
+++ b/test/intrinsics/gen/mix/c37ede.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = mix(vec4<f32>(), vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   mix_c37ede();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   mix_c37ede();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   mix_c37ede();
 }
diff --git a/test/intrinsics/gen/mix/c37ede.wgsl.expected.wgsl b/test/intrinsics/gen/mix/c37ede.wgsl.expected.wgsl
index b77b7b7..4d3d087 100644
--- a/test/intrinsics/gen/mix/c37ede.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/mix/c37ede.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = mix(vec4<f32>(), vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   mix_c37ede();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   mix_c37ede();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   mix_c37ede();
 }
diff --git a/test/intrinsics/gen/modf/180fed.wgsl b/test/intrinsics/gen/modf/180fed.wgsl
index a819d16..c9ad660 100644
--- a/test/intrinsics/gen/modf/180fed.wgsl
+++ b/test/intrinsics/gen/modf/180fed.wgsl
@@ -28,18 +28,18 @@
   var res = modf(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   modf_180fed();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   modf_180fed();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   modf_180fed();
 }
diff --git a/test/intrinsics/gen/modf/180fed.wgsl.expected.wgsl b/test/intrinsics/gen/modf/180fed.wgsl.expected.wgsl
index 5bd93a7..3865c22 100644
--- a/test/intrinsics/gen/modf/180fed.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/180fed.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res = modf(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   modf_180fed();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   modf_180fed();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   modf_180fed();
 }
diff --git a/test/intrinsics/gen/modf/9b75f7.wgsl b/test/intrinsics/gen/modf/9b75f7.wgsl
index 1f340bc..982a75c 100644
--- a/test/intrinsics/gen/modf/9b75f7.wgsl
+++ b/test/intrinsics/gen/modf/9b75f7.wgsl
@@ -28,18 +28,18 @@
   var res = modf(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   modf_9b75f7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   modf_9b75f7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   modf_9b75f7();
 }
diff --git a/test/intrinsics/gen/modf/9b75f7.wgsl.expected.wgsl b/test/intrinsics/gen/modf/9b75f7.wgsl.expected.wgsl
index 3b39732..90eaf3a 100644
--- a/test/intrinsics/gen/modf/9b75f7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/9b75f7.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res = modf(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   modf_9b75f7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   modf_9b75f7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   modf_9b75f7();
 }
diff --git a/test/intrinsics/gen/modf/ec2dbc.wgsl b/test/intrinsics/gen/modf/ec2dbc.wgsl
index 7483d40..8de77ad 100644
--- a/test/intrinsics/gen/modf/ec2dbc.wgsl
+++ b/test/intrinsics/gen/modf/ec2dbc.wgsl
@@ -28,18 +28,18 @@
   var res = modf(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   modf_ec2dbc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   modf_ec2dbc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   modf_ec2dbc();
 }
diff --git a/test/intrinsics/gen/modf/ec2dbc.wgsl.expected.wgsl b/test/intrinsics/gen/modf/ec2dbc.wgsl.expected.wgsl
index 22848f0..6c3380d 100644
--- a/test/intrinsics/gen/modf/ec2dbc.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/ec2dbc.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res = modf(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   modf_ec2dbc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   modf_ec2dbc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   modf_ec2dbc();
 }
diff --git a/test/intrinsics/gen/modf/f5f20d.wgsl b/test/intrinsics/gen/modf/f5f20d.wgsl
index 4088e06..0a0dcf5 100644
--- a/test/intrinsics/gen/modf/f5f20d.wgsl
+++ b/test/intrinsics/gen/modf/f5f20d.wgsl
@@ -28,18 +28,18 @@
   var res = modf(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   modf_f5f20d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   modf_f5f20d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   modf_f5f20d();
 }
diff --git a/test/intrinsics/gen/modf/f5f20d.wgsl.expected.wgsl b/test/intrinsics/gen/modf/f5f20d.wgsl.expected.wgsl
index ad5bd3d..8dea55c 100644
--- a/test/intrinsics/gen/modf/f5f20d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/f5f20d.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res = modf(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   modf_f5f20d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   modf_f5f20d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   modf_f5f20d();
 }
diff --git a/test/intrinsics/gen/normalize/64d8c0.wgsl b/test/intrinsics/gen/normalize/64d8c0.wgsl
index 1f77f33..2109b61 100644
--- a/test/intrinsics/gen/normalize/64d8c0.wgsl
+++ b/test/intrinsics/gen/normalize/64d8c0.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = normalize(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   normalize_64d8c0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   normalize_64d8c0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   normalize_64d8c0();
 }
diff --git a/test/intrinsics/gen/normalize/64d8c0.wgsl.expected.wgsl b/test/intrinsics/gen/normalize/64d8c0.wgsl.expected.wgsl
index 0ea9def..57444c8 100644
--- a/test/intrinsics/gen/normalize/64d8c0.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/normalize/64d8c0.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = normalize(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   normalize_64d8c0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   normalize_64d8c0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   normalize_64d8c0();
 }
diff --git a/test/intrinsics/gen/normalize/9a0aab.wgsl b/test/intrinsics/gen/normalize/9a0aab.wgsl
index 8786048..12bf4ac 100644
--- a/test/intrinsics/gen/normalize/9a0aab.wgsl
+++ b/test/intrinsics/gen/normalize/9a0aab.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = normalize(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   normalize_9a0aab();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   normalize_9a0aab();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   normalize_9a0aab();
 }
diff --git a/test/intrinsics/gen/normalize/9a0aab.wgsl.expected.wgsl b/test/intrinsics/gen/normalize/9a0aab.wgsl.expected.wgsl
index 77bca7f..1b3e019 100644
--- a/test/intrinsics/gen/normalize/9a0aab.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/normalize/9a0aab.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = normalize(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   normalize_9a0aab();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   normalize_9a0aab();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   normalize_9a0aab();
 }
diff --git a/test/intrinsics/gen/normalize/fc2ef1.wgsl b/test/intrinsics/gen/normalize/fc2ef1.wgsl
index 2c41820..0c11b89 100644
--- a/test/intrinsics/gen/normalize/fc2ef1.wgsl
+++ b/test/intrinsics/gen/normalize/fc2ef1.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = normalize(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   normalize_fc2ef1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   normalize_fc2ef1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   normalize_fc2ef1();
 }
diff --git a/test/intrinsics/gen/normalize/fc2ef1.wgsl.expected.wgsl b/test/intrinsics/gen/normalize/fc2ef1.wgsl.expected.wgsl
index 5dfa161..b92ea5f 100644
--- a/test/intrinsics/gen/normalize/fc2ef1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/normalize/fc2ef1.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = normalize(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   normalize_fc2ef1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   normalize_fc2ef1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   normalize_fc2ef1();
 }
diff --git a/test/intrinsics/gen/pack2x16float/0e97b3.wgsl b/test/intrinsics/gen/pack2x16float/0e97b3.wgsl
index b46c8bc..ae2610c 100644
--- a/test/intrinsics/gen/pack2x16float/0e97b3.wgsl
+++ b/test/intrinsics/gen/pack2x16float/0e97b3.wgsl
@@ -28,18 +28,18 @@
   var res: u32 = pack2x16float(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   pack2x16float_0e97b3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   pack2x16float_0e97b3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   pack2x16float_0e97b3();
 }
diff --git a/test/intrinsics/gen/pack2x16float/0e97b3.wgsl.expected.wgsl b/test/intrinsics/gen/pack2x16float/0e97b3.wgsl.expected.wgsl
index 6dfa69a..714304f 100644
--- a/test/intrinsics/gen/pack2x16float/0e97b3.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/pack2x16float/0e97b3.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : u32 = pack2x16float(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   pack2x16float_0e97b3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   pack2x16float_0e97b3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   pack2x16float_0e97b3();
 }
diff --git a/test/intrinsics/gen/pack2x16snorm/6c169b.wgsl b/test/intrinsics/gen/pack2x16snorm/6c169b.wgsl
index 859d77a..7d0aeb3 100644
--- a/test/intrinsics/gen/pack2x16snorm/6c169b.wgsl
+++ b/test/intrinsics/gen/pack2x16snorm/6c169b.wgsl
@@ -28,18 +28,18 @@
   var res: u32 = pack2x16snorm(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   pack2x16snorm_6c169b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   pack2x16snorm_6c169b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   pack2x16snorm_6c169b();
 }
diff --git a/test/intrinsics/gen/pack2x16snorm/6c169b.wgsl.expected.wgsl b/test/intrinsics/gen/pack2x16snorm/6c169b.wgsl.expected.wgsl
index cbcc61d..9ccbc2f 100644
--- a/test/intrinsics/gen/pack2x16snorm/6c169b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/pack2x16snorm/6c169b.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : u32 = pack2x16snorm(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   pack2x16snorm_6c169b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   pack2x16snorm_6c169b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   pack2x16snorm_6c169b();
 }
diff --git a/test/intrinsics/gen/pack2x16unorm/0f08e4.wgsl b/test/intrinsics/gen/pack2x16unorm/0f08e4.wgsl
index 1c7cb38..022aaa6 100644
--- a/test/intrinsics/gen/pack2x16unorm/0f08e4.wgsl
+++ b/test/intrinsics/gen/pack2x16unorm/0f08e4.wgsl
@@ -28,18 +28,18 @@
   var res: u32 = pack2x16unorm(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   pack2x16unorm_0f08e4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   pack2x16unorm_0f08e4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   pack2x16unorm_0f08e4();
 }
diff --git a/test/intrinsics/gen/pack2x16unorm/0f08e4.wgsl.expected.wgsl b/test/intrinsics/gen/pack2x16unorm/0f08e4.wgsl.expected.wgsl
index d731728..d523070 100644
--- a/test/intrinsics/gen/pack2x16unorm/0f08e4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/pack2x16unorm/0f08e4.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : u32 = pack2x16unorm(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   pack2x16unorm_0f08e4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   pack2x16unorm_0f08e4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   pack2x16unorm_0f08e4();
 }
diff --git a/test/intrinsics/gen/pack4x8snorm/4d22e7.wgsl b/test/intrinsics/gen/pack4x8snorm/4d22e7.wgsl
index f1d36e8..6495f5e 100644
--- a/test/intrinsics/gen/pack4x8snorm/4d22e7.wgsl
+++ b/test/intrinsics/gen/pack4x8snorm/4d22e7.wgsl
@@ -28,18 +28,18 @@
   var res: u32 = pack4x8snorm(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   pack4x8snorm_4d22e7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   pack4x8snorm_4d22e7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   pack4x8snorm_4d22e7();
 }
diff --git a/test/intrinsics/gen/pack4x8snorm/4d22e7.wgsl.expected.wgsl b/test/intrinsics/gen/pack4x8snorm/4d22e7.wgsl.expected.wgsl
index 201c693..53657e0 100644
--- a/test/intrinsics/gen/pack4x8snorm/4d22e7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/pack4x8snorm/4d22e7.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : u32 = pack4x8snorm(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   pack4x8snorm_4d22e7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   pack4x8snorm_4d22e7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   pack4x8snorm_4d22e7();
 }
diff --git a/test/intrinsics/gen/pack4x8unorm/95c456.wgsl b/test/intrinsics/gen/pack4x8unorm/95c456.wgsl
index 8ccefca..d76e075 100644
--- a/test/intrinsics/gen/pack4x8unorm/95c456.wgsl
+++ b/test/intrinsics/gen/pack4x8unorm/95c456.wgsl
@@ -28,18 +28,18 @@
   var res: u32 = pack4x8unorm(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   pack4x8unorm_95c456();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   pack4x8unorm_95c456();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   pack4x8unorm_95c456();
 }
diff --git a/test/intrinsics/gen/pack4x8unorm/95c456.wgsl.expected.wgsl b/test/intrinsics/gen/pack4x8unorm/95c456.wgsl.expected.wgsl
index f734559..55aedf3 100644
--- a/test/intrinsics/gen/pack4x8unorm/95c456.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/pack4x8unorm/95c456.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : u32 = pack4x8unorm(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   pack4x8unorm_95c456();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   pack4x8unorm_95c456();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   pack4x8unorm_95c456();
 }
diff --git a/test/intrinsics/gen/pow/04a908.wgsl b/test/intrinsics/gen/pow/04a908.wgsl
index a0fb92e..cc17d35 100644
--- a/test/intrinsics/gen/pow/04a908.wgsl
+++ b/test/intrinsics/gen/pow/04a908.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = pow(vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   pow_04a908();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   pow_04a908();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   pow_04a908();
 }
diff --git a/test/intrinsics/gen/pow/04a908.wgsl.expected.wgsl b/test/intrinsics/gen/pow/04a908.wgsl.expected.wgsl
index 55b882d..395fe26 100644
--- a/test/intrinsics/gen/pow/04a908.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/pow/04a908.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = pow(vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   pow_04a908();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   pow_04a908();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   pow_04a908();
 }
diff --git a/test/intrinsics/gen/pow/46e029.wgsl b/test/intrinsics/gen/pow/46e029.wgsl
index 87c4746..7366f03 100644
--- a/test/intrinsics/gen/pow/46e029.wgsl
+++ b/test/intrinsics/gen/pow/46e029.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = pow(1.0, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   pow_46e029();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   pow_46e029();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   pow_46e029();
 }
diff --git a/test/intrinsics/gen/pow/46e029.wgsl.expected.wgsl b/test/intrinsics/gen/pow/46e029.wgsl.expected.wgsl
index 49a5573..1670720 100644
--- a/test/intrinsics/gen/pow/46e029.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/pow/46e029.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = pow(1.0, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   pow_46e029();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   pow_46e029();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   pow_46e029();
 }
diff --git a/test/intrinsics/gen/pow/4a46c9.wgsl b/test/intrinsics/gen/pow/4a46c9.wgsl
index c0addcd..c6e5af0 100644
--- a/test/intrinsics/gen/pow/4a46c9.wgsl
+++ b/test/intrinsics/gen/pow/4a46c9.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = pow(vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   pow_4a46c9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   pow_4a46c9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   pow_4a46c9();
 }
diff --git a/test/intrinsics/gen/pow/4a46c9.wgsl.expected.wgsl b/test/intrinsics/gen/pow/4a46c9.wgsl.expected.wgsl
index 8000f56..4a6f3f9 100644
--- a/test/intrinsics/gen/pow/4a46c9.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/pow/4a46c9.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = pow(vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   pow_4a46c9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   pow_4a46c9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   pow_4a46c9();
 }
diff --git a/test/intrinsics/gen/pow/e60ea5.wgsl b/test/intrinsics/gen/pow/e60ea5.wgsl
index 72ee0cf..e2080cb 100644
--- a/test/intrinsics/gen/pow/e60ea5.wgsl
+++ b/test/intrinsics/gen/pow/e60ea5.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = pow(vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   pow_e60ea5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   pow_e60ea5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   pow_e60ea5();
 }
diff --git a/test/intrinsics/gen/pow/e60ea5.wgsl.expected.wgsl b/test/intrinsics/gen/pow/e60ea5.wgsl.expected.wgsl
index 3885336..0c6432e 100644
--- a/test/intrinsics/gen/pow/e60ea5.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/pow/e60ea5.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = pow(vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   pow_e60ea5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   pow_e60ea5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   pow_e60ea5();
 }
diff --git a/test/intrinsics/gen/radians/09b7fc.wgsl b/test/intrinsics/gen/radians/09b7fc.wgsl
index e3e70e6..e397d3a 100644
--- a/test/intrinsics/gen/radians/09b7fc.wgsl
+++ b/test/intrinsics/gen/radians/09b7fc.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = radians(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   radians_09b7fc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   radians_09b7fc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   radians_09b7fc();
 }
diff --git a/test/intrinsics/gen/radians/09b7fc.wgsl.expected.wgsl b/test/intrinsics/gen/radians/09b7fc.wgsl.expected.wgsl
index 4b354c0..e8efa0e 100644
--- a/test/intrinsics/gen/radians/09b7fc.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/radians/09b7fc.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = radians(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   radians_09b7fc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   radians_09b7fc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   radians_09b7fc();
 }
diff --git a/test/intrinsics/gen/radians/61687a.wgsl b/test/intrinsics/gen/radians/61687a.wgsl
index 81db7ee..9ff8560 100644
--- a/test/intrinsics/gen/radians/61687a.wgsl
+++ b/test/intrinsics/gen/radians/61687a.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = radians(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   radians_61687a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   radians_61687a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   radians_61687a();
 }
diff --git a/test/intrinsics/gen/radians/61687a.wgsl.expected.wgsl b/test/intrinsics/gen/radians/61687a.wgsl.expected.wgsl
index 830d0d6..310425f 100644
--- a/test/intrinsics/gen/radians/61687a.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/radians/61687a.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = radians(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   radians_61687a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   radians_61687a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   radians_61687a();
 }
diff --git a/test/intrinsics/gen/radians/6b0ff2.wgsl b/test/intrinsics/gen/radians/6b0ff2.wgsl
index fab9916..8ceaeb2 100644
--- a/test/intrinsics/gen/radians/6b0ff2.wgsl
+++ b/test/intrinsics/gen/radians/6b0ff2.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = radians(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   radians_6b0ff2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   radians_6b0ff2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   radians_6b0ff2();
 }
diff --git a/test/intrinsics/gen/radians/6b0ff2.wgsl.expected.wgsl b/test/intrinsics/gen/radians/6b0ff2.wgsl.expected.wgsl
index 1c1ac6b..05a6fb5 100644
--- a/test/intrinsics/gen/radians/6b0ff2.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/radians/6b0ff2.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = radians(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   radians_6b0ff2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   radians_6b0ff2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   radians_6b0ff2();
 }
diff --git a/test/intrinsics/gen/radians/f96258.wgsl b/test/intrinsics/gen/radians/f96258.wgsl
index 4c48ae3..bca54a5 100644
--- a/test/intrinsics/gen/radians/f96258.wgsl
+++ b/test/intrinsics/gen/radians/f96258.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = radians(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   radians_f96258();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   radians_f96258();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   radians_f96258();
 }
diff --git a/test/intrinsics/gen/radians/f96258.wgsl.expected.wgsl b/test/intrinsics/gen/radians/f96258.wgsl.expected.wgsl
index 9a14173..c38fe31 100644
--- a/test/intrinsics/gen/radians/f96258.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/radians/f96258.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = radians(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   radians_f96258();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   radians_f96258();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   radians_f96258();
 }
diff --git a/test/intrinsics/gen/reflect/05357e.wgsl b/test/intrinsics/gen/reflect/05357e.wgsl
index 928e3df..97aaac7 100644
--- a/test/intrinsics/gen/reflect/05357e.wgsl
+++ b/test/intrinsics/gen/reflect/05357e.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = reflect(vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   reflect_05357e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   reflect_05357e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   reflect_05357e();
 }
diff --git a/test/intrinsics/gen/reflect/05357e.wgsl.expected.wgsl b/test/intrinsics/gen/reflect/05357e.wgsl.expected.wgsl
index 5e4b47d..ba4f95a 100644
--- a/test/intrinsics/gen/reflect/05357e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/reflect/05357e.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = reflect(vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   reflect_05357e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   reflect_05357e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   reflect_05357e();
 }
diff --git a/test/intrinsics/gen/reflect/b61e10.wgsl b/test/intrinsics/gen/reflect/b61e10.wgsl
index 441e9a7..124022b 100644
--- a/test/intrinsics/gen/reflect/b61e10.wgsl
+++ b/test/intrinsics/gen/reflect/b61e10.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = reflect(vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   reflect_b61e10();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   reflect_b61e10();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   reflect_b61e10();
 }
diff --git a/test/intrinsics/gen/reflect/b61e10.wgsl.expected.wgsl b/test/intrinsics/gen/reflect/b61e10.wgsl.expected.wgsl
index 6cd6d58..330eead 100644
--- a/test/intrinsics/gen/reflect/b61e10.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/reflect/b61e10.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = reflect(vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   reflect_b61e10();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   reflect_b61e10();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   reflect_b61e10();
 }
diff --git a/test/intrinsics/gen/reflect/f47fdb.wgsl b/test/intrinsics/gen/reflect/f47fdb.wgsl
index ee08672..3048fe0 100644
--- a/test/intrinsics/gen/reflect/f47fdb.wgsl
+++ b/test/intrinsics/gen/reflect/f47fdb.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = reflect(vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   reflect_f47fdb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   reflect_f47fdb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   reflect_f47fdb();
 }
diff --git a/test/intrinsics/gen/reflect/f47fdb.wgsl.expected.wgsl b/test/intrinsics/gen/reflect/f47fdb.wgsl.expected.wgsl
index 916347c..d66212f 100644
--- a/test/intrinsics/gen/reflect/f47fdb.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/reflect/f47fdb.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = reflect(vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   reflect_f47fdb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   reflect_f47fdb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   reflect_f47fdb();
 }
diff --git a/test/intrinsics/gen/refract/7e02e6.wgsl b/test/intrinsics/gen/refract/7e02e6.wgsl
index 677b01b..ff46411 100644
--- a/test/intrinsics/gen/refract/7e02e6.wgsl
+++ b/test/intrinsics/gen/refract/7e02e6.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = refract(vec4<f32>(), vec4<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   refract_7e02e6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   refract_7e02e6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   refract_7e02e6();
 }
diff --git a/test/intrinsics/gen/refract/7e02e6.wgsl.expected.wgsl b/test/intrinsics/gen/refract/7e02e6.wgsl.expected.wgsl
index f55545f..3950912 100644
--- a/test/intrinsics/gen/refract/7e02e6.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/refract/7e02e6.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = refract(vec4<f32>(), vec4<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   refract_7e02e6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   refract_7e02e6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   refract_7e02e6();
 }
diff --git a/test/intrinsics/gen/refract/cbc1d2.wgsl b/test/intrinsics/gen/refract/cbc1d2.wgsl
index 5ef26d7..40c0531 100644
--- a/test/intrinsics/gen/refract/cbc1d2.wgsl
+++ b/test/intrinsics/gen/refract/cbc1d2.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = refract(vec3<f32>(), vec3<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   refract_cbc1d2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   refract_cbc1d2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   refract_cbc1d2();
 }
diff --git a/test/intrinsics/gen/refract/cbc1d2.wgsl.expected.wgsl b/test/intrinsics/gen/refract/cbc1d2.wgsl.expected.wgsl
index d26c8d1..535c279 100644
--- a/test/intrinsics/gen/refract/cbc1d2.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/refract/cbc1d2.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = refract(vec3<f32>(), vec3<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   refract_cbc1d2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   refract_cbc1d2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   refract_cbc1d2();
 }
diff --git a/test/intrinsics/gen/refract/cd905f.wgsl b/test/intrinsics/gen/refract/cd905f.wgsl
index 4c38ddf..9c9e3fd 100644
--- a/test/intrinsics/gen/refract/cd905f.wgsl
+++ b/test/intrinsics/gen/refract/cd905f.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = refract(vec2<f32>(), vec2<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   refract_cd905f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   refract_cd905f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   refract_cd905f();
 }
diff --git a/test/intrinsics/gen/refract/cd905f.wgsl.expected.wgsl b/test/intrinsics/gen/refract/cd905f.wgsl.expected.wgsl
index de43d99..485ab60 100644
--- a/test/intrinsics/gen/refract/cd905f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/refract/cd905f.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = refract(vec2<f32>(), vec2<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   refract_cd905f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   refract_cd905f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   refract_cd905f();
 }
diff --git a/test/intrinsics/gen/reverseBits/222177.wgsl b/test/intrinsics/gen/reverseBits/222177.wgsl
index ac1aef1..bdbba4a 100644
--- a/test/intrinsics/gen/reverseBits/222177.wgsl
+++ b/test/intrinsics/gen/reverseBits/222177.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<i32> = reverseBits(vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   reverseBits_222177();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   reverseBits_222177();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   reverseBits_222177();
 }
diff --git a/test/intrinsics/gen/reverseBits/222177.wgsl.expected.wgsl b/test/intrinsics/gen/reverseBits/222177.wgsl.expected.wgsl
index 5e8b89a..cd37769 100644
--- a/test/intrinsics/gen/reverseBits/222177.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/reverseBits/222177.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<i32> = reverseBits(vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   reverseBits_222177();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   reverseBits_222177();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   reverseBits_222177();
 }
diff --git a/test/intrinsics/gen/reverseBits/35fea9.wgsl b/test/intrinsics/gen/reverseBits/35fea9.wgsl
index e8c79b1..319f6d2 100644
--- a/test/intrinsics/gen/reverseBits/35fea9.wgsl
+++ b/test/intrinsics/gen/reverseBits/35fea9.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<u32> = reverseBits(vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   reverseBits_35fea9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   reverseBits_35fea9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   reverseBits_35fea9();
 }
diff --git a/test/intrinsics/gen/reverseBits/35fea9.wgsl.expected.wgsl b/test/intrinsics/gen/reverseBits/35fea9.wgsl.expected.wgsl
index 6bcd42b..6fea80d 100644
--- a/test/intrinsics/gen/reverseBits/35fea9.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/reverseBits/35fea9.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<u32> = reverseBits(vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   reverseBits_35fea9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   reverseBits_35fea9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   reverseBits_35fea9();
 }
diff --git a/test/intrinsics/gen/reverseBits/4dbd6f.wgsl b/test/intrinsics/gen/reverseBits/4dbd6f.wgsl
index f2fea01..09ab61f 100644
--- a/test/intrinsics/gen/reverseBits/4dbd6f.wgsl
+++ b/test/intrinsics/gen/reverseBits/4dbd6f.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<i32> = reverseBits(vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   reverseBits_4dbd6f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   reverseBits_4dbd6f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   reverseBits_4dbd6f();
 }
diff --git a/test/intrinsics/gen/reverseBits/4dbd6f.wgsl.expected.wgsl b/test/intrinsics/gen/reverseBits/4dbd6f.wgsl.expected.wgsl
index a07bf4d..2e6d0b2 100644
--- a/test/intrinsics/gen/reverseBits/4dbd6f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/reverseBits/4dbd6f.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<i32> = reverseBits(vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   reverseBits_4dbd6f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   reverseBits_4dbd6f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   reverseBits_4dbd6f();
 }
diff --git a/test/intrinsics/gen/reverseBits/7c4269.wgsl b/test/intrinsics/gen/reverseBits/7c4269.wgsl
index 423e9d9..6be3409 100644
--- a/test/intrinsics/gen/reverseBits/7c4269.wgsl
+++ b/test/intrinsics/gen/reverseBits/7c4269.wgsl
@@ -28,18 +28,18 @@
   var res: i32 = reverseBits(1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   reverseBits_7c4269();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   reverseBits_7c4269();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   reverseBits_7c4269();
 }
diff --git a/test/intrinsics/gen/reverseBits/7c4269.wgsl.expected.wgsl b/test/intrinsics/gen/reverseBits/7c4269.wgsl.expected.wgsl
index 8bf4d05..17f9950 100644
--- a/test/intrinsics/gen/reverseBits/7c4269.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/reverseBits/7c4269.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : i32 = reverseBits(1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   reverseBits_7c4269();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   reverseBits_7c4269();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   reverseBits_7c4269();
 }
diff --git a/test/intrinsics/gen/reverseBits/a6ccd4.wgsl b/test/intrinsics/gen/reverseBits/a6ccd4.wgsl
index e973fe2..3559904 100644
--- a/test/intrinsics/gen/reverseBits/a6ccd4.wgsl
+++ b/test/intrinsics/gen/reverseBits/a6ccd4.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<u32> = reverseBits(vec3<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   reverseBits_a6ccd4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   reverseBits_a6ccd4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   reverseBits_a6ccd4();
 }
diff --git a/test/intrinsics/gen/reverseBits/a6ccd4.wgsl.expected.wgsl b/test/intrinsics/gen/reverseBits/a6ccd4.wgsl.expected.wgsl
index abcdac1..713d9c7 100644
--- a/test/intrinsics/gen/reverseBits/a6ccd4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/reverseBits/a6ccd4.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<u32> = reverseBits(vec3<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   reverseBits_a6ccd4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   reverseBits_a6ccd4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   reverseBits_a6ccd4();
 }
diff --git a/test/intrinsics/gen/reverseBits/c21bc1.wgsl b/test/intrinsics/gen/reverseBits/c21bc1.wgsl
index 36367af..985e64a 100644
--- a/test/intrinsics/gen/reverseBits/c21bc1.wgsl
+++ b/test/intrinsics/gen/reverseBits/c21bc1.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<i32> = reverseBits(vec3<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   reverseBits_c21bc1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   reverseBits_c21bc1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   reverseBits_c21bc1();
 }
diff --git a/test/intrinsics/gen/reverseBits/c21bc1.wgsl.expected.wgsl b/test/intrinsics/gen/reverseBits/c21bc1.wgsl.expected.wgsl
index 971a3b0..6ad70ae 100644
--- a/test/intrinsics/gen/reverseBits/c21bc1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/reverseBits/c21bc1.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<i32> = reverseBits(vec3<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   reverseBits_c21bc1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   reverseBits_c21bc1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   reverseBits_c21bc1();
 }
diff --git a/test/intrinsics/gen/reverseBits/e1f4c1.wgsl b/test/intrinsics/gen/reverseBits/e1f4c1.wgsl
index 406684b..d186157 100644
--- a/test/intrinsics/gen/reverseBits/e1f4c1.wgsl
+++ b/test/intrinsics/gen/reverseBits/e1f4c1.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<u32> = reverseBits(vec2<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   reverseBits_e1f4c1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   reverseBits_e1f4c1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   reverseBits_e1f4c1();
 }
diff --git a/test/intrinsics/gen/reverseBits/e1f4c1.wgsl.expected.wgsl b/test/intrinsics/gen/reverseBits/e1f4c1.wgsl.expected.wgsl
index 6860421..dc01269 100644
--- a/test/intrinsics/gen/reverseBits/e1f4c1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/reverseBits/e1f4c1.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<u32> = reverseBits(vec2<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   reverseBits_e1f4c1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   reverseBits_e1f4c1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   reverseBits_e1f4c1();
 }
diff --git a/test/intrinsics/gen/reverseBits/e31adf.wgsl b/test/intrinsics/gen/reverseBits/e31adf.wgsl
index 39e5639..c32c738 100644
--- a/test/intrinsics/gen/reverseBits/e31adf.wgsl
+++ b/test/intrinsics/gen/reverseBits/e31adf.wgsl
@@ -28,18 +28,18 @@
   var res: u32 = reverseBits(1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   reverseBits_e31adf();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   reverseBits_e31adf();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   reverseBits_e31adf();
 }
diff --git a/test/intrinsics/gen/reverseBits/e31adf.wgsl.expected.wgsl b/test/intrinsics/gen/reverseBits/e31adf.wgsl.expected.wgsl
index 2f2c5e8..d99e7a5 100644
--- a/test/intrinsics/gen/reverseBits/e31adf.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/reverseBits/e31adf.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : u32 = reverseBits(1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   reverseBits_e31adf();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   reverseBits_e31adf();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   reverseBits_e31adf();
 }
diff --git a/test/intrinsics/gen/round/106c0b.wgsl b/test/intrinsics/gen/round/106c0b.wgsl
index 0bcea29..52ebd56 100644
--- a/test/intrinsics/gen/round/106c0b.wgsl
+++ b/test/intrinsics/gen/round/106c0b.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = round(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   round_106c0b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   round_106c0b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   round_106c0b();
 }
diff --git a/test/intrinsics/gen/round/106c0b.wgsl.expected.wgsl b/test/intrinsics/gen/round/106c0b.wgsl.expected.wgsl
index de57173..338cddf 100644
--- a/test/intrinsics/gen/round/106c0b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/round/106c0b.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = round(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   round_106c0b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   round_106c0b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   round_106c0b();
 }
diff --git a/test/intrinsics/gen/round/1c7897.wgsl b/test/intrinsics/gen/round/1c7897.wgsl
index ff05513..c0f13ae 100644
--- a/test/intrinsics/gen/round/1c7897.wgsl
+++ b/test/intrinsics/gen/round/1c7897.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = round(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   round_1c7897();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   round_1c7897();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   round_1c7897();
 }
diff --git a/test/intrinsics/gen/round/1c7897.wgsl.expected.wgsl b/test/intrinsics/gen/round/1c7897.wgsl.expected.wgsl
index 4abe9aa..ac2350e 100644
--- a/test/intrinsics/gen/round/1c7897.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/round/1c7897.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = round(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   round_1c7897();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   round_1c7897();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   round_1c7897();
 }
diff --git a/test/intrinsics/gen/round/52c84d.wgsl b/test/intrinsics/gen/round/52c84d.wgsl
index 34d2910..385bb5e 100644
--- a/test/intrinsics/gen/round/52c84d.wgsl
+++ b/test/intrinsics/gen/round/52c84d.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = round(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   round_52c84d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   round_52c84d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   round_52c84d();
 }
diff --git a/test/intrinsics/gen/round/52c84d.wgsl.expected.wgsl b/test/intrinsics/gen/round/52c84d.wgsl.expected.wgsl
index 5d89ce6..9877c2d 100644
--- a/test/intrinsics/gen/round/52c84d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/round/52c84d.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = round(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   round_52c84d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   round_52c84d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   round_52c84d();
 }
diff --git a/test/intrinsics/gen/round/9edc38.wgsl b/test/intrinsics/gen/round/9edc38.wgsl
index 01f9211..e4fd176 100644
--- a/test/intrinsics/gen/round/9edc38.wgsl
+++ b/test/intrinsics/gen/round/9edc38.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = round(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   round_9edc38();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   round_9edc38();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   round_9edc38();
 }
diff --git a/test/intrinsics/gen/round/9edc38.wgsl.expected.wgsl b/test/intrinsics/gen/round/9edc38.wgsl.expected.wgsl
index 40588ac..9753e04 100644
--- a/test/intrinsics/gen/round/9edc38.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/round/9edc38.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = round(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   round_9edc38();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   round_9edc38();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   round_9edc38();
 }
diff --git a/test/intrinsics/gen/select/00b848.wgsl b/test/intrinsics/gen/select/00b848.wgsl
index bf6993f..a1f4834 100644
--- a/test/intrinsics/gen/select/00b848.wgsl
+++ b/test/intrinsics/gen/select/00b848.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<i32> = select(vec2<i32>(), vec2<i32>(), vec2<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_00b848();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_00b848();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_00b848();
 }
diff --git a/test/intrinsics/gen/select/00b848.wgsl.expected.wgsl b/test/intrinsics/gen/select/00b848.wgsl.expected.wgsl
index 9a72d2d..bf45b90 100644
--- a/test/intrinsics/gen/select/00b848.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/00b848.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<i32> = select(vec2<i32>(), vec2<i32>(), vec2<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_00b848();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_00b848();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_00b848();
 }
diff --git a/test/intrinsics/gen/select/01e2cd.wgsl b/test/intrinsics/gen/select/01e2cd.wgsl
index ed51d33..c8e0408 100644
--- a/test/intrinsics/gen/select/01e2cd.wgsl
+++ b/test/intrinsics/gen/select/01e2cd.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<i32> = select(vec3<i32>(), vec3<i32>(), vec3<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_01e2cd();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_01e2cd();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_01e2cd();
 }
diff --git a/test/intrinsics/gen/select/01e2cd.wgsl.expected.wgsl b/test/intrinsics/gen/select/01e2cd.wgsl.expected.wgsl
index f52df12..7e9d06f 100644
--- a/test/intrinsics/gen/select/01e2cd.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/01e2cd.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<i32> = select(vec3<i32>(), vec3<i32>(), vec3<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_01e2cd();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_01e2cd();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_01e2cd();
 }
diff --git a/test/intrinsics/gen/select/087ea4.wgsl b/test/intrinsics/gen/select/087ea4.wgsl
index a89cf61..f8f7924 100644
--- a/test/intrinsics/gen/select/087ea4.wgsl
+++ b/test/intrinsics/gen/select/087ea4.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<u32> = select(vec4<u32>(), vec4<u32>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_087ea4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_087ea4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_087ea4();
 }
diff --git a/test/intrinsics/gen/select/087ea4.wgsl.expected.wgsl b/test/intrinsics/gen/select/087ea4.wgsl.expected.wgsl
index da2621f..6258a15 100644
--- a/test/intrinsics/gen/select/087ea4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/087ea4.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<u32> = select(vec4<u32>(), vec4<u32>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_087ea4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_087ea4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_087ea4();
 }
diff --git a/test/intrinsics/gen/select/1e960b.wgsl b/test/intrinsics/gen/select/1e960b.wgsl
index 7d40c59..92c0df6 100644
--- a/test/intrinsics/gen/select/1e960b.wgsl
+++ b/test/intrinsics/gen/select/1e960b.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<u32> = select(vec2<u32>(), vec2<u32>(), vec2<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_1e960b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_1e960b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_1e960b();
 }
diff --git a/test/intrinsics/gen/select/1e960b.wgsl.expected.wgsl b/test/intrinsics/gen/select/1e960b.wgsl.expected.wgsl
index 2fc1050..4f78e59 100644
--- a/test/intrinsics/gen/select/1e960b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/1e960b.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<u32> = select(vec2<u32>(), vec2<u32>(), vec2<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_1e960b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_1e960b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_1e960b();
 }
diff --git a/test/intrinsics/gen/select/266aff.wgsl b/test/intrinsics/gen/select/266aff.wgsl
index cd55f3c..6faee8a 100644
--- a/test/intrinsics/gen/select/266aff.wgsl
+++ b/test/intrinsics/gen/select/266aff.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = select(vec2<f32>(), vec2<f32>(), vec2<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_266aff();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_266aff();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_266aff();
 }
diff --git a/test/intrinsics/gen/select/266aff.wgsl.expected.wgsl b/test/intrinsics/gen/select/266aff.wgsl.expected.wgsl
index 6c5dab6..522a10f 100644
--- a/test/intrinsics/gen/select/266aff.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/266aff.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = select(vec2<f32>(), vec2<f32>(), vec2<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_266aff();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_266aff();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_266aff();
 }
diff --git a/test/intrinsics/gen/select/28a27e.wgsl b/test/intrinsics/gen/select/28a27e.wgsl
index b58c5ca..cc515a9 100644
--- a/test/intrinsics/gen/select/28a27e.wgsl
+++ b/test/intrinsics/gen/select/28a27e.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<u32> = select(vec3<u32>(), vec3<u32>(), vec3<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_28a27e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_28a27e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_28a27e();
 }
diff --git a/test/intrinsics/gen/select/28a27e.wgsl.expected.wgsl b/test/intrinsics/gen/select/28a27e.wgsl.expected.wgsl
index 42fb13a..cbc4bcf 100644
--- a/test/intrinsics/gen/select/28a27e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/28a27e.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<u32> = select(vec3<u32>(), vec3<u32>(), vec3<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_28a27e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_28a27e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_28a27e();
 }
diff --git a/test/intrinsics/gen/select/3c25ce.wgsl b/test/intrinsics/gen/select/3c25ce.wgsl
index 5a2afbd..85d68b1 100644
--- a/test/intrinsics/gen/select/3c25ce.wgsl
+++ b/test/intrinsics/gen/select/3c25ce.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<bool> = select(vec3<bool>(), vec3<bool>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_3c25ce();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_3c25ce();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_3c25ce();
 }
diff --git a/test/intrinsics/gen/select/3c25ce.wgsl.expected.wgsl b/test/intrinsics/gen/select/3c25ce.wgsl.expected.wgsl
index cd6c508..48963b4 100644
--- a/test/intrinsics/gen/select/3c25ce.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/3c25ce.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<bool> = select(vec3<bool>(), vec3<bool>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_3c25ce();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_3c25ce();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_3c25ce();
 }
diff --git a/test/intrinsics/gen/select/416e14.wgsl b/test/intrinsics/gen/select/416e14.wgsl
index 6427738..c69cd17 100644
--- a/test/intrinsics/gen/select/416e14.wgsl
+++ b/test/intrinsics/gen/select/416e14.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = select(1.0, 1.0, bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_416e14();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_416e14();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_416e14();
 }
diff --git a/test/intrinsics/gen/select/416e14.wgsl.expected.wgsl b/test/intrinsics/gen/select/416e14.wgsl.expected.wgsl
index 847eb7c..bfa5d2e 100644
--- a/test/intrinsics/gen/select/416e14.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/416e14.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = select(1.0, 1.0, bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_416e14();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_416e14();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_416e14();
 }
diff --git a/test/intrinsics/gen/select/51b047.wgsl b/test/intrinsics/gen/select/51b047.wgsl
index 64fd8ed..f774d3f 100644
--- a/test/intrinsics/gen/select/51b047.wgsl
+++ b/test/intrinsics/gen/select/51b047.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<u32> = select(vec2<u32>(), vec2<u32>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_51b047();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_51b047();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_51b047();
 }
diff --git a/test/intrinsics/gen/select/51b047.wgsl.expected.wgsl b/test/intrinsics/gen/select/51b047.wgsl.expected.wgsl
index 8cb5525..93097d9 100644
--- a/test/intrinsics/gen/select/51b047.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/51b047.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<u32> = select(vec2<u32>(), vec2<u32>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_51b047();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_51b047();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_51b047();
 }
diff --git a/test/intrinsics/gen/select/713567.wgsl b/test/intrinsics/gen/select/713567.wgsl
index 2d4d541..9dad142 100644
--- a/test/intrinsics/gen/select/713567.wgsl
+++ b/test/intrinsics/gen/select/713567.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = select(vec4<f32>(), vec4<f32>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_713567();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_713567();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_713567();
 }
diff --git a/test/intrinsics/gen/select/713567.wgsl.expected.wgsl b/test/intrinsics/gen/select/713567.wgsl.expected.wgsl
index 8624950..d885a74 100644
--- a/test/intrinsics/gen/select/713567.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/713567.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = select(vec4<f32>(), vec4<f32>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_713567();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_713567();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_713567();
 }
diff --git a/test/intrinsics/gen/select/78be5f.wgsl b/test/intrinsics/gen/select/78be5f.wgsl
index 940450a..363cb61 100644
--- a/test/intrinsics/gen/select/78be5f.wgsl
+++ b/test/intrinsics/gen/select/78be5f.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = select(vec3<f32>(), vec3<f32>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_78be5f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_78be5f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_78be5f();
 }
diff --git a/test/intrinsics/gen/select/78be5f.wgsl.expected.wgsl b/test/intrinsics/gen/select/78be5f.wgsl.expected.wgsl
index 9f76d0f..7c77d66 100644
--- a/test/intrinsics/gen/select/78be5f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/78be5f.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = select(vec3<f32>(), vec3<f32>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_78be5f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_78be5f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_78be5f();
 }
diff --git a/test/intrinsics/gen/select/80a9a9.wgsl b/test/intrinsics/gen/select/80a9a9.wgsl
index 2d8a8f9..970d4b0 100644
--- a/test/intrinsics/gen/select/80a9a9.wgsl
+++ b/test/intrinsics/gen/select/80a9a9.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<bool> = select(vec3<bool>(), vec3<bool>(), vec3<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_80a9a9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_80a9a9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_80a9a9();
 }
diff --git a/test/intrinsics/gen/select/80a9a9.wgsl.expected.wgsl b/test/intrinsics/gen/select/80a9a9.wgsl.expected.wgsl
index bafde41..1f2b1fd 100644
--- a/test/intrinsics/gen/select/80a9a9.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/80a9a9.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<bool> = select(vec3<bool>(), vec3<bool>(), vec3<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_80a9a9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_80a9a9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_80a9a9();
 }
diff --git a/test/intrinsics/gen/select/8fa62c.wgsl b/test/intrinsics/gen/select/8fa62c.wgsl
index edaca3f..6fd149a 100644
--- a/test/intrinsics/gen/select/8fa62c.wgsl
+++ b/test/intrinsics/gen/select/8fa62c.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<i32> = select(vec3<i32>(), vec3<i32>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_8fa62c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_8fa62c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_8fa62c();
 }
diff --git a/test/intrinsics/gen/select/8fa62c.wgsl.expected.wgsl b/test/intrinsics/gen/select/8fa62c.wgsl.expected.wgsl
index 7ce550f..431824e 100644
--- a/test/intrinsics/gen/select/8fa62c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/8fa62c.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<i32> = select(vec3<i32>(), vec3<i32>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_8fa62c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_8fa62c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_8fa62c();
 }
diff --git a/test/intrinsics/gen/select/99f883.wgsl b/test/intrinsics/gen/select/99f883.wgsl
index 5ddccad..25c5a25 100644
--- a/test/intrinsics/gen/select/99f883.wgsl
+++ b/test/intrinsics/gen/select/99f883.wgsl
@@ -28,18 +28,18 @@
   var res: u32 = select(1u, 1u, bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_99f883();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_99f883();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_99f883();
 }
diff --git a/test/intrinsics/gen/select/99f883.wgsl.expected.wgsl b/test/intrinsics/gen/select/99f883.wgsl.expected.wgsl
index 17d5598..0ceacc2 100644
--- a/test/intrinsics/gen/select/99f883.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/99f883.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : u32 = select(1u, 1u, bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_99f883();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_99f883();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_99f883();
 }
diff --git a/test/intrinsics/gen/select/a2860e.wgsl b/test/intrinsics/gen/select/a2860e.wgsl
index 289e00e..6b3b0b2 100644
--- a/test/intrinsics/gen/select/a2860e.wgsl
+++ b/test/intrinsics/gen/select/a2860e.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<i32> = select(vec4<i32>(), vec4<i32>(), vec4<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_a2860e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_a2860e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_a2860e();
 }
diff --git a/test/intrinsics/gen/select/a2860e.wgsl.expected.wgsl b/test/intrinsics/gen/select/a2860e.wgsl.expected.wgsl
index d52472c..0fd2eb4 100644
--- a/test/intrinsics/gen/select/a2860e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/a2860e.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<i32> = select(vec4<i32>(), vec4<i32>(), vec4<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_a2860e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_a2860e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_a2860e();
 }
diff --git a/test/intrinsics/gen/select/ab069f.wgsl b/test/intrinsics/gen/select/ab069f.wgsl
index 3c2265e..a55fa79 100644
--- a/test/intrinsics/gen/select/ab069f.wgsl
+++ b/test/intrinsics/gen/select/ab069f.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<i32> = select(vec4<i32>(), vec4<i32>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_ab069f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_ab069f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_ab069f();
 }
diff --git a/test/intrinsics/gen/select/ab069f.wgsl.expected.wgsl b/test/intrinsics/gen/select/ab069f.wgsl.expected.wgsl
index b64daa0..ea18846 100644
--- a/test/intrinsics/gen/select/ab069f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/ab069f.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<i32> = select(vec4<i32>(), vec4<i32>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_ab069f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_ab069f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_ab069f();
 }
diff --git a/test/intrinsics/gen/select/b04721.wgsl b/test/intrinsics/gen/select/b04721.wgsl
index 13898cf..1de6739 100644
--- a/test/intrinsics/gen/select/b04721.wgsl
+++ b/test/intrinsics/gen/select/b04721.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<u32> = select(vec3<u32>(), vec3<u32>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_b04721();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_b04721();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_b04721();
 }
diff --git a/test/intrinsics/gen/select/b04721.wgsl.expected.wgsl b/test/intrinsics/gen/select/b04721.wgsl.expected.wgsl
index e92cb25..86befd9 100644
--- a/test/intrinsics/gen/select/b04721.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/b04721.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<u32> = select(vec3<u32>(), vec3<u32>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_b04721();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_b04721();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_b04721();
 }
diff --git a/test/intrinsics/gen/select/bb447f.wgsl b/test/intrinsics/gen/select/bb447f.wgsl
index 7bdc0c7..f15929a 100644
--- a/test/intrinsics/gen/select/bb447f.wgsl
+++ b/test/intrinsics/gen/select/bb447f.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<i32> = select(vec2<i32>(), vec2<i32>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_bb447f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_bb447f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_bb447f();
 }
diff --git a/test/intrinsics/gen/select/bb447f.wgsl.expected.wgsl b/test/intrinsics/gen/select/bb447f.wgsl.expected.wgsl
index dd11e92..2ea72e7 100644
--- a/test/intrinsics/gen/select/bb447f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/bb447f.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<i32> = select(vec2<i32>(), vec2<i32>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_bb447f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_bb447f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_bb447f();
 }
diff --git a/test/intrinsics/gen/select/bb8aae.wgsl b/test/intrinsics/gen/select/bb8aae.wgsl
index 5734859..786f619 100644
--- a/test/intrinsics/gen/select/bb8aae.wgsl
+++ b/test/intrinsics/gen/select/bb8aae.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = select(vec4<f32>(), vec4<f32>(), vec4<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_bb8aae();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_bb8aae();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_bb8aae();
 }
diff --git a/test/intrinsics/gen/select/bb8aae.wgsl.expected.wgsl b/test/intrinsics/gen/select/bb8aae.wgsl.expected.wgsl
index dca5783..f64a61b 100644
--- a/test/intrinsics/gen/select/bb8aae.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/bb8aae.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = select(vec4<f32>(), vec4<f32>(), vec4<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_bb8aae();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_bb8aae();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_bb8aae();
 }
diff --git a/test/intrinsics/gen/select/bf3d29.wgsl b/test/intrinsics/gen/select/bf3d29.wgsl
index ac24039..db8e855 100644
--- a/test/intrinsics/gen/select/bf3d29.wgsl
+++ b/test/intrinsics/gen/select/bf3d29.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = select(vec2<f32>(), vec2<f32>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_bf3d29();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_bf3d29();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_bf3d29();
 }
diff --git a/test/intrinsics/gen/select/bf3d29.wgsl.expected.wgsl b/test/intrinsics/gen/select/bf3d29.wgsl.expected.wgsl
index 1223b7b..87b2f80 100644
--- a/test/intrinsics/gen/select/bf3d29.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/bf3d29.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = select(vec2<f32>(), vec2<f32>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_bf3d29();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_bf3d29();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_bf3d29();
 }
diff --git a/test/intrinsics/gen/select/c31f9e.wgsl b/test/intrinsics/gen/select/c31f9e.wgsl
index 5694d13..3f04796 100644
--- a/test/intrinsics/gen/select/c31f9e.wgsl
+++ b/test/intrinsics/gen/select/c31f9e.wgsl
@@ -28,18 +28,18 @@
   var res: bool = select(bool(), bool(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_c31f9e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_c31f9e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_c31f9e();
 }
diff --git a/test/intrinsics/gen/select/c31f9e.wgsl.expected.wgsl b/test/intrinsics/gen/select/c31f9e.wgsl.expected.wgsl
index 289a904..21acae6 100644
--- a/test/intrinsics/gen/select/c31f9e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/c31f9e.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : bool = select(bool(), bool(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_c31f9e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_c31f9e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_c31f9e();
 }
diff --git a/test/intrinsics/gen/select/c41bd1.wgsl b/test/intrinsics/gen/select/c41bd1.wgsl
index cdb49ce..a4a0143 100644
--- a/test/intrinsics/gen/select/c41bd1.wgsl
+++ b/test/intrinsics/gen/select/c41bd1.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<bool> = select(vec4<bool>(), vec4<bool>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_c41bd1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_c41bd1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_c41bd1();
 }
diff --git a/test/intrinsics/gen/select/c41bd1.wgsl.expected.wgsl b/test/intrinsics/gen/select/c41bd1.wgsl.expected.wgsl
index c0fffc7..a314f0c 100644
--- a/test/intrinsics/gen/select/c41bd1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/c41bd1.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<bool> = select(vec4<bool>(), vec4<bool>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_c41bd1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_c41bd1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_c41bd1();
 }
diff --git a/test/intrinsics/gen/select/c4a4ef.wgsl b/test/intrinsics/gen/select/c4a4ef.wgsl
index f78392b..5826ca0 100644
--- a/test/intrinsics/gen/select/c4a4ef.wgsl
+++ b/test/intrinsics/gen/select/c4a4ef.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<u32> = select(vec4<u32>(), vec4<u32>(), vec4<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_c4a4ef();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_c4a4ef();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_c4a4ef();
 }
diff --git a/test/intrinsics/gen/select/c4a4ef.wgsl.expected.wgsl b/test/intrinsics/gen/select/c4a4ef.wgsl.expected.wgsl
index 13731b9..adbcc5d 100644
--- a/test/intrinsics/gen/select/c4a4ef.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/c4a4ef.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<u32> = select(vec4<u32>(), vec4<u32>(), vec4<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_c4a4ef();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_c4a4ef();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_c4a4ef();
 }
diff --git a/test/intrinsics/gen/select/cb9301.wgsl b/test/intrinsics/gen/select/cb9301.wgsl
index 397cca1..1de0ad1 100644
--- a/test/intrinsics/gen/select/cb9301.wgsl
+++ b/test/intrinsics/gen/select/cb9301.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<bool> = select(vec2<bool>(), vec2<bool>(), vec2<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_cb9301();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_cb9301();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_cb9301();
 }
diff --git a/test/intrinsics/gen/select/cb9301.wgsl.expected.wgsl b/test/intrinsics/gen/select/cb9301.wgsl.expected.wgsl
index cbad268..7c85dad 100644
--- a/test/intrinsics/gen/select/cb9301.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/cb9301.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<bool> = select(vec2<bool>(), vec2<bool>(), vec2<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_cb9301();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_cb9301();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_cb9301();
 }
diff --git a/test/intrinsics/gen/select/e3e028.wgsl b/test/intrinsics/gen/select/e3e028.wgsl
index 2031d9e..7d28666 100644
--- a/test/intrinsics/gen/select/e3e028.wgsl
+++ b/test/intrinsics/gen/select/e3e028.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<bool> = select(vec4<bool>(), vec4<bool>(), vec4<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_e3e028();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_e3e028();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_e3e028();
 }
diff --git a/test/intrinsics/gen/select/e3e028.wgsl.expected.wgsl b/test/intrinsics/gen/select/e3e028.wgsl.expected.wgsl
index 200e27d..2794266 100644
--- a/test/intrinsics/gen/select/e3e028.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/e3e028.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<bool> = select(vec4<bool>(), vec4<bool>(), vec4<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_e3e028();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_e3e028();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_e3e028();
 }
diff --git a/test/intrinsics/gen/select/ebfea2.wgsl b/test/intrinsics/gen/select/ebfea2.wgsl
index 8487ca2..bd572c5 100644
--- a/test/intrinsics/gen/select/ebfea2.wgsl
+++ b/test/intrinsics/gen/select/ebfea2.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = select(vec3<f32>(), vec3<f32>(), vec3<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_ebfea2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_ebfea2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_ebfea2();
 }
diff --git a/test/intrinsics/gen/select/ebfea2.wgsl.expected.wgsl b/test/intrinsics/gen/select/ebfea2.wgsl.expected.wgsl
index d7e6f63..c181585 100644
--- a/test/intrinsics/gen/select/ebfea2.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/ebfea2.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = select(vec3<f32>(), vec3<f32>(), vec3<bool>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_ebfea2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_ebfea2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_ebfea2();
 }
diff --git a/test/intrinsics/gen/select/ed8a15.wgsl b/test/intrinsics/gen/select/ed8a15.wgsl
index a898387..df1f6ad 100644
--- a/test/intrinsics/gen/select/ed8a15.wgsl
+++ b/test/intrinsics/gen/select/ed8a15.wgsl
@@ -28,18 +28,18 @@
   var res: i32 = select(1, 1, bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_ed8a15();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_ed8a15();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_ed8a15();
 }
diff --git a/test/intrinsics/gen/select/ed8a15.wgsl.expected.wgsl b/test/intrinsics/gen/select/ed8a15.wgsl.expected.wgsl
index 7f607be..ca4b96e 100644
--- a/test/intrinsics/gen/select/ed8a15.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/ed8a15.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : i32 = select(1, 1, bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_ed8a15();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_ed8a15();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_ed8a15();
 }
diff --git a/test/intrinsics/gen/select/fb7e53.wgsl b/test/intrinsics/gen/select/fb7e53.wgsl
index a213dbd..92d50f3 100644
--- a/test/intrinsics/gen/select/fb7e53.wgsl
+++ b/test/intrinsics/gen/select/fb7e53.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<bool> = select(vec2<bool>(), vec2<bool>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_fb7e53();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_fb7e53();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_fb7e53();
 }
diff --git a/test/intrinsics/gen/select/fb7e53.wgsl.expected.wgsl b/test/intrinsics/gen/select/fb7e53.wgsl.expected.wgsl
index e08a15f..6c6a287 100644
--- a/test/intrinsics/gen/select/fb7e53.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/select/fb7e53.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<bool> = select(vec2<bool>(), vec2<bool>(), bool());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   select_fb7e53();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   select_fb7e53();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   select_fb7e53();
 }
diff --git a/test/intrinsics/gen/sign/159665.wgsl b/test/intrinsics/gen/sign/159665.wgsl
index 31ef21d..a3d87a4 100644
--- a/test/intrinsics/gen/sign/159665.wgsl
+++ b/test/intrinsics/gen/sign/159665.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = sign(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sign_159665();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sign_159665();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sign_159665();
 }
diff --git a/test/intrinsics/gen/sign/159665.wgsl.expected.wgsl b/test/intrinsics/gen/sign/159665.wgsl.expected.wgsl
index fe38cd6..b66072b 100644
--- a/test/intrinsics/gen/sign/159665.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/sign/159665.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = sign(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sign_159665();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sign_159665();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sign_159665();
 }
diff --git a/test/intrinsics/gen/sign/b8f634.wgsl b/test/intrinsics/gen/sign/b8f634.wgsl
index d16ad92..c8ced09 100644
--- a/test/intrinsics/gen/sign/b8f634.wgsl
+++ b/test/intrinsics/gen/sign/b8f634.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = sign(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sign_b8f634();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sign_b8f634();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sign_b8f634();
 }
diff --git a/test/intrinsics/gen/sign/b8f634.wgsl.expected.wgsl b/test/intrinsics/gen/sign/b8f634.wgsl.expected.wgsl
index fb4f9f7..c9238d2 100644
--- a/test/intrinsics/gen/sign/b8f634.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/sign/b8f634.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = sign(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sign_b8f634();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sign_b8f634();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sign_b8f634();
 }
diff --git a/test/intrinsics/gen/sign/d065d8.wgsl b/test/intrinsics/gen/sign/d065d8.wgsl
index 548b2a3..98d6b5e 100644
--- a/test/intrinsics/gen/sign/d065d8.wgsl
+++ b/test/intrinsics/gen/sign/d065d8.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = sign(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sign_d065d8();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sign_d065d8();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sign_d065d8();
 }
diff --git a/test/intrinsics/gen/sign/d065d8.wgsl.expected.wgsl b/test/intrinsics/gen/sign/d065d8.wgsl.expected.wgsl
index 7d4de19..870041f 100644
--- a/test/intrinsics/gen/sign/d065d8.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/sign/d065d8.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = sign(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sign_d065d8();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sign_d065d8();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sign_d065d8();
 }
diff --git a/test/intrinsics/gen/sign/dd790e.wgsl b/test/intrinsics/gen/sign/dd790e.wgsl
index 57e5b92..7765ea3 100644
--- a/test/intrinsics/gen/sign/dd790e.wgsl
+++ b/test/intrinsics/gen/sign/dd790e.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = sign(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sign_dd790e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sign_dd790e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sign_dd790e();
 }
diff --git a/test/intrinsics/gen/sign/dd790e.wgsl.expected.wgsl b/test/intrinsics/gen/sign/dd790e.wgsl.expected.wgsl
index 9faa91b..d987517 100644
--- a/test/intrinsics/gen/sign/dd790e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/sign/dd790e.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = sign(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sign_dd790e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sign_dd790e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sign_dd790e();
 }
diff --git a/test/intrinsics/gen/sin/01f241.wgsl b/test/intrinsics/gen/sin/01f241.wgsl
index 6b385b3..58c1794 100644
--- a/test/intrinsics/gen/sin/01f241.wgsl
+++ b/test/intrinsics/gen/sin/01f241.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = sin(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sin_01f241();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sin_01f241();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sin_01f241();
 }
diff --git a/test/intrinsics/gen/sin/01f241.wgsl.expected.wgsl b/test/intrinsics/gen/sin/01f241.wgsl.expected.wgsl
index 6e7b72e..8188006 100644
--- a/test/intrinsics/gen/sin/01f241.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/sin/01f241.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = sin(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sin_01f241();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sin_01f241();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sin_01f241();
 }
diff --git a/test/intrinsics/gen/sin/4e3979.wgsl b/test/intrinsics/gen/sin/4e3979.wgsl
index 4b616c7..ae447d2 100644
--- a/test/intrinsics/gen/sin/4e3979.wgsl
+++ b/test/intrinsics/gen/sin/4e3979.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = sin(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sin_4e3979();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sin_4e3979();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sin_4e3979();
 }
diff --git a/test/intrinsics/gen/sin/4e3979.wgsl.expected.wgsl b/test/intrinsics/gen/sin/4e3979.wgsl.expected.wgsl
index 1ec3ddd..6d03778 100644
--- a/test/intrinsics/gen/sin/4e3979.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/sin/4e3979.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = sin(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sin_4e3979();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sin_4e3979();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sin_4e3979();
 }
diff --git a/test/intrinsics/gen/sin/b78c91.wgsl b/test/intrinsics/gen/sin/b78c91.wgsl
index 977b1c8..d8ecd40 100644
--- a/test/intrinsics/gen/sin/b78c91.wgsl
+++ b/test/intrinsics/gen/sin/b78c91.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = sin(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sin_b78c91();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sin_b78c91();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sin_b78c91();
 }
diff --git a/test/intrinsics/gen/sin/b78c91.wgsl.expected.wgsl b/test/intrinsics/gen/sin/b78c91.wgsl.expected.wgsl
index f3532b1..e4a2d42 100644
--- a/test/intrinsics/gen/sin/b78c91.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/sin/b78c91.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = sin(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sin_b78c91();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sin_b78c91();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sin_b78c91();
 }
diff --git a/test/intrinsics/gen/sin/fc8bc4.wgsl b/test/intrinsics/gen/sin/fc8bc4.wgsl
index 0c81e50..b828689 100644
--- a/test/intrinsics/gen/sin/fc8bc4.wgsl
+++ b/test/intrinsics/gen/sin/fc8bc4.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = sin(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sin_fc8bc4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sin_fc8bc4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sin_fc8bc4();
 }
diff --git a/test/intrinsics/gen/sin/fc8bc4.wgsl.expected.wgsl b/test/intrinsics/gen/sin/fc8bc4.wgsl.expected.wgsl
index fbe00f8..30e0918 100644
--- a/test/intrinsics/gen/sin/fc8bc4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/sin/fc8bc4.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = sin(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sin_fc8bc4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sin_fc8bc4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sin_fc8bc4();
 }
diff --git a/test/intrinsics/gen/sinh/445e33.wgsl b/test/intrinsics/gen/sinh/445e33.wgsl
index d3e9479..2bb1e20 100644
--- a/test/intrinsics/gen/sinh/445e33.wgsl
+++ b/test/intrinsics/gen/sinh/445e33.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = sinh(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sinh_445e33();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sinh_445e33();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sinh_445e33();
 }
diff --git a/test/intrinsics/gen/sinh/445e33.wgsl.expected.wgsl b/test/intrinsics/gen/sinh/445e33.wgsl.expected.wgsl
index 9f27e00..4eac92e 100644
--- a/test/intrinsics/gen/sinh/445e33.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/sinh/445e33.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = sinh(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sinh_445e33();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sinh_445e33();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sinh_445e33();
 }
diff --git a/test/intrinsics/gen/sinh/7bb598.wgsl b/test/intrinsics/gen/sinh/7bb598.wgsl
index 112d966..872b87b 100644
--- a/test/intrinsics/gen/sinh/7bb598.wgsl
+++ b/test/intrinsics/gen/sinh/7bb598.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = sinh(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sinh_7bb598();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sinh_7bb598();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sinh_7bb598();
 }
diff --git a/test/intrinsics/gen/sinh/7bb598.wgsl.expected.wgsl b/test/intrinsics/gen/sinh/7bb598.wgsl.expected.wgsl
index c9037e9..8df3fa0 100644
--- a/test/intrinsics/gen/sinh/7bb598.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/sinh/7bb598.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = sinh(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sinh_7bb598();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sinh_7bb598();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sinh_7bb598();
 }
diff --git a/test/intrinsics/gen/sinh/b9860e.wgsl b/test/intrinsics/gen/sinh/b9860e.wgsl
index 738b4b0..3039b48 100644
--- a/test/intrinsics/gen/sinh/b9860e.wgsl
+++ b/test/intrinsics/gen/sinh/b9860e.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = sinh(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sinh_b9860e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sinh_b9860e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sinh_b9860e();
 }
diff --git a/test/intrinsics/gen/sinh/b9860e.wgsl.expected.wgsl b/test/intrinsics/gen/sinh/b9860e.wgsl.expected.wgsl
index 189d1a8..b0698d0 100644
--- a/test/intrinsics/gen/sinh/b9860e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/sinh/b9860e.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = sinh(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sinh_b9860e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sinh_b9860e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sinh_b9860e();
 }
diff --git a/test/intrinsics/gen/sinh/c9a5eb.wgsl b/test/intrinsics/gen/sinh/c9a5eb.wgsl
index 59a9e38..9c79e98 100644
--- a/test/intrinsics/gen/sinh/c9a5eb.wgsl
+++ b/test/intrinsics/gen/sinh/c9a5eb.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = sinh(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sinh_c9a5eb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sinh_c9a5eb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sinh_c9a5eb();
 }
diff --git a/test/intrinsics/gen/sinh/c9a5eb.wgsl.expected.wgsl b/test/intrinsics/gen/sinh/c9a5eb.wgsl.expected.wgsl
index ccbf252..642d72c 100644
--- a/test/intrinsics/gen/sinh/c9a5eb.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/sinh/c9a5eb.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = sinh(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sinh_c9a5eb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sinh_c9a5eb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sinh_c9a5eb();
 }
diff --git a/test/intrinsics/gen/smoothStep/5f615b.wgsl b/test/intrinsics/gen/smoothStep/5f615b.wgsl
index d4ba632..4b1a4ab 100644
--- a/test/intrinsics/gen/smoothStep/5f615b.wgsl
+++ b/test/intrinsics/gen/smoothStep/5f615b.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = smoothStep(vec4<f32>(), vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   smoothStep_5f615b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   smoothStep_5f615b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   smoothStep_5f615b();
 }
diff --git a/test/intrinsics/gen/smoothStep/5f615b.wgsl.expected.wgsl b/test/intrinsics/gen/smoothStep/5f615b.wgsl.expected.wgsl
index 62fe376..55a7561 100644
--- a/test/intrinsics/gen/smoothStep/5f615b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/smoothStep/5f615b.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = smoothStep(vec4<f32>(), vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   smoothStep_5f615b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   smoothStep_5f615b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   smoothStep_5f615b();
 }
diff --git a/test/intrinsics/gen/smoothStep/658be3.wgsl b/test/intrinsics/gen/smoothStep/658be3.wgsl
index 11d3971..8e39364 100644
--- a/test/intrinsics/gen/smoothStep/658be3.wgsl
+++ b/test/intrinsics/gen/smoothStep/658be3.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = smoothStep(vec3<f32>(), vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   smoothStep_658be3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   smoothStep_658be3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   smoothStep_658be3();
 }
diff --git a/test/intrinsics/gen/smoothStep/658be3.wgsl.expected.wgsl b/test/intrinsics/gen/smoothStep/658be3.wgsl.expected.wgsl
index 2d99443..d81b745 100644
--- a/test/intrinsics/gen/smoothStep/658be3.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/smoothStep/658be3.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = smoothStep(vec3<f32>(), vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   smoothStep_658be3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   smoothStep_658be3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   smoothStep_658be3();
 }
diff --git a/test/intrinsics/gen/smoothStep/c11eef.wgsl b/test/intrinsics/gen/smoothStep/c11eef.wgsl
index 9d88a67..7839f09 100644
--- a/test/intrinsics/gen/smoothStep/c11eef.wgsl
+++ b/test/intrinsics/gen/smoothStep/c11eef.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = smoothStep(vec2<f32>(), vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   smoothStep_c11eef();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   smoothStep_c11eef();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   smoothStep_c11eef();
 }
diff --git a/test/intrinsics/gen/smoothStep/c11eef.wgsl.expected.wgsl b/test/intrinsics/gen/smoothStep/c11eef.wgsl.expected.wgsl
index 54a6fb7..7b34ffb 100644
--- a/test/intrinsics/gen/smoothStep/c11eef.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/smoothStep/c11eef.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = smoothStep(vec2<f32>(), vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   smoothStep_c11eef();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   smoothStep_c11eef();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   smoothStep_c11eef();
 }
diff --git a/test/intrinsics/gen/smoothStep/cb0bfb.wgsl b/test/intrinsics/gen/smoothStep/cb0bfb.wgsl
index a823893..5c6c8c2 100644
--- a/test/intrinsics/gen/smoothStep/cb0bfb.wgsl
+++ b/test/intrinsics/gen/smoothStep/cb0bfb.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = smoothStep(1.0, 1.0, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   smoothStep_cb0bfb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   smoothStep_cb0bfb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   smoothStep_cb0bfb();
 }
diff --git a/test/intrinsics/gen/smoothStep/cb0bfb.wgsl.expected.wgsl b/test/intrinsics/gen/smoothStep/cb0bfb.wgsl.expected.wgsl
index dd78c16..6b8ab78 100644
--- a/test/intrinsics/gen/smoothStep/cb0bfb.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/smoothStep/cb0bfb.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = smoothStep(1.0, 1.0, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   smoothStep_cb0bfb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   smoothStep_cb0bfb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   smoothStep_cb0bfb();
 }
diff --git a/test/intrinsics/gen/sqrt/20c74e.wgsl b/test/intrinsics/gen/sqrt/20c74e.wgsl
index 8b85622..b954397 100644
--- a/test/intrinsics/gen/sqrt/20c74e.wgsl
+++ b/test/intrinsics/gen/sqrt/20c74e.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = sqrt(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sqrt_20c74e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sqrt_20c74e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sqrt_20c74e();
 }
diff --git a/test/intrinsics/gen/sqrt/20c74e.wgsl.expected.wgsl b/test/intrinsics/gen/sqrt/20c74e.wgsl.expected.wgsl
index 944a81e..3b9fe0a 100644
--- a/test/intrinsics/gen/sqrt/20c74e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/sqrt/20c74e.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = sqrt(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sqrt_20c74e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sqrt_20c74e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sqrt_20c74e();
 }
diff --git a/test/intrinsics/gen/sqrt/8c7024.wgsl b/test/intrinsics/gen/sqrt/8c7024.wgsl
index 3cc8b8b..4e929d6 100644
--- a/test/intrinsics/gen/sqrt/8c7024.wgsl
+++ b/test/intrinsics/gen/sqrt/8c7024.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = sqrt(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sqrt_8c7024();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sqrt_8c7024();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sqrt_8c7024();
 }
diff --git a/test/intrinsics/gen/sqrt/8c7024.wgsl.expected.wgsl b/test/intrinsics/gen/sqrt/8c7024.wgsl.expected.wgsl
index 7021231..36b4a8b 100644
--- a/test/intrinsics/gen/sqrt/8c7024.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/sqrt/8c7024.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = sqrt(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sqrt_8c7024();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sqrt_8c7024();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sqrt_8c7024();
 }
diff --git a/test/intrinsics/gen/sqrt/aa0d7a.wgsl b/test/intrinsics/gen/sqrt/aa0d7a.wgsl
index a9b5ec2..e15b170 100644
--- a/test/intrinsics/gen/sqrt/aa0d7a.wgsl
+++ b/test/intrinsics/gen/sqrt/aa0d7a.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = sqrt(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sqrt_aa0d7a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sqrt_aa0d7a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sqrt_aa0d7a();
 }
diff --git a/test/intrinsics/gen/sqrt/aa0d7a.wgsl.expected.wgsl b/test/intrinsics/gen/sqrt/aa0d7a.wgsl.expected.wgsl
index 3158248..47ab81a 100644
--- a/test/intrinsics/gen/sqrt/aa0d7a.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/sqrt/aa0d7a.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = sqrt(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sqrt_aa0d7a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sqrt_aa0d7a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sqrt_aa0d7a();
 }
diff --git a/test/intrinsics/gen/sqrt/f8c59a.wgsl b/test/intrinsics/gen/sqrt/f8c59a.wgsl
index f201a13..5916a9f 100644
--- a/test/intrinsics/gen/sqrt/f8c59a.wgsl
+++ b/test/intrinsics/gen/sqrt/f8c59a.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = sqrt(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sqrt_f8c59a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sqrt_f8c59a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sqrt_f8c59a();
 }
diff --git a/test/intrinsics/gen/sqrt/f8c59a.wgsl.expected.wgsl b/test/intrinsics/gen/sqrt/f8c59a.wgsl.expected.wgsl
index 61da933..e12b658 100644
--- a/test/intrinsics/gen/sqrt/f8c59a.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/sqrt/f8c59a.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = sqrt(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   sqrt_f8c59a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   sqrt_f8c59a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   sqrt_f8c59a();
 }
diff --git a/test/intrinsics/gen/step/0b073b.wgsl b/test/intrinsics/gen/step/0b073b.wgsl
index e8f04cc..5d88c86 100644
--- a/test/intrinsics/gen/step/0b073b.wgsl
+++ b/test/intrinsics/gen/step/0b073b.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = step(1.0, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   step_0b073b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   step_0b073b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   step_0b073b();
 }
diff --git a/test/intrinsics/gen/step/0b073b.wgsl.expected.wgsl b/test/intrinsics/gen/step/0b073b.wgsl.expected.wgsl
index 313c3c6..36e47dd 100644
--- a/test/intrinsics/gen/step/0b073b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/step/0b073b.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = step(1.0, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   step_0b073b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   step_0b073b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   step_0b073b();
 }
diff --git a/test/intrinsics/gen/step/19accd.wgsl b/test/intrinsics/gen/step/19accd.wgsl
index 6dceca1..9493036 100644
--- a/test/intrinsics/gen/step/19accd.wgsl
+++ b/test/intrinsics/gen/step/19accd.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = step(vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   step_19accd();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   step_19accd();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   step_19accd();
 }
diff --git a/test/intrinsics/gen/step/19accd.wgsl.expected.wgsl b/test/intrinsics/gen/step/19accd.wgsl.expected.wgsl
index 08da07c..ce2b50b 100644
--- a/test/intrinsics/gen/step/19accd.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/step/19accd.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = step(vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   step_19accd();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   step_19accd();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   step_19accd();
 }
diff --git a/test/intrinsics/gen/step/334303.wgsl b/test/intrinsics/gen/step/334303.wgsl
index a4ecbd8..63d3ead 100644
--- a/test/intrinsics/gen/step/334303.wgsl
+++ b/test/intrinsics/gen/step/334303.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = step(vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   step_334303();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   step_334303();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   step_334303();
 }
diff --git a/test/intrinsics/gen/step/334303.wgsl.expected.wgsl b/test/intrinsics/gen/step/334303.wgsl.expected.wgsl
index 3b2f197..e1cb631 100644
--- a/test/intrinsics/gen/step/334303.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/step/334303.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = step(vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   step_334303();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   step_334303();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   step_334303();
 }
diff --git a/test/intrinsics/gen/step/e2b337.wgsl b/test/intrinsics/gen/step/e2b337.wgsl
index bbe16f1..e691130 100644
--- a/test/intrinsics/gen/step/e2b337.wgsl
+++ b/test/intrinsics/gen/step/e2b337.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = step(vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   step_e2b337();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   step_e2b337();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   step_e2b337();
 }
diff --git a/test/intrinsics/gen/step/e2b337.wgsl.expected.wgsl b/test/intrinsics/gen/step/e2b337.wgsl.expected.wgsl
index f626625..a6efd86 100644
--- a/test/intrinsics/gen/step/e2b337.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/step/e2b337.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = step(vec4<f32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   step_e2b337();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   step_e2b337();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   step_e2b337();
 }
diff --git a/test/intrinsics/gen/storageBarrier/d87211.wgsl b/test/intrinsics/gen/storageBarrier/d87211.wgsl
index cf5d8e1..2931174 100644
--- a/test/intrinsics/gen/storageBarrier/d87211.wgsl
+++ b/test/intrinsics/gen/storageBarrier/d87211.wgsl
@@ -28,7 +28,7 @@
   storageBarrier();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   storageBarrier_d87211();
 }
diff --git a/test/intrinsics/gen/storageBarrier/d87211.wgsl.expected.wgsl b/test/intrinsics/gen/storageBarrier/d87211.wgsl.expected.wgsl
index 2f0b741..4c87708 100644
--- a/test/intrinsics/gen/storageBarrier/d87211.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/storageBarrier/d87211.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   storageBarrier();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   storageBarrier_d87211();
 }
diff --git a/test/intrinsics/gen/tan/244e2a.wgsl b/test/intrinsics/gen/tan/244e2a.wgsl
index 7e816e4..599499f 100644
--- a/test/intrinsics/gen/tan/244e2a.wgsl
+++ b/test/intrinsics/gen/tan/244e2a.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = tan(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   tan_244e2a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   tan_244e2a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   tan_244e2a();
 }
diff --git a/test/intrinsics/gen/tan/244e2a.wgsl.expected.wgsl b/test/intrinsics/gen/tan/244e2a.wgsl.expected.wgsl
index 6e5647e..77ac6d8 100644
--- a/test/intrinsics/gen/tan/244e2a.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/tan/244e2a.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = tan(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   tan_244e2a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   tan_244e2a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   tan_244e2a();
 }
diff --git a/test/intrinsics/gen/tan/2f030e.wgsl b/test/intrinsics/gen/tan/2f030e.wgsl
index 52504f7..3ee8e72 100644
--- a/test/intrinsics/gen/tan/2f030e.wgsl
+++ b/test/intrinsics/gen/tan/2f030e.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = tan(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   tan_2f030e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   tan_2f030e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   tan_2f030e();
 }
diff --git a/test/intrinsics/gen/tan/2f030e.wgsl.expected.wgsl b/test/intrinsics/gen/tan/2f030e.wgsl.expected.wgsl
index b638e2c..3c12969 100644
--- a/test/intrinsics/gen/tan/2f030e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/tan/2f030e.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = tan(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   tan_2f030e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   tan_2f030e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   tan_2f030e();
 }
diff --git a/test/intrinsics/gen/tan/7ea104.wgsl b/test/intrinsics/gen/tan/7ea104.wgsl
index 5c8437e..6250daa 100644
--- a/test/intrinsics/gen/tan/7ea104.wgsl
+++ b/test/intrinsics/gen/tan/7ea104.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = tan(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   tan_7ea104();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   tan_7ea104();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   tan_7ea104();
 }
diff --git a/test/intrinsics/gen/tan/7ea104.wgsl.expected.wgsl b/test/intrinsics/gen/tan/7ea104.wgsl.expected.wgsl
index 078d91f..f859e50 100644
--- a/test/intrinsics/gen/tan/7ea104.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/tan/7ea104.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = tan(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   tan_7ea104();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   tan_7ea104();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   tan_7ea104();
 }
diff --git a/test/intrinsics/gen/tan/8ce3e9.wgsl b/test/intrinsics/gen/tan/8ce3e9.wgsl
index 1ddcfa9..85765f1 100644
--- a/test/intrinsics/gen/tan/8ce3e9.wgsl
+++ b/test/intrinsics/gen/tan/8ce3e9.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = tan(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   tan_8ce3e9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   tan_8ce3e9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   tan_8ce3e9();
 }
diff --git a/test/intrinsics/gen/tan/8ce3e9.wgsl.expected.wgsl b/test/intrinsics/gen/tan/8ce3e9.wgsl.expected.wgsl
index 756d55f..a43d809 100644
--- a/test/intrinsics/gen/tan/8ce3e9.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/tan/8ce3e9.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = tan(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   tan_8ce3e9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   tan_8ce3e9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   tan_8ce3e9();
 }
diff --git a/test/intrinsics/gen/tanh/5663c5.wgsl b/test/intrinsics/gen/tanh/5663c5.wgsl
index ed50ced..96b2fdb 100644
--- a/test/intrinsics/gen/tanh/5663c5.wgsl
+++ b/test/intrinsics/gen/tanh/5663c5.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = tanh(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   tanh_5663c5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   tanh_5663c5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   tanh_5663c5();
 }
diff --git a/test/intrinsics/gen/tanh/5663c5.wgsl.expected.wgsl b/test/intrinsics/gen/tanh/5663c5.wgsl.expected.wgsl
index 5158816..717091b 100644
--- a/test/intrinsics/gen/tanh/5663c5.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/tanh/5663c5.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = tanh(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   tanh_5663c5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   tanh_5663c5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   tanh_5663c5();
 }
diff --git a/test/intrinsics/gen/tanh/5724b3.wgsl b/test/intrinsics/gen/tanh/5724b3.wgsl
index fdee451..c0f35098 100644
--- a/test/intrinsics/gen/tanh/5724b3.wgsl
+++ b/test/intrinsics/gen/tanh/5724b3.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = tanh(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   tanh_5724b3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   tanh_5724b3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   tanh_5724b3();
 }
diff --git a/test/intrinsics/gen/tanh/5724b3.wgsl.expected.wgsl b/test/intrinsics/gen/tanh/5724b3.wgsl.expected.wgsl
index 2856696..7fbd481 100644
--- a/test/intrinsics/gen/tanh/5724b3.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/tanh/5724b3.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = tanh(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   tanh_5724b3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   tanh_5724b3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   tanh_5724b3();
 }
diff --git a/test/intrinsics/gen/tanh/9f9fb9.wgsl b/test/intrinsics/gen/tanh/9f9fb9.wgsl
index 81579ef..e83ed57 100644
--- a/test/intrinsics/gen/tanh/9f9fb9.wgsl
+++ b/test/intrinsics/gen/tanh/9f9fb9.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = tanh(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   tanh_9f9fb9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   tanh_9f9fb9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   tanh_9f9fb9();
 }
diff --git a/test/intrinsics/gen/tanh/9f9fb9.wgsl.expected.wgsl b/test/intrinsics/gen/tanh/9f9fb9.wgsl.expected.wgsl
index 32f523a..20184fd 100644
--- a/test/intrinsics/gen/tanh/9f9fb9.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/tanh/9f9fb9.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = tanh(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   tanh_9f9fb9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   tanh_9f9fb9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   tanh_9f9fb9();
 }
diff --git a/test/intrinsics/gen/tanh/c15fdb.wgsl b/test/intrinsics/gen/tanh/c15fdb.wgsl
index 32a04fc..20c69fd 100644
--- a/test/intrinsics/gen/tanh/c15fdb.wgsl
+++ b/test/intrinsics/gen/tanh/c15fdb.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = tanh(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   tanh_c15fdb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   tanh_c15fdb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   tanh_c15fdb();
 }
diff --git a/test/intrinsics/gen/tanh/c15fdb.wgsl.expected.wgsl b/test/intrinsics/gen/tanh/c15fdb.wgsl.expected.wgsl
index d7a1379..fb6e8e7 100644
--- a/test/intrinsics/gen/tanh/c15fdb.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/tanh/c15fdb.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = tanh(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   tanh_c15fdb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   tanh_c15fdb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   tanh_c15fdb();
 }
diff --git a/test/intrinsics/gen/textureDimensions/002b2a.wgsl b/test/intrinsics/gen/textureDimensions/002b2a.wgsl
index 205bae6..96f16b2 100644
--- a/test/intrinsics/gen/textureDimensions/002b2a.wgsl
+++ b/test/intrinsics/gen/textureDimensions/002b2a.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_1d<f32>;
+@group(1) @binding(0) var arg_0: texture_1d<f32>;
 
 // fn textureDimensions(texture: texture_1d<f32>) -> i32
 fn textureDimensions_002b2a() {
   var res: i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_002b2a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_002b2a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_002b2a();
 }
diff --git a/test/intrinsics/gen/textureDimensions/002b2a.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/002b2a.wgsl.expected.wgsl
index b0ea573..a21a8c0 100644
--- a/test/intrinsics/gen/textureDimensions/002b2a.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/002b2a.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_1d<f32>;
+@group(1) @binding(0) var arg_0 : texture_1d<f32>;
 
 fn textureDimensions_002b2a() {
   var res : i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_002b2a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_002b2a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_002b2a();
 }
diff --git a/test/intrinsics/gen/textureDimensions/012b82.wgsl b/test/intrinsics/gen/textureDimensions/012b82.wgsl
index 40caed2..b1697be 100644
--- a/test/intrinsics/gen/textureDimensions/012b82.wgsl
+++ b/test/intrinsics/gen/textureDimensions/012b82.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<r32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<r32sint, write>) -> vec2<i32>
 fn textureDimensions_012b82() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_012b82();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_012b82();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_012b82();
 }
diff --git a/test/intrinsics/gen/textureDimensions/012b82.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/012b82.wgsl.expected.wgsl
index dfe7af6..7ebcab6 100644
--- a/test/intrinsics/gen/textureDimensions/012b82.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/012b82.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<r32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<r32sint, write>;
 
 fn textureDimensions_012b82() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_012b82();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_012b82();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_012b82();
 }
diff --git a/test/intrinsics/gen/textureDimensions/08753d.wgsl b/test/intrinsics/gen/textureDimensions/08753d.wgsl
index 52e0254..05fcbdd 100644
--- a/test/intrinsics/gen/textureDimensions/08753d.wgsl
+++ b/test/intrinsics/gen/textureDimensions/08753d.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rgba16sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba16sint, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba16sint, write>) -> i32
 fn textureDimensions_08753d() {
   var res: i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_08753d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_08753d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_08753d();
 }
diff --git a/test/intrinsics/gen/textureDimensions/08753d.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/08753d.wgsl.expected.wgsl
index 95f3629..45dce4b 100644
--- a/test/intrinsics/gen/textureDimensions/08753d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/08753d.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rgba16sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rgba16sint, write>;
 
 fn textureDimensions_08753d() {
   var res : i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_08753d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_08753d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_08753d();
 }
diff --git a/test/intrinsics/gen/textureDimensions/0c4772.wgsl b/test/intrinsics/gen/textureDimensions/0c4772.wgsl
index 7ba349c..daad042 100644
--- a/test/intrinsics/gen/textureDimensions/0c4772.wgsl
+++ b/test/intrinsics/gen/textureDimensions/0c4772.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rgba16float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba16float, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba16float, write>) -> vec3<i32>
 fn textureDimensions_0c4772() {
   var res: vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_0c4772();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_0c4772();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_0c4772();
 }
diff --git a/test/intrinsics/gen/textureDimensions/0c4772.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/0c4772.wgsl.expected.wgsl
index 0262649..dc5fc35 100644
--- a/test/intrinsics/gen/textureDimensions/0c4772.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/0c4772.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rgba16float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rgba16float, write>;
 
 fn textureDimensions_0c4772() {
   var res : vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_0c4772();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_0c4772();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_0c4772();
 }
diff --git a/test/intrinsics/gen/textureDimensions/0cce40.wgsl b/test/intrinsics/gen/textureDimensions/0cce40.wgsl
index 1c710ad..a9ae133 100644
--- a/test/intrinsics/gen/textureDimensions/0cce40.wgsl
+++ b/test/intrinsics/gen/textureDimensions/0cce40.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<r32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<r32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<r32sint, write>) -> i32
 fn textureDimensions_0cce40() {
   var res: i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_0cce40();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_0cce40();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_0cce40();
 }
diff --git a/test/intrinsics/gen/textureDimensions/0cce40.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/0cce40.wgsl.expected.wgsl
index 8c156ca..04b0e24 100644
--- a/test/intrinsics/gen/textureDimensions/0cce40.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/0cce40.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<r32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<r32sint, write>;
 
 fn textureDimensions_0cce40() {
   var res : i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_0cce40();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_0cce40();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_0cce40();
 }
diff --git a/test/intrinsics/gen/textureDimensions/0cf2ff.wgsl b/test/intrinsics/gen/textureDimensions/0cf2ff.wgsl
index 74f7f3c..1fef317 100644
--- a/test/intrinsics/gen/textureDimensions/0cf2ff.wgsl
+++ b/test/intrinsics/gen/textureDimensions/0cf2ff.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rgba16uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba16uint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba16uint, write>) -> vec2<i32>
 fn textureDimensions_0cf2ff() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_0cf2ff();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_0cf2ff();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_0cf2ff();
 }
diff --git a/test/intrinsics/gen/textureDimensions/0cf2ff.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/0cf2ff.wgsl.expected.wgsl
index cea5440..36e3e61 100644
--- a/test/intrinsics/gen/textureDimensions/0cf2ff.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/0cf2ff.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rgba16uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rgba16uint, write>;
 
 fn textureDimensions_0cf2ff() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_0cf2ff();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_0cf2ff();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_0cf2ff();
 }
diff --git a/test/intrinsics/gen/textureDimensions/0d8b7e.wgsl b/test/intrinsics/gen/textureDimensions/0d8b7e.wgsl
index dce0780..255f1ee 100644
--- a/test/intrinsics/gen/textureDimensions/0d8b7e.wgsl
+++ b/test/intrinsics/gen/textureDimensions/0d8b7e.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<r32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<r32uint, write>) -> vec2<i32>
 fn textureDimensions_0d8b7e() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_0d8b7e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_0d8b7e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_0d8b7e();
 }
diff --git a/test/intrinsics/gen/textureDimensions/0d8b7e.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/0d8b7e.wgsl.expected.wgsl
index 4427b17..b4a1350 100644
--- a/test/intrinsics/gen/textureDimensions/0d8b7e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/0d8b7e.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<r32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<r32uint, write>;
 
 fn textureDimensions_0d8b7e() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_0d8b7e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_0d8b7e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_0d8b7e();
 }
diff --git a/test/intrinsics/gen/textureDimensions/0e32ee.wgsl b/test/intrinsics/gen/textureDimensions/0e32ee.wgsl
index ed94fd3..be5b433 100644
--- a/test/intrinsics/gen/textureDimensions/0e32ee.wgsl
+++ b/test/intrinsics/gen/textureDimensions/0e32ee.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rgba16uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba16uint, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba16uint, write>) -> vec3<i32>
 fn textureDimensions_0e32ee() {
   var res: vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_0e32ee();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_0e32ee();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_0e32ee();
 }
diff --git a/test/intrinsics/gen/textureDimensions/0e32ee.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/0e32ee.wgsl.expected.wgsl
index 971c451..9f0e1d1 100644
--- a/test/intrinsics/gen/textureDimensions/0e32ee.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/0e32ee.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rgba16uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rgba16uint, write>;
 
 fn textureDimensions_0e32ee() {
   var res : vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_0e32ee();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_0e32ee();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_0e32ee();
 }
diff --git a/test/intrinsics/gen/textureDimensions/0f3c50.wgsl b/test/intrinsics/gen/textureDimensions/0f3c50.wgsl
index 99bab7e..2cc8fec 100644
--- a/test/intrinsics/gen/textureDimensions/0f3c50.wgsl
+++ b/test/intrinsics/gen/textureDimensions/0f3c50.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d_array<i32>;
+@group(1) @binding(0) var arg_0: texture_2d_array<i32>;
 
 // fn textureDimensions(texture: texture_2d_array<i32>) -> vec2<i32>
 fn textureDimensions_0f3c50() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_0f3c50();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_0f3c50();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_0f3c50();
 }
diff --git a/test/intrinsics/gen/textureDimensions/0f3c50.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/0f3c50.wgsl.expected.wgsl
index 57309a9..553f57e 100644
--- a/test/intrinsics/gen/textureDimensions/0f3c50.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/0f3c50.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d_array<i32>;
+@group(1) @binding(0) var arg_0 : texture_2d_array<i32>;
 
 fn textureDimensions_0f3c50() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_0f3c50();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_0f3c50();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_0f3c50();
 }
diff --git a/test/intrinsics/gen/textureDimensions/1191a5.wgsl b/test/intrinsics/gen/textureDimensions/1191a5.wgsl
index 714a92c..6b0382b 100644
--- a/test/intrinsics/gen/textureDimensions/1191a5.wgsl
+++ b/test/intrinsics/gen/textureDimensions/1191a5.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d<u32>;
+@group(1) @binding(0) var arg_0: texture_2d<u32>;
 
 // fn textureDimensions(texture: texture_2d<u32>) -> vec2<i32>
 fn textureDimensions_1191a5() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_1191a5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_1191a5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_1191a5();
 }
diff --git a/test/intrinsics/gen/textureDimensions/1191a5.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/1191a5.wgsl.expected.wgsl
index 51c403e..2131304 100644
--- a/test/intrinsics/gen/textureDimensions/1191a5.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/1191a5.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d<u32>;
+@group(1) @binding(0) var arg_0 : texture_2d<u32>;
 
 fn textureDimensions_1191a5() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_1191a5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_1191a5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_1191a5();
 }
diff --git a/test/intrinsics/gen/textureDimensions/12c9bb.wgsl b/test/intrinsics/gen/textureDimensions/12c9bb.wgsl
index bb7a3b0..b2fa3ef 100644
--- a/test/intrinsics/gen/textureDimensions/12c9bb.wgsl
+++ b/test/intrinsics/gen/textureDimensions/12c9bb.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d;
+@group(1) @binding(0) var arg_0: texture_depth_2d;
 
 // fn textureDimensions(texture: texture_depth_2d, level: i32) -> vec2<i32>
 fn textureDimensions_12c9bb() {
   var res: vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_12c9bb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_12c9bb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_12c9bb();
 }
diff --git a/test/intrinsics/gen/textureDimensions/12c9bb.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/12c9bb.wgsl.expected.wgsl
index 1dd859f..14d7f89 100644
--- a/test/intrinsics/gen/textureDimensions/12c9bb.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/12c9bb.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_2d;
 
 fn textureDimensions_12c9bb() {
   var res : vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_12c9bb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_12c9bb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_12c9bb();
 }
diff --git a/test/intrinsics/gen/textureDimensions/147998.wgsl b/test/intrinsics/gen/textureDimensions/147998.wgsl
index 66e2d27..41ebd81 100644
--- a/test/intrinsics/gen/textureDimensions/147998.wgsl
+++ b/test/intrinsics/gen/textureDimensions/147998.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rg32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rg32float, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rg32float, write>) -> vec2<i32>
 fn textureDimensions_147998() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_147998();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_147998();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_147998();
 }
diff --git a/test/intrinsics/gen/textureDimensions/147998.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/147998.wgsl.expected.wgsl
index b587cb2..3cd6855 100644
--- a/test/intrinsics/gen/textureDimensions/147998.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/147998.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rg32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rg32float, write>;
 
 fn textureDimensions_147998() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_147998();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_147998();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_147998();
 }
diff --git a/test/intrinsics/gen/textureDimensions/16036c.wgsl b/test/intrinsics/gen/textureDimensions/16036c.wgsl
index 85e3656..c231cc4 100644
--- a/test/intrinsics/gen/textureDimensions/16036c.wgsl
+++ b/test/intrinsics/gen/textureDimensions/16036c.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba8sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8sint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba8sint, write>) -> vec2<i32>
 fn textureDimensions_16036c() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_16036c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_16036c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_16036c();
 }
diff --git a/test/intrinsics/gen/textureDimensions/16036c.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/16036c.wgsl.expected.wgsl
index be39823..072b71e 100644
--- a/test/intrinsics/gen/textureDimensions/16036c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/16036c.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba8sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8sint, write>;
 
 fn textureDimensions_16036c() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_16036c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_16036c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_16036c();
 }
diff --git a/test/intrinsics/gen/textureDimensions/1b71f0.wgsl b/test/intrinsics/gen/textureDimensions/1b71f0.wgsl
index 7963585..558f3e3 100644
--- a/test/intrinsics/gen/textureDimensions/1b71f0.wgsl
+++ b/test/intrinsics/gen/textureDimensions/1b71f0.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rgba16sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba16sint, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba16sint, write>) -> vec3<i32>
 fn textureDimensions_1b71f0() {
   var res: vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_1b71f0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_1b71f0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_1b71f0();
 }
diff --git a/test/intrinsics/gen/textureDimensions/1b71f0.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/1b71f0.wgsl.expected.wgsl
index 3b1d91b..8fedb78 100644
--- a/test/intrinsics/gen/textureDimensions/1b71f0.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/1b71f0.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rgba16sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rgba16sint, write>;
 
 fn textureDimensions_1b71f0() {
   var res : vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_1b71f0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_1b71f0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_1b71f0();
 }
diff --git a/test/intrinsics/gen/textureDimensions/1d6c26.wgsl b/test/intrinsics/gen/textureDimensions/1d6c26.wgsl
index 34ee093..d2d2980 100644
--- a/test/intrinsics/gen/textureDimensions/1d6c26.wgsl
+++ b/test/intrinsics/gen/textureDimensions/1d6c26.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba8unorm, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8unorm, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba8unorm, write>) -> vec2<i32>
 fn textureDimensions_1d6c26() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_1d6c26();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_1d6c26();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_1d6c26();
 }
diff --git a/test/intrinsics/gen/textureDimensions/1d6c26.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/1d6c26.wgsl.expected.wgsl
index c6b9da7..1ca754c 100644
--- a/test/intrinsics/gen/textureDimensions/1d6c26.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/1d6c26.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba8unorm, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8unorm, write>;
 
 fn textureDimensions_1d6c26() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_1d6c26();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_1d6c26();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_1d6c26();
 }
diff --git a/test/intrinsics/gen/textureDimensions/1e9e39.wgsl b/test/intrinsics/gen/textureDimensions/1e9e39.wgsl
index 12af798..a30fbe0 100644
--- a/test/intrinsics/gen/textureDimensions/1e9e39.wgsl
+++ b/test/intrinsics/gen/textureDimensions/1e9e39.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rgba16float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba16float, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba16float, write>) -> i32
 fn textureDimensions_1e9e39() {
   var res: i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_1e9e39();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_1e9e39();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_1e9e39();
 }
diff --git a/test/intrinsics/gen/textureDimensions/1e9e39.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/1e9e39.wgsl.expected.wgsl
index 84a7f69..938b104 100644
--- a/test/intrinsics/gen/textureDimensions/1e9e39.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/1e9e39.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rgba16float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rgba16float, write>;
 
 fn textureDimensions_1e9e39() {
   var res : i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_1e9e39();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_1e9e39();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_1e9e39();
 }
diff --git a/test/intrinsics/gen/textureDimensions/1f20c5.wgsl b/test/intrinsics/gen/textureDimensions/1f20c5.wgsl
index 8cde2fa..0e49717 100644
--- a/test/intrinsics/gen/textureDimensions/1f20c5.wgsl
+++ b/test/intrinsics/gen/textureDimensions/1f20c5.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d_array<u32>;
+@group(1) @binding(0) var arg_0: texture_2d_array<u32>;
 
 // fn textureDimensions(texture: texture_2d_array<u32>) -> vec2<i32>
 fn textureDimensions_1f20c5() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_1f20c5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_1f20c5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_1f20c5();
 }
diff --git a/test/intrinsics/gen/textureDimensions/1f20c5.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/1f20c5.wgsl.expected.wgsl
index ca2cab1..2cbde3e 100644
--- a/test/intrinsics/gen/textureDimensions/1f20c5.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/1f20c5.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d_array<u32>;
+@group(1) @binding(0) var arg_0 : texture_2d_array<u32>;
 
 fn textureDimensions_1f20c5() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_1f20c5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_1f20c5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_1f20c5();
 }
diff --git a/test/intrinsics/gen/textureDimensions/214dd4.wgsl b/test/intrinsics/gen/textureDimensions/214dd4.wgsl
index 4c1391f..27c2d8a 100644
--- a/test/intrinsics/gen/textureDimensions/214dd4.wgsl
+++ b/test/intrinsics/gen/textureDimensions/214dd4.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rgba8sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8sint, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba8sint, write>) -> vec3<i32>
 fn textureDimensions_214dd4() {
   var res: vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_214dd4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_214dd4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_214dd4();
 }
diff --git a/test/intrinsics/gen/textureDimensions/214dd4.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/214dd4.wgsl.expected.wgsl
index 7e96034..a6e1919 100644
--- a/test/intrinsics/gen/textureDimensions/214dd4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/214dd4.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rgba8sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rgba8sint, write>;
 
 fn textureDimensions_214dd4() {
   var res : vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_214dd4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_214dd4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_214dd4();
 }
diff --git a/test/intrinsics/gen/textureDimensions/221f22.wgsl b/test/intrinsics/gen/textureDimensions/221f22.wgsl
index c431bbd..70098d7 100644
--- a/test/intrinsics/gen/textureDimensions/221f22.wgsl
+++ b/test/intrinsics/gen/textureDimensions/221f22.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube_array<i32>;
+@group(1) @binding(0) var arg_0: texture_cube_array<i32>;
 
 // fn textureDimensions(texture: texture_cube_array<i32>, level: i32) -> vec2<i32>
 fn textureDimensions_221f22() {
   var res: vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_221f22();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_221f22();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_221f22();
 }
diff --git a/test/intrinsics/gen/textureDimensions/221f22.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/221f22.wgsl.expected.wgsl
index 55707cd..e05c6f5 100644
--- a/test/intrinsics/gen/textureDimensions/221f22.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/221f22.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube_array<i32>;
+@group(1) @binding(0) var arg_0 : texture_cube_array<i32>;
 
 fn textureDimensions_221f22() {
   var res : vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_221f22();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_221f22();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_221f22();
 }
diff --git a/test/intrinsics/gen/textureDimensions/267788.wgsl b/test/intrinsics/gen/textureDimensions/267788.wgsl
index 36846b6..d431dc7 100644
--- a/test/intrinsics/gen/textureDimensions/267788.wgsl
+++ b/test/intrinsics/gen/textureDimensions/267788.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d_array<u32>;
+@group(1) @binding(0) var arg_0: texture_2d_array<u32>;
 
 // fn textureDimensions(texture: texture_2d_array<u32>, level: i32) -> vec2<i32>
 fn textureDimensions_267788() {
   var res: vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_267788();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_267788();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_267788();
 }
diff --git a/test/intrinsics/gen/textureDimensions/267788.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/267788.wgsl.expected.wgsl
index baf7d3a..99d3c54 100644
--- a/test/intrinsics/gen/textureDimensions/267788.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/267788.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d_array<u32>;
+@group(1) @binding(0) var arg_0 : texture_2d_array<u32>;
 
 fn textureDimensions_267788() {
   var res : vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_267788();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_267788();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_267788();
 }
diff --git a/test/intrinsics/gen/textureDimensions/26bdfa.wgsl b/test/intrinsics/gen/textureDimensions/26bdfa.wgsl
index 7f84a66..4100047 100644
--- a/test/intrinsics/gen/textureDimensions/26bdfa.wgsl
+++ b/test/intrinsics/gen/textureDimensions/26bdfa.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_3d<f32>;
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
 
 // fn textureDimensions(texture: texture_3d<f32>, level: i32) -> vec3<i32>
 fn textureDimensions_26bdfa() {
   var res: vec3<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_26bdfa();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_26bdfa();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_26bdfa();
 }
diff --git a/test/intrinsics/gen/textureDimensions/26bdfa.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/26bdfa.wgsl.expected.wgsl
index 7a1e888..5f9267e 100644
--- a/test/intrinsics/gen/textureDimensions/26bdfa.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/26bdfa.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_3d<f32>;
+@group(1) @binding(0) var arg_0 : texture_3d<f32>;
 
 fn textureDimensions_26bdfa() {
   var res : vec3<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_26bdfa();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_26bdfa();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_26bdfa();
 }
diff --git a/test/intrinsics/gen/textureDimensions/26ef6c.wgsl b/test/intrinsics/gen/textureDimensions/26ef6c.wgsl
index 310190d..ec36468 100644
--- a/test/intrinsics/gen/textureDimensions/26ef6c.wgsl
+++ b/test/intrinsics/gen/textureDimensions/26ef6c.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba8uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8uint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba8uint, write>) -> vec2<i32>
 fn textureDimensions_26ef6c() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_26ef6c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_26ef6c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_26ef6c();
 }
diff --git a/test/intrinsics/gen/textureDimensions/26ef6c.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/26ef6c.wgsl.expected.wgsl
index 99ebb20..960c66d 100644
--- a/test/intrinsics/gen/textureDimensions/26ef6c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/26ef6c.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba8uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8uint, write>;
 
 fn textureDimensions_26ef6c() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_26ef6c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_26ef6c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_26ef6c();
 }
diff --git a/test/intrinsics/gen/textureDimensions/2ad087.wgsl b/test/intrinsics/gen/textureDimensions/2ad087.wgsl
index 6dbbd7c..74ab99e 100644
--- a/test/intrinsics/gen/textureDimensions/2ad087.wgsl
+++ b/test/intrinsics/gen/textureDimensions/2ad087.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rgba16sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba16sint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba16sint, write>) -> vec2<i32>
 fn textureDimensions_2ad087() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_2ad087();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_2ad087();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_2ad087();
 }
diff --git a/test/intrinsics/gen/textureDimensions/2ad087.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/2ad087.wgsl.expected.wgsl
index cf87608..c2b8327 100644
--- a/test/intrinsics/gen/textureDimensions/2ad087.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/2ad087.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rgba16sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rgba16sint, write>;
 
 fn textureDimensions_2ad087() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_2ad087();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_2ad087();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_2ad087();
 }
diff --git a/test/intrinsics/gen/textureDimensions/2efa05.wgsl b/test/intrinsics/gen/textureDimensions/2efa05.wgsl
index 4752fc1..b5da206 100644
--- a/test/intrinsics/gen/textureDimensions/2efa05.wgsl
+++ b/test/intrinsics/gen/textureDimensions/2efa05.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_3d<u32>;
+@group(1) @binding(0) var arg_0: texture_3d<u32>;
 
 // fn textureDimensions(texture: texture_3d<u32>, level: i32) -> vec3<i32>
 fn textureDimensions_2efa05() {
   var res: vec3<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_2efa05();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_2efa05();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_2efa05();
 }
diff --git a/test/intrinsics/gen/textureDimensions/2efa05.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/2efa05.wgsl.expected.wgsl
index faea123..0b9afd8 100644
--- a/test/intrinsics/gen/textureDimensions/2efa05.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/2efa05.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_3d<u32>;
+@group(1) @binding(0) var arg_0 : texture_3d<u32>;
 
 fn textureDimensions_2efa05() {
   var res : vec3<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_2efa05();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_2efa05();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_2efa05();
 }
diff --git a/test/intrinsics/gen/textureDimensions/2f289f.wgsl b/test/intrinsics/gen/textureDimensions/2f289f.wgsl
index ea31afd..0ac6e35 100644
--- a/test/intrinsics/gen/textureDimensions/2f289f.wgsl
+++ b/test/intrinsics/gen/textureDimensions/2f289f.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<r32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<r32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<r32sint, write>) -> vec3<i32>
 fn textureDimensions_2f289f() {
   var res: vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_2f289f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_2f289f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_2f289f();
 }
diff --git a/test/intrinsics/gen/textureDimensions/2f289f.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/2f289f.wgsl.expected.wgsl
index 3157ff0..7ffc030 100644
--- a/test/intrinsics/gen/textureDimensions/2f289f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/2f289f.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<r32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<r32sint, write>;
 
 fn textureDimensions_2f289f() {
   var res : vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_2f289f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_2f289f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_2f289f();
 }
diff --git a/test/intrinsics/gen/textureDimensions/2fe1cc.wgsl b/test/intrinsics/gen/textureDimensions/2fe1cc.wgsl
index 5fe606e..0bd62a0 100644
--- a/test/intrinsics/gen/textureDimensions/2fe1cc.wgsl
+++ b/test/intrinsics/gen/textureDimensions/2fe1cc.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d<f32>;
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
 
 // fn textureDimensions(texture: texture_2d<f32>, level: i32) -> vec2<i32>
 fn textureDimensions_2fe1cc() {
   var res: vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_2fe1cc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_2fe1cc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_2fe1cc();
 }
diff --git a/test/intrinsics/gen/textureDimensions/2fe1cc.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/2fe1cc.wgsl.expected.wgsl
index 3871292..4b03276 100644
--- a/test/intrinsics/gen/textureDimensions/2fe1cc.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/2fe1cc.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d<f32>;
 
 fn textureDimensions_2fe1cc() {
   var res : vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_2fe1cc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_2fe1cc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_2fe1cc();
 }
diff --git a/test/intrinsics/gen/textureDimensions/318ecc.wgsl b/test/intrinsics/gen/textureDimensions/318ecc.wgsl
index 7227955..015839c 100644
--- a/test/intrinsics/gen/textureDimensions/318ecc.wgsl
+++ b/test/intrinsics/gen/textureDimensions/318ecc.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rgba16uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba16uint, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba16uint, write>) -> i32
 fn textureDimensions_318ecc() {
   var res: i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_318ecc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_318ecc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_318ecc();
 }
diff --git a/test/intrinsics/gen/textureDimensions/318ecc.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/318ecc.wgsl.expected.wgsl
index cc92f6c..d1c53d4 100644
--- a/test/intrinsics/gen/textureDimensions/318ecc.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/318ecc.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rgba16uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rgba16uint, write>;
 
 fn textureDimensions_318ecc() {
   var res : i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_318ecc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_318ecc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_318ecc();
 }
diff --git a/test/intrinsics/gen/textureDimensions/340d06.wgsl b/test/intrinsics/gen/textureDimensions/340d06.wgsl
index 5f47447..71af9d0 100644
--- a/test/intrinsics/gen/textureDimensions/340d06.wgsl
+++ b/test/intrinsics/gen/textureDimensions/340d06.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<r32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<r32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<r32uint, write>) -> vec3<i32>
 fn textureDimensions_340d06() {
   var res: vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_340d06();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_340d06();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_340d06();
 }
diff --git a/test/intrinsics/gen/textureDimensions/340d06.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/340d06.wgsl.expected.wgsl
index 5c15e76..7ae21b4 100644
--- a/test/intrinsics/gen/textureDimensions/340d06.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/340d06.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<r32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<r32uint, write>;
 
 fn textureDimensions_340d06() {
   var res : vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_340d06();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_340d06();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_340d06();
 }
diff --git a/test/intrinsics/gen/textureDimensions/398e30.wgsl b/test/intrinsics/gen/textureDimensions/398e30.wgsl
index f29525a..0bdd487 100644
--- a/test/intrinsics/gen/textureDimensions/398e30.wgsl
+++ b/test/intrinsics/gen/textureDimensions/398e30.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba32uint, write>) -> vec2<i32>
 fn textureDimensions_398e30() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_398e30();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_398e30();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_398e30();
 }
diff --git a/test/intrinsics/gen/textureDimensions/398e30.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/398e30.wgsl.expected.wgsl
index 0b87c39..457ff70 100644
--- a/test/intrinsics/gen/textureDimensions/398e30.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/398e30.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba32uint, write>;
 
 fn textureDimensions_398e30() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_398e30();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_398e30();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_398e30();
 }
diff --git a/test/intrinsics/gen/textureDimensions/3a94ea.wgsl b/test/intrinsics/gen/textureDimensions/3a94ea.wgsl
index 137c650..eb60d1e 100644
--- a/test/intrinsics/gen/textureDimensions/3a94ea.wgsl
+++ b/test/intrinsics/gen/textureDimensions/3a94ea.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rg32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rg32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rg32uint, write>) -> vec2<i32>
 fn textureDimensions_3a94ea() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_3a94ea();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_3a94ea();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_3a94ea();
 }
diff --git a/test/intrinsics/gen/textureDimensions/3a94ea.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/3a94ea.wgsl.expected.wgsl
index 57ea93e..29d9579 100644
--- a/test/intrinsics/gen/textureDimensions/3a94ea.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/3a94ea.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rg32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rg32uint, write>;
 
 fn textureDimensions_3a94ea() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_3a94ea();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_3a94ea();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_3a94ea();
 }
diff --git a/test/intrinsics/gen/textureDimensions/3aca08.wgsl b/test/intrinsics/gen/textureDimensions/3aca08.wgsl
index edc753e..3d96944 100644
--- a/test/intrinsics/gen/textureDimensions/3aca08.wgsl
+++ b/test/intrinsics/gen/textureDimensions/3aca08.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rgba32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba32float, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba32float, write>) -> i32
 fn textureDimensions_3aca08() {
   var res: i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_3aca08();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_3aca08();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_3aca08();
 }
diff --git a/test/intrinsics/gen/textureDimensions/3aca08.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/3aca08.wgsl.expected.wgsl
index 2645276..ba8e34f 100644
--- a/test/intrinsics/gen/textureDimensions/3aca08.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/3aca08.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rgba32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rgba32float, write>;
 
 fn textureDimensions_3aca08() {
   var res : i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_3aca08();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_3aca08();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_3aca08();
 }
diff --git a/test/intrinsics/gen/textureDimensions/3c5ad8.wgsl b/test/intrinsics/gen/textureDimensions/3c5ad8.wgsl
index 9269479..e3837a8 100644
--- a/test/intrinsics/gen/textureDimensions/3c5ad8.wgsl
+++ b/test/intrinsics/gen/textureDimensions/3c5ad8.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rgba8sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8sint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba8sint, write>) -> vec2<i32>
 fn textureDimensions_3c5ad8() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_3c5ad8();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_3c5ad8();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_3c5ad8();
 }
diff --git a/test/intrinsics/gen/textureDimensions/3c5ad8.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/3c5ad8.wgsl.expected.wgsl
index 4df025d..dc42b19 100644
--- a/test/intrinsics/gen/textureDimensions/3c5ad8.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/3c5ad8.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rgba8sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rgba8sint, write>;
 
 fn textureDimensions_3c5ad8() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_3c5ad8();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_3c5ad8();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_3c5ad8();
 }
diff --git a/test/intrinsics/gen/textureDimensions/4152a6.wgsl b/test/intrinsics/gen/textureDimensions/4152a6.wgsl
index adb9641..f13d3ce 100644
--- a/test/intrinsics/gen/textureDimensions/4152a6.wgsl
+++ b/test/intrinsics/gen/textureDimensions/4152a6.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube_array<u32>;
+@group(1) @binding(0) var arg_0: texture_cube_array<u32>;
 
 // fn textureDimensions(texture: texture_cube_array<u32>) -> vec2<i32>
 fn textureDimensions_4152a6() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_4152a6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_4152a6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_4152a6();
 }
diff --git a/test/intrinsics/gen/textureDimensions/4152a6.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/4152a6.wgsl.expected.wgsl
index b21bb80..f9ec8d5 100644
--- a/test/intrinsics/gen/textureDimensions/4152a6.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/4152a6.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube_array<u32>;
+@group(1) @binding(0) var arg_0 : texture_cube_array<u32>;
 
 fn textureDimensions_4152a6() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_4152a6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_4152a6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_4152a6();
 }
diff --git a/test/intrinsics/gen/textureDimensions/423f99.wgsl b/test/intrinsics/gen/textureDimensions/423f99.wgsl
index 1b37e7e..d76008d 100644
--- a/test/intrinsics/gen/textureDimensions/423f99.wgsl
+++ b/test/intrinsics/gen/textureDimensions/423f99.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_1d<i32>;
+@group(1) @binding(0) var arg_0: texture_1d<i32>;
 
 // fn textureDimensions(texture: texture_1d<i32>) -> i32
 fn textureDimensions_423f99() {
   var res: i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_423f99();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_423f99();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_423f99();
 }
diff --git a/test/intrinsics/gen/textureDimensions/423f99.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/423f99.wgsl.expected.wgsl
index bb1db6b..b84b033 100644
--- a/test/intrinsics/gen/textureDimensions/423f99.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/423f99.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_1d<i32>;
+@group(1) @binding(0) var arg_0 : texture_1d<i32>;
 
 fn textureDimensions_423f99() {
   var res : i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_423f99();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_423f99();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_423f99();
 }
diff --git a/test/intrinsics/gen/textureDimensions/4267ee.wgsl b/test/intrinsics/gen/textureDimensions/4267ee.wgsl
index 159dff4..77143ec 100644
--- a/test/intrinsics/gen/textureDimensions/4267ee.wgsl
+++ b/test/intrinsics/gen/textureDimensions/4267ee.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rgba32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba32float, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba32float, write>) -> vec2<i32>
 fn textureDimensions_4267ee() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_4267ee();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_4267ee();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_4267ee();
 }
diff --git a/test/intrinsics/gen/textureDimensions/4267ee.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/4267ee.wgsl.expected.wgsl
index b421e45..909269f 100644
--- a/test/intrinsics/gen/textureDimensions/4267ee.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/4267ee.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rgba32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rgba32float, write>;
 
 fn textureDimensions_4267ee() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_4267ee();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_4267ee();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_4267ee();
 }
diff --git a/test/intrinsics/gen/textureDimensions/42d4e6.wgsl b/test/intrinsics/gen/textureDimensions/42d4e6.wgsl
index 0d81325..8638394 100644
--- a/test/intrinsics/gen/textureDimensions/42d4e6.wgsl
+++ b/test/intrinsics/gen/textureDimensions/42d4e6.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rgba8unorm, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8unorm, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba8unorm, write>) -> i32
 fn textureDimensions_42d4e6() {
   var res: i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_42d4e6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_42d4e6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_42d4e6();
 }
diff --git a/test/intrinsics/gen/textureDimensions/42d4e6.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/42d4e6.wgsl.expected.wgsl
index 8269c4b..bc98490 100644
--- a/test/intrinsics/gen/textureDimensions/42d4e6.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/42d4e6.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rgba8unorm, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rgba8unorm, write>;
 
 fn textureDimensions_42d4e6() {
   var res : i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_42d4e6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_42d4e6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_42d4e6();
 }
diff --git a/test/intrinsics/gen/textureDimensions/48cb89.wgsl b/test/intrinsics/gen/textureDimensions/48cb89.wgsl
index c9273a3..12414cd 100644
--- a/test/intrinsics/gen/textureDimensions/48cb89.wgsl
+++ b/test/intrinsics/gen/textureDimensions/48cb89.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rgba16float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba16float, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba16float, write>) -> vec2<i32>
 fn textureDimensions_48cb89() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_48cb89();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_48cb89();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_48cb89();
 }
diff --git a/test/intrinsics/gen/textureDimensions/48cb89.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/48cb89.wgsl.expected.wgsl
index 0aad3e7..cdc0578 100644
--- a/test/intrinsics/gen/textureDimensions/48cb89.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/48cb89.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rgba16float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rgba16float, write>;
 
 fn textureDimensions_48cb89() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_48cb89();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_48cb89();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_48cb89();
 }
diff --git a/test/intrinsics/gen/textureDimensions/49d274.wgsl b/test/intrinsics/gen/textureDimensions/49d274.wgsl
index 6443529..b4569f0 100644
--- a/test/intrinsics/gen/textureDimensions/49d274.wgsl
+++ b/test/intrinsics/gen/textureDimensions/49d274.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rg32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rg32sint, write>) -> vec2<i32>
 fn textureDimensions_49d274() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_49d274();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_49d274();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_49d274();
 }
diff --git a/test/intrinsics/gen/textureDimensions/49d274.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/49d274.wgsl.expected.wgsl
index a265975..00ebf36 100644
--- a/test/intrinsics/gen/textureDimensions/49d274.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/49d274.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rg32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rg32sint, write>;
 
 fn textureDimensions_49d274() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_49d274();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_49d274();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_49d274();
 }
diff --git a/test/intrinsics/gen/textureDimensions/4df9a8.wgsl b/test/intrinsics/gen/textureDimensions/4df9a8.wgsl
index e931a04..5c8a80e 100644
--- a/test/intrinsics/gen/textureDimensions/4df9a8.wgsl
+++ b/test/intrinsics/gen/textureDimensions/4df9a8.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rg32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rg32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rg32uint, write>) -> i32
 fn textureDimensions_4df9a8() {
   var res: i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_4df9a8();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_4df9a8();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_4df9a8();
 }
diff --git a/test/intrinsics/gen/textureDimensions/4df9a8.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/4df9a8.wgsl.expected.wgsl
index a4b1a79..4078aa2 100644
--- a/test/intrinsics/gen/textureDimensions/4df9a8.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/4df9a8.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rg32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rg32uint, write>;
 
 fn textureDimensions_4df9a8() {
   var res : i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_4df9a8();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_4df9a8();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_4df9a8();
 }
diff --git a/test/intrinsics/gen/textureDimensions/50a9ee.wgsl b/test/intrinsics/gen/textureDimensions/50a9ee.wgsl
index 67e2a6b..ab5dab1 100644
--- a/test/intrinsics/gen/textureDimensions/50a9ee.wgsl
+++ b/test/intrinsics/gen/textureDimensions/50a9ee.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube_array<f32>;
+@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
 
 // fn textureDimensions(texture: texture_cube_array<f32>, level: i32) -> vec2<i32>
 fn textureDimensions_50a9ee() {
   var res: vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_50a9ee();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_50a9ee();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_50a9ee();
 }
diff --git a/test/intrinsics/gen/textureDimensions/50a9ee.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/50a9ee.wgsl.expected.wgsl
index b8e312e..f6e1440 100644
--- a/test/intrinsics/gen/textureDimensions/50a9ee.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/50a9ee.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube_array<f32>;
+@group(1) @binding(0) var arg_0 : texture_cube_array<f32>;
 
 fn textureDimensions_50a9ee() {
   var res : vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_50a9ee();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_50a9ee();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_50a9ee();
 }
diff --git a/test/intrinsics/gen/textureDimensions/52045c.wgsl b/test/intrinsics/gen/textureDimensions/52045c.wgsl
index bf44ca6..25dfd9d 100644
--- a/test/intrinsics/gen/textureDimensions/52045c.wgsl
+++ b/test/intrinsics/gen/textureDimensions/52045c.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_1d<i32>;
+@group(1) @binding(0) var arg_0: texture_1d<i32>;
 
 // fn textureDimensions(texture: texture_1d<i32>, level: i32) -> i32
 fn textureDimensions_52045c() {
   var res: i32 = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_52045c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_52045c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_52045c();
 }
diff --git a/test/intrinsics/gen/textureDimensions/52045c.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/52045c.wgsl.expected.wgsl
index a031fe4..9df7fc2 100644
--- a/test/intrinsics/gen/textureDimensions/52045c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/52045c.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_1d<i32>;
+@group(1) @binding(0) var arg_0 : texture_1d<i32>;
 
 fn textureDimensions_52045c() {
   var res : i32 = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_52045c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_52045c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_52045c();
 }
diff --git a/test/intrinsics/gen/textureDimensions/55b23e.wgsl b/test/intrinsics/gen/textureDimensions/55b23e.wgsl
index e814f28..182bd4f 100644
--- a/test/intrinsics/gen/textureDimensions/55b23e.wgsl
+++ b/test/intrinsics/gen/textureDimensions/55b23e.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rg32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rg32float, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rg32float, write>) -> i32
 fn textureDimensions_55b23e() {
   var res: i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_55b23e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_55b23e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_55b23e();
 }
diff --git a/test/intrinsics/gen/textureDimensions/55b23e.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/55b23e.wgsl.expected.wgsl
index ec3c950..32b929c 100644
--- a/test/intrinsics/gen/textureDimensions/55b23e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/55b23e.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rg32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rg32float, write>;
 
 fn textureDimensions_55b23e() {
   var res : i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_55b23e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_55b23e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_55b23e();
 }
diff --git a/test/intrinsics/gen/textureDimensions/579629.wgsl b/test/intrinsics/gen/textureDimensions/579629.wgsl
index a6bce4c..3892c0a 100644
--- a/test/intrinsics/gen/textureDimensions/579629.wgsl
+++ b/test/intrinsics/gen/textureDimensions/579629.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_multisampled_2d<u32>;
+@group(1) @binding(0) var arg_0: texture_multisampled_2d<u32>;
 
 // fn textureDimensions(texture: texture_multisampled_2d<u32>) -> vec2<i32>
 fn textureDimensions_579629() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_579629();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_579629();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_579629();
 }
diff --git a/test/intrinsics/gen/textureDimensions/579629.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/579629.wgsl.expected.wgsl
index b3b0817..e157439 100644
--- a/test/intrinsics/gen/textureDimensions/579629.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/579629.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_multisampled_2d<u32>;
+@group(1) @binding(0) var arg_0 : texture_multisampled_2d<u32>;
 
 fn textureDimensions_579629() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_579629();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_579629();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_579629();
 }
diff --git a/test/intrinsics/gen/textureDimensions/57da0b.wgsl b/test/intrinsics/gen/textureDimensions/57da0b.wgsl
index e5b764e..92e1e1a 100644
--- a/test/intrinsics/gen/textureDimensions/57da0b.wgsl
+++ b/test/intrinsics/gen/textureDimensions/57da0b.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<r32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<r32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<r32uint, write>) -> i32
 fn textureDimensions_57da0b() {
   var res: i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_57da0b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_57da0b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_57da0b();
 }
diff --git a/test/intrinsics/gen/textureDimensions/57da0b.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/57da0b.wgsl.expected.wgsl
index 7d9bbff..f05ee1c 100644
--- a/test/intrinsics/gen/textureDimensions/57da0b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/57da0b.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<r32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<r32uint, write>;
 
 fn textureDimensions_57da0b() {
   var res : i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_57da0b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_57da0b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_57da0b();
 }
diff --git a/test/intrinsics/gen/textureDimensions/57e28f.wgsl b/test/intrinsics/gen/textureDimensions/57e28f.wgsl
index cabf1d2..b0cf7cc 100644
--- a/test/intrinsics/gen/textureDimensions/57e28f.wgsl
+++ b/test/intrinsics/gen/textureDimensions/57e28f.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_cube;
+@group(1) @binding(0) var arg_0: texture_depth_cube;
 
 // fn textureDimensions(texture: texture_depth_cube) -> vec2<i32>
 fn textureDimensions_57e28f() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_57e28f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_57e28f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_57e28f();
 }
diff --git a/test/intrinsics/gen/textureDimensions/57e28f.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/57e28f.wgsl.expected.wgsl
index 3c13313..3d25747 100644
--- a/test/intrinsics/gen/textureDimensions/57e28f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/57e28f.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_cube;
+@group(1) @binding(0) var arg_0 : texture_depth_cube;
 
 fn textureDimensions_57e28f() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_57e28f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_57e28f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_57e28f();
 }
diff --git a/test/intrinsics/gen/textureDimensions/58a515.wgsl b/test/intrinsics/gen/textureDimensions/58a515.wgsl
index 2444556..9cbebcb 100644
--- a/test/intrinsics/gen/textureDimensions/58a515.wgsl
+++ b/test/intrinsics/gen/textureDimensions/58a515.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba16float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16float, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba16float, write>) -> vec2<i32>
 fn textureDimensions_58a515() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_58a515();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_58a515();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_58a515();
 }
diff --git a/test/intrinsics/gen/textureDimensions/58a515.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/58a515.wgsl.expected.wgsl
index 2816570..c395b92 100644
--- a/test/intrinsics/gen/textureDimensions/58a515.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/58a515.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba16float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba16float, write>;
 
 fn textureDimensions_58a515() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_58a515();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_58a515();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_58a515();
 }
diff --git a/test/intrinsics/gen/textureDimensions/5985f3.wgsl b/test/intrinsics/gen/textureDimensions/5985f3.wgsl
index 5b7caaa..9c37e5f 100644
--- a/test/intrinsics/gen/textureDimensions/5985f3.wgsl
+++ b/test/intrinsics/gen/textureDimensions/5985f3.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba32sint, write>) -> vec2<i32>
 fn textureDimensions_5985f3() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_5985f3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_5985f3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_5985f3();
 }
diff --git a/test/intrinsics/gen/textureDimensions/5985f3.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/5985f3.wgsl.expected.wgsl
index 58c715b..cc73d08 100644
--- a/test/intrinsics/gen/textureDimensions/5985f3.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/5985f3.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba32sint, write>;
 
 fn textureDimensions_5985f3() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_5985f3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_5985f3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_5985f3();
 }
diff --git a/test/intrinsics/gen/textureDimensions/5caa5e.wgsl b/test/intrinsics/gen/textureDimensions/5caa5e.wgsl
index 310d15c..3701763 100644
--- a/test/intrinsics/gen/textureDimensions/5caa5e.wgsl
+++ b/test/intrinsics/gen/textureDimensions/5caa5e.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rgba32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba32uint, write>) -> i32
 fn textureDimensions_5caa5e() {
   var res: i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_5caa5e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_5caa5e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_5caa5e();
 }
diff --git a/test/intrinsics/gen/textureDimensions/5caa5e.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/5caa5e.wgsl.expected.wgsl
index f53a805..3f83443 100644
--- a/test/intrinsics/gen/textureDimensions/5caa5e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/5caa5e.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rgba32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rgba32uint, write>;
 
 fn textureDimensions_5caa5e() {
   var res : i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_5caa5e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_5caa5e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_5caa5e();
 }
diff --git a/test/intrinsics/gen/textureDimensions/5e295d.wgsl b/test/intrinsics/gen/textureDimensions/5e295d.wgsl
index 137a220..3e4cd1b 100644
--- a/test/intrinsics/gen/textureDimensions/5e295d.wgsl
+++ b/test/intrinsics/gen/textureDimensions/5e295d.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba16uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16uint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba16uint, write>) -> vec2<i32>
 fn textureDimensions_5e295d() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_5e295d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_5e295d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_5e295d();
 }
diff --git a/test/intrinsics/gen/textureDimensions/5e295d.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/5e295d.wgsl.expected.wgsl
index 3a032e6..d8bceb6 100644
--- a/test/intrinsics/gen/textureDimensions/5e295d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/5e295d.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba16uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba16uint, write>;
 
 fn textureDimensions_5e295d() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_5e295d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_5e295d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_5e295d();
 }
diff --git a/test/intrinsics/gen/textureDimensions/60bf54.wgsl b/test/intrinsics/gen/textureDimensions/60bf54.wgsl
index 13bc63e..fd0c02b 100644
--- a/test/intrinsics/gen/textureDimensions/60bf54.wgsl
+++ b/test/intrinsics/gen/textureDimensions/60bf54.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rg32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rg32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rg32sint, write>) -> vec3<i32>
 fn textureDimensions_60bf54() {
   var res: vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_60bf54();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_60bf54();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_60bf54();
 }
diff --git a/test/intrinsics/gen/textureDimensions/60bf54.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/60bf54.wgsl.expected.wgsl
index 2e20479..f9347de 100644
--- a/test/intrinsics/gen/textureDimensions/60bf54.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/60bf54.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rg32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rg32sint, write>;
 
 fn textureDimensions_60bf54() {
   var res : vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_60bf54();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_60bf54();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_60bf54();
 }
diff --git a/test/intrinsics/gen/textureDimensions/63f3cf.wgsl b/test/intrinsics/gen/textureDimensions/63f3cf.wgsl
index 2a23c47..7cab4b8 100644
--- a/test/intrinsics/gen/textureDimensions/63f3cf.wgsl
+++ b/test/intrinsics/gen/textureDimensions/63f3cf.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rg32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rg32float, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rg32float, write>) -> vec3<i32>
 fn textureDimensions_63f3cf() {
   var res: vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_63f3cf();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_63f3cf();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_63f3cf();
 }
diff --git a/test/intrinsics/gen/textureDimensions/63f3cf.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/63f3cf.wgsl.expected.wgsl
index 8586c98..43e5f15 100644
--- a/test/intrinsics/gen/textureDimensions/63f3cf.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/63f3cf.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rg32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rg32float, write>;
 
 fn textureDimensions_63f3cf() {
   var res : vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_63f3cf();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_63f3cf();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_63f3cf();
 }
diff --git a/test/intrinsics/gen/textureDimensions/68105c.wgsl b/test/intrinsics/gen/textureDimensions/68105c.wgsl
index e148614..9e15d77 100644
--- a/test/intrinsics/gen/textureDimensions/68105c.wgsl
+++ b/test/intrinsics/gen/textureDimensions/68105c.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rgba32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba32uint, write>) -> vec2<i32>
 fn textureDimensions_68105c() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_68105c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_68105c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_68105c();
 }
diff --git a/test/intrinsics/gen/textureDimensions/68105c.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/68105c.wgsl.expected.wgsl
index 07b857d..853c631 100644
--- a/test/intrinsics/gen/textureDimensions/68105c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/68105c.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rgba32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rgba32uint, write>;
 
 fn textureDimensions_68105c() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_68105c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_68105c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_68105c();
 }
diff --git a/test/intrinsics/gen/textureDimensions/686ef2.wgsl b/test/intrinsics/gen/textureDimensions/686ef2.wgsl
index 28f3f1a..6ed1d53 100644
--- a/test/intrinsics/gen/textureDimensions/686ef2.wgsl
+++ b/test/intrinsics/gen/textureDimensions/686ef2.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube<i32>;
+@group(1) @binding(0) var arg_0: texture_cube<i32>;
 
 // fn textureDimensions(texture: texture_cube<i32>, level: i32) -> vec2<i32>
 fn textureDimensions_686ef2() {
   var res: vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_686ef2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_686ef2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_686ef2();
 }
diff --git a/test/intrinsics/gen/textureDimensions/686ef2.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/686ef2.wgsl.expected.wgsl
index 2fcfe40..ba69786 100644
--- a/test/intrinsics/gen/textureDimensions/686ef2.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/686ef2.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube<i32>;
+@group(1) @binding(0) var arg_0 : texture_cube<i32>;
 
 fn textureDimensions_686ef2() {
   var res : vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_686ef2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_686ef2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_686ef2();
 }
diff --git a/test/intrinsics/gen/textureDimensions/6adac6.wgsl b/test/intrinsics/gen/textureDimensions/6adac6.wgsl
index ba2b0e3..f35d628 100644
--- a/test/intrinsics/gen/textureDimensions/6adac6.wgsl
+++ b/test/intrinsics/gen/textureDimensions/6adac6.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rgba32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba32sint, write>) -> i32
 fn textureDimensions_6adac6() {
   var res: i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_6adac6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_6adac6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_6adac6();
 }
diff --git a/test/intrinsics/gen/textureDimensions/6adac6.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/6adac6.wgsl.expected.wgsl
index 126bf44..c48c479 100644
--- a/test/intrinsics/gen/textureDimensions/6adac6.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/6adac6.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rgba32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rgba32sint, write>;
 
 fn textureDimensions_6adac6() {
   var res : i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_6adac6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_6adac6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_6adac6();
 }
diff --git a/test/intrinsics/gen/textureDimensions/6ec1b4.wgsl b/test/intrinsics/gen/textureDimensions/6ec1b4.wgsl
index 5c4e785..a8718fb 100644
--- a/test/intrinsics/gen/textureDimensions/6ec1b4.wgsl
+++ b/test/intrinsics/gen/textureDimensions/6ec1b4.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_3d<u32>;
+@group(1) @binding(0) var arg_0: texture_3d<u32>;
 
 // fn textureDimensions(texture: texture_3d<u32>) -> vec3<i32>
 fn textureDimensions_6ec1b4() {
   var res: vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_6ec1b4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_6ec1b4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_6ec1b4();
 }
diff --git a/test/intrinsics/gen/textureDimensions/6ec1b4.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/6ec1b4.wgsl.expected.wgsl
index db9a3ed..6cc7cc1 100644
--- a/test/intrinsics/gen/textureDimensions/6ec1b4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/6ec1b4.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_3d<u32>;
+@group(1) @binding(0) var arg_0 : texture_3d<u32>;
 
 fn textureDimensions_6ec1b4() {
   var res : vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_6ec1b4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_6ec1b4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_6ec1b4();
 }
diff --git a/test/intrinsics/gen/textureDimensions/6f0d79.wgsl b/test/intrinsics/gen/textureDimensions/6f0d79.wgsl
index f17c87e..395a6e0 100644
--- a/test/intrinsics/gen/textureDimensions/6f0d79.wgsl
+++ b/test/intrinsics/gen/textureDimensions/6f0d79.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba8snorm, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8snorm, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba8snorm, write>) -> vec2<i32>
 fn textureDimensions_6f0d79() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_6f0d79();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_6f0d79();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_6f0d79();
 }
diff --git a/test/intrinsics/gen/textureDimensions/6f0d79.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/6f0d79.wgsl.expected.wgsl
index 046b263..7b1f32c 100644
--- a/test/intrinsics/gen/textureDimensions/6f0d79.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/6f0d79.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba8snorm, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8snorm, write>;
 
 fn textureDimensions_6f0d79() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_6f0d79();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_6f0d79();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_6f0d79();
 }
diff --git a/test/intrinsics/gen/textureDimensions/702c53.wgsl b/test/intrinsics/gen/textureDimensions/702c53.wgsl
index 75321d7..401f1ea 100644
--- a/test/intrinsics/gen/textureDimensions/702c53.wgsl
+++ b/test/intrinsics/gen/textureDimensions/702c53.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rgba8unorm, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8unorm, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba8unorm, write>) -> vec2<i32>
 fn textureDimensions_702c53() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_702c53();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_702c53();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_702c53();
 }
diff --git a/test/intrinsics/gen/textureDimensions/702c53.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/702c53.wgsl.expected.wgsl
index 484d6be..27d3074 100644
--- a/test/intrinsics/gen/textureDimensions/702c53.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/702c53.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rgba8unorm, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rgba8unorm, write>;
 
 fn textureDimensions_702c53() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_702c53();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_702c53();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_702c53();
 }
diff --git a/test/intrinsics/gen/textureDimensions/72e5d6.wgsl b/test/intrinsics/gen/textureDimensions/72e5d6.wgsl
index cdf8de1..309d93f 100644
--- a/test/intrinsics/gen/textureDimensions/72e5d6.wgsl
+++ b/test/intrinsics/gen/textureDimensions/72e5d6.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d_array;
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
 
 // fn textureDimensions(texture: texture_depth_2d_array, level: i32) -> vec2<i32>
 fn textureDimensions_72e5d6() {
   var res: vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_72e5d6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_72e5d6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_72e5d6();
 }
diff --git a/test/intrinsics/gen/textureDimensions/72e5d6.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/72e5d6.wgsl.expected.wgsl
index 967f86a..b00bd04 100644
--- a/test/intrinsics/gen/textureDimensions/72e5d6.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/72e5d6.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d_array;
+@group(1) @binding(0) var arg_0 : texture_depth_2d_array;
 
 fn textureDimensions_72e5d6() {
   var res : vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_72e5d6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_72e5d6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_72e5d6();
 }
diff --git a/test/intrinsics/gen/textureDimensions/79df87.wgsl b/test/intrinsics/gen/textureDimensions/79df87.wgsl
index 43b59bf..4319d63 100644
--- a/test/intrinsics/gen/textureDimensions/79df87.wgsl
+++ b/test/intrinsics/gen/textureDimensions/79df87.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_1d<u32>;
+@group(1) @binding(0) var arg_0: texture_1d<u32>;
 
 // fn textureDimensions(texture: texture_1d<u32>, level: i32) -> i32
 fn textureDimensions_79df87() {
   var res: i32 = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_79df87();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_79df87();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_79df87();
 }
diff --git a/test/intrinsics/gen/textureDimensions/79df87.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/79df87.wgsl.expected.wgsl
index d604e48..63b16bf 100644
--- a/test/intrinsics/gen/textureDimensions/79df87.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/79df87.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_1d<u32>;
+@group(1) @binding(0) var arg_0 : texture_1d<u32>;
 
 fn textureDimensions_79df87() {
   var res : i32 = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_79df87();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_79df87();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_79df87();
 }
diff --git a/test/intrinsics/gen/textureDimensions/7bf826.wgsl b/test/intrinsics/gen/textureDimensions/7bf826.wgsl
index d32e468..5f5b47c 100644
--- a/test/intrinsics/gen/textureDimensions/7bf826.wgsl
+++ b/test/intrinsics/gen/textureDimensions/7bf826.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d_array;
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
 
 // fn textureDimensions(texture: texture_depth_2d_array) -> vec2<i32>
 fn textureDimensions_7bf826() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_7bf826();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_7bf826();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_7bf826();
 }
diff --git a/test/intrinsics/gen/textureDimensions/7bf826.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/7bf826.wgsl.expected.wgsl
index cf26867..50ddae7 100644
--- a/test/intrinsics/gen/textureDimensions/7bf826.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/7bf826.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d_array;
+@group(1) @binding(0) var arg_0 : texture_depth_2d_array;
 
 fn textureDimensions_7bf826() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_7bf826();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_7bf826();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_7bf826();
 }
diff --git a/test/intrinsics/gen/textureDimensions/7f5c2e.wgsl b/test/intrinsics/gen/textureDimensions/7f5c2e.wgsl
index 6a6865a..f74769c 100644
--- a/test/intrinsics/gen/textureDimensions/7f5c2e.wgsl
+++ b/test/intrinsics/gen/textureDimensions/7f5c2e.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rg32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rg32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rg32sint, write>) -> vec2<i32>
 fn textureDimensions_7f5c2e() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_7f5c2e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_7f5c2e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_7f5c2e();
 }
diff --git a/test/intrinsics/gen/textureDimensions/7f5c2e.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/7f5c2e.wgsl.expected.wgsl
index d85d357..0eecf68 100644
--- a/test/intrinsics/gen/textureDimensions/7f5c2e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/7f5c2e.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rg32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rg32sint, write>;
 
 fn textureDimensions_7f5c2e() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_7f5c2e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_7f5c2e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_7f5c2e();
 }
diff --git a/test/intrinsics/gen/textureDimensions/8028f3.wgsl b/test/intrinsics/gen/textureDimensions/8028f3.wgsl
index 2f8952c..ade160d 100644
--- a/test/intrinsics/gen/textureDimensions/8028f3.wgsl
+++ b/test/intrinsics/gen/textureDimensions/8028f3.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<r32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<r32float, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<r32float, write>) -> vec3<i32>
 fn textureDimensions_8028f3() {
   var res: vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_8028f3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_8028f3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_8028f3();
 }
diff --git a/test/intrinsics/gen/textureDimensions/8028f3.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/8028f3.wgsl.expected.wgsl
index 038913d..7ad5727 100644
--- a/test/intrinsics/gen/textureDimensions/8028f3.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/8028f3.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<r32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<r32float, write>;
 
 fn textureDimensions_8028f3() {
   var res : vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_8028f3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_8028f3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_8028f3();
 }
diff --git a/test/intrinsics/gen/textureDimensions/811679.wgsl b/test/intrinsics/gen/textureDimensions/811679.wgsl
index 8fa0f14..70b9a6c 100644
--- a/test/intrinsics/gen/textureDimensions/811679.wgsl
+++ b/test/intrinsics/gen/textureDimensions/811679.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rgba32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba32uint, write>) -> vec3<i32>
 fn textureDimensions_811679() {
   var res: vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_811679();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_811679();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_811679();
 }
diff --git a/test/intrinsics/gen/textureDimensions/811679.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/811679.wgsl.expected.wgsl
index 25c0214..154cdde 100644
--- a/test/intrinsics/gen/textureDimensions/811679.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/811679.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rgba32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rgba32uint, write>;
 
 fn textureDimensions_811679() {
   var res : vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_811679();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_811679();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_811679();
 }
diff --git a/test/intrinsics/gen/textureDimensions/820596.wgsl b/test/intrinsics/gen/textureDimensions/820596.wgsl
index f06ab5e..f17caf0 100644
--- a/test/intrinsics/gen/textureDimensions/820596.wgsl
+++ b/test/intrinsics/gen/textureDimensions/820596.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rg32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rg32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rg32uint, write>) -> vec3<i32>
 fn textureDimensions_820596() {
   var res: vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_820596();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_820596();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_820596();
 }
diff --git a/test/intrinsics/gen/textureDimensions/820596.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/820596.wgsl.expected.wgsl
index c448f30..93106d5 100644
--- a/test/intrinsics/gen/textureDimensions/820596.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/820596.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rg32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rg32uint, write>;
 
 fn textureDimensions_820596() {
   var res : vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_820596();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_820596();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_820596();
 }
diff --git a/test/intrinsics/gen/textureDimensions/83ee5a.wgsl b/test/intrinsics/gen/textureDimensions/83ee5a.wgsl
index caa919d..ff1a2bb 100644
--- a/test/intrinsics/gen/textureDimensions/83ee5a.wgsl
+++ b/test/intrinsics/gen/textureDimensions/83ee5a.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rgba32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba32sint, write>) -> vec2<i32>
 fn textureDimensions_83ee5a() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_83ee5a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_83ee5a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_83ee5a();
 }
diff --git a/test/intrinsics/gen/textureDimensions/83ee5a.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/83ee5a.wgsl.expected.wgsl
index fe3b545..3481e3c 100644
--- a/test/intrinsics/gen/textureDimensions/83ee5a.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/83ee5a.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rgba32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rgba32sint, write>;
 
 fn textureDimensions_83ee5a() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_83ee5a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_83ee5a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_83ee5a();
 }
diff --git a/test/intrinsics/gen/textureDimensions/85d556.wgsl b/test/intrinsics/gen/textureDimensions/85d556.wgsl
index 565c566..91d1ef8 100644
--- a/test/intrinsics/gen/textureDimensions/85d556.wgsl
+++ b/test/intrinsics/gen/textureDimensions/85d556.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d_array<f32>;
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
 
 // fn textureDimensions(texture: texture_2d_array<f32>, level: i32) -> vec2<i32>
 fn textureDimensions_85d556() {
   var res: vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_85d556();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_85d556();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_85d556();
 }
diff --git a/test/intrinsics/gen/textureDimensions/85d556.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/85d556.wgsl.expected.wgsl
index 66fc1a8..5045441 100644
--- a/test/intrinsics/gen/textureDimensions/85d556.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/85d556.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d_array<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d_array<f32>;
 
 fn textureDimensions_85d556() {
   var res : vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_85d556();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_85d556();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_85d556();
 }
diff --git a/test/intrinsics/gen/textureDimensions/88ad17.wgsl b/test/intrinsics/gen/textureDimensions/88ad17.wgsl
index 867ebde..7d9e6a8 100644
--- a/test/intrinsics/gen/textureDimensions/88ad17.wgsl
+++ b/test/intrinsics/gen/textureDimensions/88ad17.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube<u32>;
+@group(1) @binding(0) var arg_0: texture_cube<u32>;
 
 // fn textureDimensions(texture: texture_cube<u32>, level: i32) -> vec2<i32>
 fn textureDimensions_88ad17() {
   var res: vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_88ad17();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_88ad17();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_88ad17();
 }
diff --git a/test/intrinsics/gen/textureDimensions/88ad17.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/88ad17.wgsl.expected.wgsl
index b2cb369..85f6381 100644
--- a/test/intrinsics/gen/textureDimensions/88ad17.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/88ad17.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube<u32>;
+@group(1) @binding(0) var arg_0 : texture_cube<u32>;
 
 fn textureDimensions_88ad17() {
   var res : vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_88ad17();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_88ad17();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_88ad17();
 }
diff --git a/test/intrinsics/gen/textureDimensions/8aa4c4.wgsl b/test/intrinsics/gen/textureDimensions/8aa4c4.wgsl
index 90593b6..abe1be4 100644
--- a/test/intrinsics/gen/textureDimensions/8aa4c4.wgsl
+++ b/test/intrinsics/gen/textureDimensions/8aa4c4.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_3d<f32>;
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
 
 // fn textureDimensions(texture: texture_3d<f32>) -> vec3<i32>
 fn textureDimensions_8aa4c4() {
   var res: vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_8aa4c4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_8aa4c4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_8aa4c4();
 }
diff --git a/test/intrinsics/gen/textureDimensions/8aa4c4.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/8aa4c4.wgsl.expected.wgsl
index 787b378..3a59eb6 100644
--- a/test/intrinsics/gen/textureDimensions/8aa4c4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/8aa4c4.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_3d<f32>;
+@group(1) @binding(0) var arg_0 : texture_3d<f32>;
 
 fn textureDimensions_8aa4c4() {
   var res : vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_8aa4c4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_8aa4c4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_8aa4c4();
 }
diff --git a/test/intrinsics/gen/textureDimensions/8deb5e.wgsl b/test/intrinsics/gen/textureDimensions/8deb5e.wgsl
index 3aefda0..1e056c5 100644
--- a/test/intrinsics/gen/textureDimensions/8deb5e.wgsl
+++ b/test/intrinsics/gen/textureDimensions/8deb5e.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_3d<i32>;
+@group(1) @binding(0) var arg_0: texture_3d<i32>;
 
 // fn textureDimensions(texture: texture_3d<i32>) -> vec3<i32>
 fn textureDimensions_8deb5e() {
   var res: vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_8deb5e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_8deb5e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_8deb5e();
 }
diff --git a/test/intrinsics/gen/textureDimensions/8deb5e.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/8deb5e.wgsl.expected.wgsl
index 9daad0c..1f088c3 100644
--- a/test/intrinsics/gen/textureDimensions/8deb5e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/8deb5e.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_3d<i32>;
+@group(1) @binding(0) var arg_0 : texture_3d<i32>;
 
 fn textureDimensions_8deb5e() {
   var res : vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_8deb5e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_8deb5e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_8deb5e();
 }
diff --git a/test/intrinsics/gen/textureDimensions/8f20bf.wgsl b/test/intrinsics/gen/textureDimensions/8f20bf.wgsl
index 87f2d27..11b2d27 100644
--- a/test/intrinsics/gen/textureDimensions/8f20bf.wgsl
+++ b/test/intrinsics/gen/textureDimensions/8f20bf.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube_array<f32>;
+@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
 
 // fn textureDimensions(texture: texture_cube_array<f32>) -> vec2<i32>
 fn textureDimensions_8f20bf() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_8f20bf();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_8f20bf();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_8f20bf();
 }
diff --git a/test/intrinsics/gen/textureDimensions/8f20bf.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/8f20bf.wgsl.expected.wgsl
index 4908444..e299daf 100644
--- a/test/intrinsics/gen/textureDimensions/8f20bf.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/8f20bf.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube_array<f32>;
+@group(1) @binding(0) var arg_0 : texture_cube_array<f32>;
 
 fn textureDimensions_8f20bf() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_8f20bf();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_8f20bf();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_8f20bf();
 }
diff --git a/test/intrinsics/gen/textureDimensions/8fca0f.wgsl b/test/intrinsics/gen/textureDimensions/8fca0f.wgsl
index 336af29..e86c393 100644
--- a/test/intrinsics/gen/textureDimensions/8fca0f.wgsl
+++ b/test/intrinsics/gen/textureDimensions/8fca0f.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rgba32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba32float, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba32float, write>) -> vec3<i32>
 fn textureDimensions_8fca0f() {
   var res: vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_8fca0f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_8fca0f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_8fca0f();
 }
diff --git a/test/intrinsics/gen/textureDimensions/8fca0f.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/8fca0f.wgsl.expected.wgsl
index eee5870..4599b2e 100644
--- a/test/intrinsics/gen/textureDimensions/8fca0f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/8fca0f.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rgba32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rgba32float, write>;
 
 fn textureDimensions_8fca0f() {
   var res : vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_8fca0f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_8fca0f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_8fca0f();
 }
diff --git a/test/intrinsics/gen/textureDimensions/90340b.wgsl b/test/intrinsics/gen/textureDimensions/90340b.wgsl
index 619bdb9..3528ecf 100644
--- a/test/intrinsics/gen/textureDimensions/90340b.wgsl
+++ b/test/intrinsics/gen/textureDimensions/90340b.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_cube_array;
+@group(1) @binding(0) var arg_0: texture_depth_cube_array;
 
 // fn textureDimensions(texture: texture_depth_cube_array) -> vec2<i32>
 fn textureDimensions_90340b() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_90340b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_90340b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_90340b();
 }
diff --git a/test/intrinsics/gen/textureDimensions/90340b.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/90340b.wgsl.expected.wgsl
index d8668d3..2addbf1 100644
--- a/test/intrinsics/gen/textureDimensions/90340b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/90340b.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_cube_array;
+@group(1) @binding(0) var arg_0 : texture_depth_cube_array;
 
 fn textureDimensions_90340b() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_90340b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_90340b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_90340b();
 }
diff --git a/test/intrinsics/gen/textureDimensions/9042ab.wgsl b/test/intrinsics/gen/textureDimensions/9042ab.wgsl
index 549dc91..6a02da1 100644
--- a/test/intrinsics/gen/textureDimensions/9042ab.wgsl
+++ b/test/intrinsics/gen/textureDimensions/9042ab.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rg32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rg32uint, write>) -> vec2<i32>
 fn textureDimensions_9042ab() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_9042ab();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_9042ab();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_9042ab();
 }
diff --git a/test/intrinsics/gen/textureDimensions/9042ab.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/9042ab.wgsl.expected.wgsl
index 49e1251..a2d8666 100644
--- a/test/intrinsics/gen/textureDimensions/9042ab.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/9042ab.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rg32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rg32uint, write>;
 
 fn textureDimensions_9042ab() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_9042ab();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_9042ab();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_9042ab();
 }
diff --git a/test/intrinsics/gen/textureDimensions/9393b0.wgsl b/test/intrinsics/gen/textureDimensions/9393b0.wgsl
index 0fd7903..0ce4834 100644
--- a/test/intrinsics/gen/textureDimensions/9393b0.wgsl
+++ b/test/intrinsics/gen/textureDimensions/9393b0.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_cube;
+@group(1) @binding(0) var arg_0: texture_depth_cube;
 
 // fn textureDimensions(texture: texture_depth_cube, level: i32) -> vec2<i32>
 fn textureDimensions_9393b0() {
   var res: vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_9393b0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_9393b0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_9393b0();
 }
diff --git a/test/intrinsics/gen/textureDimensions/9393b0.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/9393b0.wgsl.expected.wgsl
index ddf6ecd..caacfdc 100644
--- a/test/intrinsics/gen/textureDimensions/9393b0.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/9393b0.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_cube;
+@group(1) @binding(0) var arg_0 : texture_depth_cube;
 
 fn textureDimensions_9393b0() {
   var res : vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_9393b0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_9393b0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_9393b0();
 }
diff --git a/test/intrinsics/gen/textureDimensions/939fdb.wgsl b/test/intrinsics/gen/textureDimensions/939fdb.wgsl
index 3e5b64d..d29eec0 100644
--- a/test/intrinsics/gen/textureDimensions/939fdb.wgsl
+++ b/test/intrinsics/gen/textureDimensions/939fdb.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d;
+@group(1) @binding(0) var arg_0: texture_depth_2d;
 
 // fn textureDimensions(texture: texture_depth_2d) -> vec2<i32>
 fn textureDimensions_939fdb() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_939fdb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_939fdb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_939fdb();
 }
diff --git a/test/intrinsics/gen/textureDimensions/939fdb.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/939fdb.wgsl.expected.wgsl
index 3884061..12cc535 100644
--- a/test/intrinsics/gen/textureDimensions/939fdb.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/939fdb.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_2d;
 
 fn textureDimensions_939fdb() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_939fdb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_939fdb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_939fdb();
 }
diff --git a/test/intrinsics/gen/textureDimensions/962dcd.wgsl b/test/intrinsics/gen/textureDimensions/962dcd.wgsl
index 5ffeb6e..8831eb6 100644
--- a/test/intrinsics/gen/textureDimensions/962dcd.wgsl
+++ b/test/intrinsics/gen/textureDimensions/962dcd.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube<i32>;
+@group(1) @binding(0) var arg_0: texture_cube<i32>;
 
 // fn textureDimensions(texture: texture_cube<i32>) -> vec2<i32>
 fn textureDimensions_962dcd() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_962dcd();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_962dcd();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_962dcd();
 }
diff --git a/test/intrinsics/gen/textureDimensions/962dcd.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/962dcd.wgsl.expected.wgsl
index e6edbf5..8c1d256 100644
--- a/test/intrinsics/gen/textureDimensions/962dcd.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/962dcd.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube<i32>;
+@group(1) @binding(0) var arg_0 : texture_cube<i32>;
 
 fn textureDimensions_962dcd() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_962dcd();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_962dcd();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_962dcd();
 }
diff --git a/test/intrinsics/gen/textureDimensions/9abfe5.wgsl b/test/intrinsics/gen/textureDimensions/9abfe5.wgsl
index 10553f9..463f897 100644
--- a/test/intrinsics/gen/textureDimensions/9abfe5.wgsl
+++ b/test/intrinsics/gen/textureDimensions/9abfe5.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32float, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba32float, write>) -> vec2<i32>
 fn textureDimensions_9abfe5() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_9abfe5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_9abfe5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_9abfe5();
 }
diff --git a/test/intrinsics/gen/textureDimensions/9abfe5.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/9abfe5.wgsl.expected.wgsl
index 8256199..fd97994 100644
--- a/test/intrinsics/gen/textureDimensions/9abfe5.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/9abfe5.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba32float, write>;
 
 fn textureDimensions_9abfe5() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_9abfe5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_9abfe5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_9abfe5();
 }
diff --git a/test/intrinsics/gen/textureDimensions/9c9c57.wgsl b/test/intrinsics/gen/textureDimensions/9c9c57.wgsl
index edd2e9e..62bdec3 100644
--- a/test/intrinsics/gen/textureDimensions/9c9c57.wgsl
+++ b/test/intrinsics/gen/textureDimensions/9c9c57.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d_array<i32>;
+@group(1) @binding(0) var arg_0: texture_2d_array<i32>;
 
 // fn textureDimensions(texture: texture_2d_array<i32>, level: i32) -> vec2<i32>
 fn textureDimensions_9c9c57() {
   var res: vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_9c9c57();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_9c9c57();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_9c9c57();
 }
diff --git a/test/intrinsics/gen/textureDimensions/9c9c57.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/9c9c57.wgsl.expected.wgsl
index 4ee4826..ff8d321 100644
--- a/test/intrinsics/gen/textureDimensions/9c9c57.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/9c9c57.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d_array<i32>;
+@group(1) @binding(0) var arg_0 : texture_2d_array<i32>;
 
 fn textureDimensions_9c9c57() {
   var res : vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_9c9c57();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_9c9c57();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_9c9c57();
 }
diff --git a/test/intrinsics/gen/textureDimensions/9da9e2.wgsl b/test/intrinsics/gen/textureDimensions/9da9e2.wgsl
index 0493107..6c82fcc 100644
--- a/test/intrinsics/gen/textureDimensions/9da9e2.wgsl
+++ b/test/intrinsics/gen/textureDimensions/9da9e2.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rgba8sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8sint, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba8sint, write>) -> i32
 fn textureDimensions_9da9e2() {
   var res: i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_9da9e2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_9da9e2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_9da9e2();
 }
diff --git a/test/intrinsics/gen/textureDimensions/9da9e2.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/9da9e2.wgsl.expected.wgsl
index adf06c2..3e1f941 100644
--- a/test/intrinsics/gen/textureDimensions/9da9e2.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/9da9e2.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rgba8sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rgba8sint, write>;
 
 fn textureDimensions_9da9e2() {
   var res : i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_9da9e2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_9da9e2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_9da9e2();
 }
diff --git a/test/intrinsics/gen/textureDimensions/9eb8d8.wgsl b/test/intrinsics/gen/textureDimensions/9eb8d8.wgsl
index 76733f7..09afe70 100644
--- a/test/intrinsics/gen/textureDimensions/9eb8d8.wgsl
+++ b/test/intrinsics/gen/textureDimensions/9eb8d8.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<r32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<r32uint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<r32uint, write>) -> vec2<i32>
 fn textureDimensions_9eb8d8() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_9eb8d8();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_9eb8d8();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_9eb8d8();
 }
diff --git a/test/intrinsics/gen/textureDimensions/9eb8d8.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/9eb8d8.wgsl.expected.wgsl
index d530b91..58bc54f 100644
--- a/test/intrinsics/gen/textureDimensions/9eb8d8.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/9eb8d8.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<r32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<r32uint, write>;
 
 fn textureDimensions_9eb8d8() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_9eb8d8();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_9eb8d8();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_9eb8d8();
 }
diff --git a/test/intrinsics/gen/textureDimensions/9f8e46.wgsl b/test/intrinsics/gen/textureDimensions/9f8e46.wgsl
index 6eb973a..1892e82 100644
--- a/test/intrinsics/gen/textureDimensions/9f8e46.wgsl
+++ b/test/intrinsics/gen/textureDimensions/9f8e46.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d<f32>;
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
 
 // fn textureDimensions(texture: texture_2d<f32>) -> vec2<i32>
 fn textureDimensions_9f8e46() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_9f8e46();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_9f8e46();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_9f8e46();
 }
diff --git a/test/intrinsics/gen/textureDimensions/9f8e46.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/9f8e46.wgsl.expected.wgsl
index b4eaffd..df7b1a7 100644
--- a/test/intrinsics/gen/textureDimensions/9f8e46.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/9f8e46.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d<f32>;
 
 fn textureDimensions_9f8e46() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_9f8e46();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_9f8e46();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_9f8e46();
 }
diff --git a/test/intrinsics/gen/textureDimensions/a01845.wgsl b/test/intrinsics/gen/textureDimensions/a01845.wgsl
index 85a6007..3b7b193 100644
--- a/test/intrinsics/gen/textureDimensions/a01845.wgsl
+++ b/test/intrinsics/gen/textureDimensions/a01845.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_cube_array;
+@group(1) @binding(0) var arg_0: texture_depth_cube_array;
 
 // fn textureDimensions(texture: texture_depth_cube_array, level: i32) -> vec2<i32>
 fn textureDimensions_a01845() {
   var res: vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_a01845();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_a01845();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_a01845();
 }
diff --git a/test/intrinsics/gen/textureDimensions/a01845.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/a01845.wgsl.expected.wgsl
index ab0f9eb..9f7a0da 100644
--- a/test/intrinsics/gen/textureDimensions/a01845.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/a01845.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_cube_array;
+@group(1) @binding(0) var arg_0 : texture_depth_cube_array;
 
 fn textureDimensions_a01845() {
   var res : vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_a01845();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_a01845();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_a01845();
 }
diff --git a/test/intrinsics/gen/textureDimensions/a7d565.wgsl b/test/intrinsics/gen/textureDimensions/a7d565.wgsl
index b571c60..88779cb 100644
--- a/test/intrinsics/gen/textureDimensions/a7d565.wgsl
+++ b/test/intrinsics/gen/textureDimensions/a7d565.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_1d<u32>;
+@group(1) @binding(0) var arg_0: texture_1d<u32>;
 
 // fn textureDimensions(texture: texture_1d<u32>) -> i32
 fn textureDimensions_a7d565() {
   var res: i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_a7d565();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_a7d565();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_a7d565();
 }
diff --git a/test/intrinsics/gen/textureDimensions/a7d565.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/a7d565.wgsl.expected.wgsl
index 73e5bfd..4cd2c97 100644
--- a/test/intrinsics/gen/textureDimensions/a7d565.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/a7d565.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_1d<u32>;
+@group(1) @binding(0) var arg_0 : texture_1d<u32>;
 
 fn textureDimensions_a7d565() {
   var res : i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_a7d565();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_a7d565();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_a7d565();
 }
diff --git a/test/intrinsics/gen/textureDimensions/a863f2.wgsl b/test/intrinsics/gen/textureDimensions/a863f2.wgsl
index 8be9e9a..61b668c 100644
--- a/test/intrinsics/gen/textureDimensions/a863f2.wgsl
+++ b/test/intrinsics/gen/textureDimensions/a863f2.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<r32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<r32float, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<r32float, write>) -> i32
 fn textureDimensions_a863f2() {
   var res: i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_a863f2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_a863f2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_a863f2();
 }
diff --git a/test/intrinsics/gen/textureDimensions/a863f2.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/a863f2.wgsl.expected.wgsl
index 820ab3b..257be4e 100644
--- a/test/intrinsics/gen/textureDimensions/a863f2.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/a863f2.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<r32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<r32float, write>;
 
 fn textureDimensions_a863f2() {
   var res : i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_a863f2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_a863f2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_a863f2();
 }
diff --git a/test/intrinsics/gen/textureDimensions/a9c9c1.wgsl b/test/intrinsics/gen/textureDimensions/a9c9c1.wgsl
index a2f5e33..e10dcd1 100644
--- a/test/intrinsics/gen/textureDimensions/a9c9c1.wgsl
+++ b/test/intrinsics/gen/textureDimensions/a9c9c1.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube<f32>;
+@group(1) @binding(0) var arg_0: texture_cube<f32>;
 
 // fn textureDimensions(texture: texture_cube<f32>, level: i32) -> vec2<i32>
 fn textureDimensions_a9c9c1() {
   var res: vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_a9c9c1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_a9c9c1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_a9c9c1();
 }
diff --git a/test/intrinsics/gen/textureDimensions/a9c9c1.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/a9c9c1.wgsl.expected.wgsl
index 754fc31..e4125c9 100644
--- a/test/intrinsics/gen/textureDimensions/a9c9c1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/a9c9c1.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube<f32>;
+@group(1) @binding(0) var arg_0 : texture_cube<f32>;
 
 fn textureDimensions_a9c9c1() {
   var res : vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_a9c9c1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_a9c9c1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_a9c9c1();
 }
diff --git a/test/intrinsics/gen/textureDimensions/b0e16d.wgsl b/test/intrinsics/gen/textureDimensions/b0e16d.wgsl
index b4a35f0..a1cc174 100644
--- a/test/intrinsics/gen/textureDimensions/b0e16d.wgsl
+++ b/test/intrinsics/gen/textureDimensions/b0e16d.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d<i32>;
+@group(1) @binding(0) var arg_0: texture_2d<i32>;
 
 // fn textureDimensions(texture: texture_2d<i32>, level: i32) -> vec2<i32>
 fn textureDimensions_b0e16d() {
   var res: vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_b0e16d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_b0e16d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_b0e16d();
 }
diff --git a/test/intrinsics/gen/textureDimensions/b0e16d.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/b0e16d.wgsl.expected.wgsl
index 665a62b..1bd9327 100644
--- a/test/intrinsics/gen/textureDimensions/b0e16d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/b0e16d.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d<i32>;
+@group(1) @binding(0) var arg_0 : texture_2d<i32>;
 
 fn textureDimensions_b0e16d() {
   var res : vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_b0e16d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_b0e16d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_b0e16d();
 }
diff --git a/test/intrinsics/gen/textureDimensions/b3c954.wgsl b/test/intrinsics/gen/textureDimensions/b3c954.wgsl
index 82f5c1f..bdd8173 100644
--- a/test/intrinsics/gen/textureDimensions/b3c954.wgsl
+++ b/test/intrinsics/gen/textureDimensions/b3c954.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube<u32>;
+@group(1) @binding(0) var arg_0: texture_cube<u32>;
 
 // fn textureDimensions(texture: texture_cube<u32>) -> vec2<i32>
 fn textureDimensions_b3c954() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_b3c954();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_b3c954();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_b3c954();
 }
diff --git a/test/intrinsics/gen/textureDimensions/b3c954.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/b3c954.wgsl.expected.wgsl
index 8f79cc0..de3b872 100644
--- a/test/intrinsics/gen/textureDimensions/b3c954.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/b3c954.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube<u32>;
+@group(1) @binding(0) var arg_0 : texture_cube<u32>;
 
 fn textureDimensions_b3c954() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_b3c954();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_b3c954();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_b3c954();
 }
diff --git a/test/intrinsics/gen/textureDimensions/b3e407.wgsl b/test/intrinsics/gen/textureDimensions/b3e407.wgsl
index e190837..8c7d95c 100644
--- a/test/intrinsics/gen/textureDimensions/b3e407.wgsl
+++ b/test/intrinsics/gen/textureDimensions/b3e407.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_1d<f32>;
+@group(1) @binding(0) var arg_0: texture_1d<f32>;
 
 // fn textureDimensions(texture: texture_1d<f32>, level: i32) -> i32
 fn textureDimensions_b3e407() {
   var res: i32 = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_b3e407();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_b3e407();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_b3e407();
 }
diff --git a/test/intrinsics/gen/textureDimensions/b3e407.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/b3e407.wgsl.expected.wgsl
index f39a1ad..8ebb58e 100644
--- a/test/intrinsics/gen/textureDimensions/b3e407.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/b3e407.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_1d<f32>;
+@group(1) @binding(0) var arg_0 : texture_1d<f32>;
 
 fn textureDimensions_b3e407() {
   var res : i32 = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_b3e407();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_b3e407();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_b3e407();
 }
diff --git a/test/intrinsics/gen/textureDimensions/b91240.wgsl b/test/intrinsics/gen/textureDimensions/b91240.wgsl
index e1f304c..baf2591 100644
--- a/test/intrinsics/gen/textureDimensions/b91240.wgsl
+++ b/test/intrinsics/gen/textureDimensions/b91240.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rgba8snorm, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8snorm, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba8snorm, write>) -> vec2<i32>
 fn textureDimensions_b91240() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_b91240();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_b91240();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_b91240();
 }
diff --git a/test/intrinsics/gen/textureDimensions/b91240.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/b91240.wgsl.expected.wgsl
index 62d79c4..105338f 100644
--- a/test/intrinsics/gen/textureDimensions/b91240.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/b91240.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rgba8snorm, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rgba8snorm, write>;
 
 fn textureDimensions_b91240() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_b91240();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_b91240();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_b91240();
 }
diff --git a/test/intrinsics/gen/textureDimensions/ba1481.wgsl b/test/intrinsics/gen/textureDimensions/ba1481.wgsl
index c684259..c372ea1 100644
--- a/test/intrinsics/gen/textureDimensions/ba1481.wgsl
+++ b/test/intrinsics/gen/textureDimensions/ba1481.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_external;
+@group(1) @binding(0) var arg_0: texture_external;
 
 // fn textureDimensions(texture: texture_external) -> vec2<i32>
 fn textureDimensions_ba1481() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_ba1481();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_ba1481();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_ba1481();
 }
diff --git a/test/intrinsics/gen/textureDimensions/ba1481.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/ba1481.wgsl.expected.wgsl
index 2ea9581..0bcf4af 100644
--- a/test/intrinsics/gen/textureDimensions/ba1481.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/ba1481.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_external;
+@group(1) @binding(0) var arg_0 : texture_external;
 
 fn textureDimensions_ba1481() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_ba1481();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_ba1481();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_ba1481();
 }
diff --git a/test/intrinsics/gen/textureDimensions/bb3dde.wgsl b/test/intrinsics/gen/textureDimensions/bb3dde.wgsl
index b284560..5519317 100644
--- a/test/intrinsics/gen/textureDimensions/bb3dde.wgsl
+++ b/test/intrinsics/gen/textureDimensions/bb3dde.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rgba32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba32sint, write>) -> vec3<i32>
 fn textureDimensions_bb3dde() {
   var res: vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_bb3dde();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_bb3dde();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_bb3dde();
 }
diff --git a/test/intrinsics/gen/textureDimensions/bb3dde.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/bb3dde.wgsl.expected.wgsl
index 006743e..005cae6 100644
--- a/test/intrinsics/gen/textureDimensions/bb3dde.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/bb3dde.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rgba32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rgba32sint, write>;
 
 fn textureDimensions_bb3dde() {
   var res : vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_bb3dde();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_bb3dde();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_bb3dde();
 }
diff --git a/test/intrinsics/gen/textureDimensions/c30e75.wgsl b/test/intrinsics/gen/textureDimensions/c30e75.wgsl
index 1cffed5..275a7ca 100644
--- a/test/intrinsics/gen/textureDimensions/c30e75.wgsl
+++ b/test/intrinsics/gen/textureDimensions/c30e75.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<r32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<r32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<r32sint, write>) -> vec2<i32>
 fn textureDimensions_c30e75() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_c30e75();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_c30e75();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_c30e75();
 }
diff --git a/test/intrinsics/gen/textureDimensions/c30e75.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/c30e75.wgsl.expected.wgsl
index a73590e..ecf60b5 100644
--- a/test/intrinsics/gen/textureDimensions/c30e75.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/c30e75.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<r32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<r32sint, write>;
 
 fn textureDimensions_c30e75() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_c30e75();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_c30e75();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_c30e75();
 }
diff --git a/test/intrinsics/gen/textureDimensions/c7943d.wgsl b/test/intrinsics/gen/textureDimensions/c7943d.wgsl
index 887906f..98ad655 100644
--- a/test/intrinsics/gen/textureDimensions/c7943d.wgsl
+++ b/test/intrinsics/gen/textureDimensions/c7943d.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rgba8uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8uint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<rgba8uint, write>) -> vec2<i32>
 fn textureDimensions_c7943d() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_c7943d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_c7943d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_c7943d();
 }
diff --git a/test/intrinsics/gen/textureDimensions/c7943d.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/c7943d.wgsl.expected.wgsl
index fb7bb2b..d664f33 100644
--- a/test/intrinsics/gen/textureDimensions/c7943d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/c7943d.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rgba8uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rgba8uint, write>;
 
 fn textureDimensions_c7943d() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_c7943d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_c7943d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_c7943d();
 }
diff --git a/test/intrinsics/gen/textureDimensions/cc968c.wgsl b/test/intrinsics/gen/textureDimensions/cc968c.wgsl
index 9bdef45..2c32bb9 100644
--- a/test/intrinsics/gen/textureDimensions/cc968c.wgsl
+++ b/test/intrinsics/gen/textureDimensions/cc968c.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rg32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rg32sint, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rg32sint, write>) -> i32
 fn textureDimensions_cc968c() {
   var res: i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_cc968c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_cc968c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_cc968c();
 }
diff --git a/test/intrinsics/gen/textureDimensions/cc968c.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/cc968c.wgsl.expected.wgsl
index 2fc8088..8198585 100644
--- a/test/intrinsics/gen/textureDimensions/cc968c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/cc968c.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rg32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rg32sint, write>;
 
 fn textureDimensions_cc968c() {
   var res : i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_cc968c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_cc968c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_cc968c();
 }
diff --git a/test/intrinsics/gen/textureDimensions/cccc8f.wgsl b/test/intrinsics/gen/textureDimensions/cccc8f.wgsl
index 887baef..71072cc 100644
--- a/test/intrinsics/gen/textureDimensions/cccc8f.wgsl
+++ b/test/intrinsics/gen/textureDimensions/cccc8f.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rgba8snorm, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8snorm, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba8snorm, write>) -> i32
 fn textureDimensions_cccc8f() {
   var res: i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_cccc8f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_cccc8f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_cccc8f();
 }
diff --git a/test/intrinsics/gen/textureDimensions/cccc8f.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/cccc8f.wgsl.expected.wgsl
index 5d2c26d..a4d44f0 100644
--- a/test/intrinsics/gen/textureDimensions/cccc8f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/cccc8f.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rgba8snorm, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rgba8snorm, write>;
 
 fn textureDimensions_cccc8f() {
   var res : i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_cccc8f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_cccc8f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_cccc8f();
 }
diff --git a/test/intrinsics/gen/textureDimensions/cd76a7.wgsl b/test/intrinsics/gen/textureDimensions/cd76a7.wgsl
index b6bcb47..79da9f1 100644
--- a/test/intrinsics/gen/textureDimensions/cd76a7.wgsl
+++ b/test/intrinsics/gen/textureDimensions/cd76a7.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rgba8unorm, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8unorm, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba8unorm, write>) -> vec3<i32>
 fn textureDimensions_cd76a7() {
   var res: vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_cd76a7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_cd76a7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_cd76a7();
 }
diff --git a/test/intrinsics/gen/textureDimensions/cd76a7.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/cd76a7.wgsl.expected.wgsl
index 99d7eac..139070f 100644
--- a/test/intrinsics/gen/textureDimensions/cd76a7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/cd76a7.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rgba8unorm, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rgba8unorm, write>;
 
 fn textureDimensions_cd76a7() {
   var res : vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_cd76a7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_cd76a7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_cd76a7();
 }
diff --git a/test/intrinsics/gen/textureDimensions/cdf473.wgsl b/test/intrinsics/gen/textureDimensions/cdf473.wgsl
index aad5966..25ceca3 100644
--- a/test/intrinsics/gen/textureDimensions/cdf473.wgsl
+++ b/test/intrinsics/gen/textureDimensions/cdf473.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba16sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16sint, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rgba16sint, write>) -> vec2<i32>
 fn textureDimensions_cdf473() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_cdf473();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_cdf473();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_cdf473();
 }
diff --git a/test/intrinsics/gen/textureDimensions/cdf473.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/cdf473.wgsl.expected.wgsl
index 4b41e3c..31373c0 100644
--- a/test/intrinsics/gen/textureDimensions/cdf473.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/cdf473.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba16sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba16sint, write>;
 
 fn textureDimensions_cdf473() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_cdf473();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_cdf473();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_cdf473();
 }
diff --git a/test/intrinsics/gen/textureDimensions/cec841.wgsl b/test/intrinsics/gen/textureDimensions/cec841.wgsl
index be24ab4..0710769 100644
--- a/test/intrinsics/gen/textureDimensions/cec841.wgsl
+++ b/test/intrinsics/gen/textureDimensions/cec841.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d_array<f32>;
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
 
 // fn textureDimensions(texture: texture_2d_array<f32>) -> vec2<i32>
 fn textureDimensions_cec841() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_cec841();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_cec841();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_cec841();
 }
diff --git a/test/intrinsics/gen/textureDimensions/cec841.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/cec841.wgsl.expected.wgsl
index 0ae00a7..d1667a0 100644
--- a/test/intrinsics/gen/textureDimensions/cec841.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/cec841.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d_array<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d_array<f32>;
 
 fn textureDimensions_cec841() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_cec841();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_cec841();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_cec841();
 }
diff --git a/test/intrinsics/gen/textureDimensions/cf7e43.wgsl b/test/intrinsics/gen/textureDimensions/cf7e43.wgsl
index e855d3f..2768cce 100644
--- a/test/intrinsics/gen/textureDimensions/cf7e43.wgsl
+++ b/test/intrinsics/gen/textureDimensions/cf7e43.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rgba8snorm, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8snorm, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba8snorm, write>) -> vec3<i32>
 fn textureDimensions_cf7e43() {
   var res: vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_cf7e43();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_cf7e43();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_cf7e43();
 }
diff --git a/test/intrinsics/gen/textureDimensions/cf7e43.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/cf7e43.wgsl.expected.wgsl
index ea45fb6..fd5550b 100644
--- a/test/intrinsics/gen/textureDimensions/cf7e43.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/cf7e43.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rgba8snorm, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rgba8snorm, write>;
 
 fn textureDimensions_cf7e43() {
   var res : vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_cf7e43();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_cf7e43();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_cf7e43();
 }
diff --git a/test/intrinsics/gen/textureDimensions/d125bc.wgsl b/test/intrinsics/gen/textureDimensions/d125bc.wgsl
index 3f76480..e380cb2 100644
--- a/test/intrinsics/gen/textureDimensions/d125bc.wgsl
+++ b/test/intrinsics/gen/textureDimensions/d125bc.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube<f32>;
+@group(1) @binding(0) var arg_0: texture_cube<f32>;
 
 // fn textureDimensions(texture: texture_cube<f32>) -> vec2<i32>
 fn textureDimensions_d125bc() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_d125bc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_d125bc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_d125bc();
 }
diff --git a/test/intrinsics/gen/textureDimensions/d125bc.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/d125bc.wgsl.expected.wgsl
index e7de8ad..e8b2c56 100644
--- a/test/intrinsics/gen/textureDimensions/d125bc.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/d125bc.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube<f32>;
+@group(1) @binding(0) var arg_0 : texture_cube<f32>;
 
 fn textureDimensions_d125bc() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_d125bc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_d125bc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_d125bc();
 }
diff --git a/test/intrinsics/gen/textureDimensions/d83c45.wgsl b/test/intrinsics/gen/textureDimensions/d83c45.wgsl
index a15bcc5..feec4d5 100644
--- a/test/intrinsics/gen/textureDimensions/d83c45.wgsl
+++ b/test/intrinsics/gen/textureDimensions/d83c45.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube_array<u32>;
+@group(1) @binding(0) var arg_0: texture_cube_array<u32>;
 
 // fn textureDimensions(texture: texture_cube_array<u32>, level: i32) -> vec2<i32>
 fn textureDimensions_d83c45() {
   var res: vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_d83c45();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_d83c45();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_d83c45();
 }
diff --git a/test/intrinsics/gen/textureDimensions/d83c45.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/d83c45.wgsl.expected.wgsl
index 36e283f..4134f65 100644
--- a/test/intrinsics/gen/textureDimensions/d83c45.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/d83c45.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube_array<u32>;
+@group(1) @binding(0) var arg_0 : texture_cube_array<u32>;
 
 fn textureDimensions_d83c45() {
   var res : vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_d83c45();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_d83c45();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_d83c45();
 }
diff --git a/test/intrinsics/gen/textureDimensions/daf7c0.wgsl b/test/intrinsics/gen/textureDimensions/daf7c0.wgsl
index 0a934aa..5fe4ee1 100644
--- a/test/intrinsics/gen/textureDimensions/daf7c0.wgsl
+++ b/test/intrinsics/gen/textureDimensions/daf7c0.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_multisampled_2d<i32>;
+@group(1) @binding(0) var arg_0: texture_multisampled_2d<i32>;
 
 // fn textureDimensions(texture: texture_multisampled_2d<i32>) -> vec2<i32>
 fn textureDimensions_daf7c0() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_daf7c0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_daf7c0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_daf7c0();
 }
diff --git a/test/intrinsics/gen/textureDimensions/daf7c0.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/daf7c0.wgsl.expected.wgsl
index 6660e21..6d2fbeb 100644
--- a/test/intrinsics/gen/textureDimensions/daf7c0.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/daf7c0.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_multisampled_2d<i32>;
+@group(1) @binding(0) var arg_0 : texture_multisampled_2d<i32>;
 
 fn textureDimensions_daf7c0() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_daf7c0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_daf7c0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_daf7c0();
 }
diff --git a/test/intrinsics/gen/textureDimensions/dc2dd0.wgsl b/test/intrinsics/gen/textureDimensions/dc2dd0.wgsl
index 5bc6318..d9da1be 100644
--- a/test/intrinsics/gen/textureDimensions/dc2dd0.wgsl
+++ b/test/intrinsics/gen/textureDimensions/dc2dd0.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rgba8uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8uint, write>;
 
 // fn textureDimensions(texture: texture_storage_1d<rgba8uint, write>) -> i32
 fn textureDimensions_dc2dd0() {
   var res: i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_dc2dd0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_dc2dd0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_dc2dd0();
 }
diff --git a/test/intrinsics/gen/textureDimensions/dc2dd0.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/dc2dd0.wgsl.expected.wgsl
index 311cfef..5151ae9 100644
--- a/test/intrinsics/gen/textureDimensions/dc2dd0.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/dc2dd0.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rgba8uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rgba8uint, write>;
 
 fn textureDimensions_dc2dd0() {
   var res : i32 = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_dc2dd0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_dc2dd0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_dc2dd0();
 }
diff --git a/test/intrinsics/gen/textureDimensions/e927be.wgsl b/test/intrinsics/gen/textureDimensions/e927be.wgsl
index cd3d114..38da82e 100644
--- a/test/intrinsics/gen/textureDimensions/e927be.wgsl
+++ b/test/intrinsics/gen/textureDimensions/e927be.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube_array<i32>;
+@group(1) @binding(0) var arg_0: texture_cube_array<i32>;
 
 // fn textureDimensions(texture: texture_cube_array<i32>) -> vec2<i32>
 fn textureDimensions_e927be() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_e927be();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_e927be();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_e927be();
 }
diff --git a/test/intrinsics/gen/textureDimensions/e927be.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/e927be.wgsl.expected.wgsl
index 3fa38e7..637bad6 100644
--- a/test/intrinsics/gen/textureDimensions/e927be.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/e927be.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube_array<i32>;
+@group(1) @binding(0) var arg_0 : texture_cube_array<i32>;
 
 fn textureDimensions_e927be() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_e927be();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_e927be();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_e927be();
 }
diff --git a/test/intrinsics/gen/textureDimensions/e9e96c.wgsl b/test/intrinsics/gen/textureDimensions/e9e96c.wgsl
index 55fcd5f..e2ae8ec 100644
--- a/test/intrinsics/gen/textureDimensions/e9e96c.wgsl
+++ b/test/intrinsics/gen/textureDimensions/e9e96c.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<r32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32float, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<r32float, write>) -> vec2<i32>
 fn textureDimensions_e9e96c() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_e9e96c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_e9e96c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_e9e96c();
 }
diff --git a/test/intrinsics/gen/textureDimensions/e9e96c.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/e9e96c.wgsl.expected.wgsl
index 2a7e11b..0f84fac 100644
--- a/test/intrinsics/gen/textureDimensions/e9e96c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/e9e96c.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<r32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<r32float, write>;
 
 fn textureDimensions_e9e96c() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_e9e96c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_e9e96c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_e9e96c();
 }
diff --git a/test/intrinsics/gen/textureDimensions/ef5b89.wgsl b/test/intrinsics/gen/textureDimensions/ef5b89.wgsl
index 2ee889a..80750e3 100644
--- a/test/intrinsics/gen/textureDimensions/ef5b89.wgsl
+++ b/test/intrinsics/gen/textureDimensions/ef5b89.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_multisampled_2d<f32>;
+@group(1) @binding(0) var arg_0: texture_multisampled_2d<f32>;
 
 // fn textureDimensions(texture: texture_multisampled_2d<f32>) -> vec2<i32>
 fn textureDimensions_ef5b89() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_ef5b89();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_ef5b89();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_ef5b89();
 }
diff --git a/test/intrinsics/gen/textureDimensions/ef5b89.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/ef5b89.wgsl.expected.wgsl
index be6e296..f758962 100644
--- a/test/intrinsics/gen/textureDimensions/ef5b89.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/ef5b89.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_multisampled_2d<f32>;
+@group(1) @binding(0) var arg_0 : texture_multisampled_2d<f32>;
 
 fn textureDimensions_ef5b89() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_ef5b89();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_ef5b89();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_ef5b89();
 }
diff --git a/test/intrinsics/gen/textureDimensions/efc8a4.wgsl b/test/intrinsics/gen/textureDimensions/efc8a4.wgsl
index 121c855..b7dc738 100644
--- a/test/intrinsics/gen/textureDimensions/efc8a4.wgsl
+++ b/test/intrinsics/gen/textureDimensions/efc8a4.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_3d<i32>;
+@group(1) @binding(0) var arg_0: texture_3d<i32>;
 
 // fn textureDimensions(texture: texture_3d<i32>, level: i32) -> vec3<i32>
 fn textureDimensions_efc8a4() {
   var res: vec3<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_efc8a4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_efc8a4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_efc8a4();
 }
diff --git a/test/intrinsics/gen/textureDimensions/efc8a4.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/efc8a4.wgsl.expected.wgsl
index 213bf04..ba6f1db 100644
--- a/test/intrinsics/gen/textureDimensions/efc8a4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/efc8a4.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_3d<i32>;
+@group(1) @binding(0) var arg_0 : texture_3d<i32>;
 
 fn textureDimensions_efc8a4() {
   var res : vec3<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_efc8a4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_efc8a4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_efc8a4();
 }
diff --git a/test/intrinsics/gen/textureDimensions/f60bdb.wgsl b/test/intrinsics/gen/textureDimensions/f60bdb.wgsl
index dd3c2da..13edf77 100644
--- a/test/intrinsics/gen/textureDimensions/f60bdb.wgsl
+++ b/test/intrinsics/gen/textureDimensions/f60bdb.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_multisampled_2d;
+@group(1) @binding(0) var arg_0: texture_depth_multisampled_2d;
 
 // fn textureDimensions(texture: texture_depth_multisampled_2d) -> vec2<i32>
 fn textureDimensions_f60bdb() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_f60bdb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_f60bdb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_f60bdb();
 }
diff --git a/test/intrinsics/gen/textureDimensions/f60bdb.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/f60bdb.wgsl.expected.wgsl
index 9a0b4b5..04d2455 100644
--- a/test/intrinsics/gen/textureDimensions/f60bdb.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/f60bdb.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_multisampled_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_multisampled_2d;
 
 fn textureDimensions_f60bdb() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_f60bdb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_f60bdb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_f60bdb();
 }
diff --git a/test/intrinsics/gen/textureDimensions/f7145b.wgsl b/test/intrinsics/gen/textureDimensions/f7145b.wgsl
index f0887c3..f8da7e1 100644
--- a/test/intrinsics/gen/textureDimensions/f7145b.wgsl
+++ b/test/intrinsics/gen/textureDimensions/f7145b.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d<u32>;
+@group(1) @binding(0) var arg_0: texture_2d<u32>;
 
 // fn textureDimensions(texture: texture_2d<u32>, level: i32) -> vec2<i32>
 fn textureDimensions_f7145b() {
   var res: vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_f7145b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_f7145b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_f7145b();
 }
diff --git a/test/intrinsics/gen/textureDimensions/f7145b.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/f7145b.wgsl.expected.wgsl
index 86aa13f..dd3335d 100644
--- a/test/intrinsics/gen/textureDimensions/f7145b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/f7145b.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d<u32>;
+@group(1) @binding(0) var arg_0 : texture_2d<u32>;
 
 fn textureDimensions_f7145b() {
   var res : vec2<i32> = textureDimensions(arg_0, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_f7145b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_f7145b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_f7145b();
 }
diff --git a/test/intrinsics/gen/textureDimensions/f931c7.wgsl b/test/intrinsics/gen/textureDimensions/f931c7.wgsl
index 5fdab32..aa29d97 100644
--- a/test/intrinsics/gen/textureDimensions/f931c7.wgsl
+++ b/test/intrinsics/gen/textureDimensions/f931c7.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<r32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<r32float, write>;
 
 // fn textureDimensions(texture: texture_storage_2d<r32float, write>) -> vec2<i32>
 fn textureDimensions_f931c7() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_f931c7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_f931c7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_f931c7();
 }
diff --git a/test/intrinsics/gen/textureDimensions/f931c7.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/f931c7.wgsl.expected.wgsl
index caf7d59..14de15a 100644
--- a/test/intrinsics/gen/textureDimensions/f931c7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/f931c7.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<r32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<r32float, write>;
 
 fn textureDimensions_f931c7() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_f931c7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_f931c7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_f931c7();
 }
diff --git a/test/intrinsics/gen/textureDimensions/fa9859.wgsl b/test/intrinsics/gen/textureDimensions/fa9859.wgsl
index 13815d7..b6a1a04 100644
--- a/test/intrinsics/gen/textureDimensions/fa9859.wgsl
+++ b/test/intrinsics/gen/textureDimensions/fa9859.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d<i32>;
+@group(1) @binding(0) var arg_0: texture_2d<i32>;
 
 // fn textureDimensions(texture: texture_2d<i32>) -> vec2<i32>
 fn textureDimensions_fa9859() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_fa9859();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_fa9859();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_fa9859();
 }
diff --git a/test/intrinsics/gen/textureDimensions/fa9859.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/fa9859.wgsl.expected.wgsl
index 772b8b8..58b2bd0 100644
--- a/test/intrinsics/gen/textureDimensions/fa9859.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/fa9859.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d<i32>;
+@group(1) @binding(0) var arg_0 : texture_2d<i32>;
 
 fn textureDimensions_fa9859() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_fa9859();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_fa9859();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_fa9859();
 }
diff --git a/test/intrinsics/gen/textureDimensions/fb5670.wgsl b/test/intrinsics/gen/textureDimensions/fb5670.wgsl
index a6b1d31..5151597 100644
--- a/test/intrinsics/gen/textureDimensions/fb5670.wgsl
+++ b/test/intrinsics/gen/textureDimensions/fb5670.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rg32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32float, write>;
 
 // fn textureDimensions(texture: texture_storage_2d_array<rg32float, write>) -> vec2<i32>
 fn textureDimensions_fb5670() {
   var res: vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_fb5670();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_fb5670();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_fb5670();
 }
diff --git a/test/intrinsics/gen/textureDimensions/fb5670.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/fb5670.wgsl.expected.wgsl
index e5d460d..79fcdb8 100644
--- a/test/intrinsics/gen/textureDimensions/fb5670.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/fb5670.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rg32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rg32float, write>;
 
 fn textureDimensions_fb5670() {
   var res : vec2<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_fb5670();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_fb5670();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_fb5670();
 }
diff --git a/test/intrinsics/gen/textureDimensions/fcac78.wgsl b/test/intrinsics/gen/textureDimensions/fcac78.wgsl
index beaf94c..6a3c215 100644
--- a/test/intrinsics/gen/textureDimensions/fcac78.wgsl
+++ b/test/intrinsics/gen/textureDimensions/fcac78.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rgba8uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8uint, write>;
 
 // fn textureDimensions(texture: texture_storage_3d<rgba8uint, write>) -> vec3<i32>
 fn textureDimensions_fcac78() {
   var res: vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_fcac78();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_fcac78();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_fcac78();
 }
diff --git a/test/intrinsics/gen/textureDimensions/fcac78.wgsl.expected.wgsl b/test/intrinsics/gen/textureDimensions/fcac78.wgsl.expected.wgsl
index 6b708dc..bd243ab 100644
--- a/test/intrinsics/gen/textureDimensions/fcac78.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureDimensions/fcac78.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rgba8uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rgba8uint, write>;
 
 fn textureDimensions_fcac78() {
   var res : vec3<i32> = textureDimensions(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureDimensions_fcac78();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureDimensions_fcac78();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureDimensions_fcac78();
 }
diff --git a/test/intrinsics/gen/textureGather/01305f.wgsl b/test/intrinsics/gen/textureGather/01305f.wgsl
index 15f035c..55af300 100644
--- a/test/intrinsics/gen/textureGather/01305f.wgsl
+++ b/test/intrinsics/gen/textureGather/01305f.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(1)]] var arg_1: texture_2d_array<u32>;
-[[group(1), binding(2)]] var arg_2: sampler;
+@group(1) @binding(1) var arg_1: texture_2d_array<u32>;
+@group(1) @binding(2) var arg_2: sampler;
 
 // fn textureGather(component: i32, texture: texture_2d_array<u32>, sampler: sampler, coords: vec2<f32>, array_index: i32) -> vec4<u32>
 fn textureGather_01305f() {
   var res: vec4<u32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_01305f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_01305f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_01305f();
 }
diff --git a/test/intrinsics/gen/textureGather/01305f.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/01305f.wgsl.expected.wgsl
index da4c38f..b683348 100644
--- a/test/intrinsics/gen/textureGather/01305f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/01305f.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(1)]] var arg_1 : texture_2d_array<u32>;
+@group(1) @binding(1) var arg_1 : texture_2d_array<u32>;
 
-[[group(1), binding(2)]] var arg_2 : sampler;
+@group(1) @binding(2) var arg_2 : sampler;
 
 fn textureGather_01305f() {
   var res : vec4<u32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_01305f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_01305f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_01305f();
 }
diff --git a/test/intrinsics/gen/textureGather/06030a.wgsl b/test/intrinsics/gen/textureGather/06030a.wgsl
index 1e42042..3ae4106 100644
--- a/test/intrinsics/gen/textureGather/06030a.wgsl
+++ b/test/intrinsics/gen/textureGather/06030a.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(1)]] var arg_1: texture_2d_array<f32>;
-[[group(1), binding(2)]] var arg_2: sampler;
+@group(1) @binding(1) var arg_1: texture_2d_array<f32>;
+@group(1) @binding(2) var arg_2: sampler;
 
 // fn textureGather(component: i32, texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, offset: vec2<i32>) -> vec4<f32>
 fn textureGather_06030a() {
   var res: vec4<f32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_06030a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_06030a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_06030a();
 }
diff --git a/test/intrinsics/gen/textureGather/06030a.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/06030a.wgsl.expected.wgsl
index 7faad62..6709ed6 100644
--- a/test/intrinsics/gen/textureGather/06030a.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/06030a.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(1)]] var arg_1 : texture_2d_array<f32>;
+@group(1) @binding(1) var arg_1 : texture_2d_array<f32>;
 
-[[group(1), binding(2)]] var arg_2 : sampler;
+@group(1) @binding(2) var arg_2 : sampler;
 
 fn textureGather_06030a() {
   var res : vec4<f32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_06030a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_06030a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_06030a();
 }
diff --git a/test/intrinsics/gen/textureGather/10c554.wgsl b/test/intrinsics/gen/textureGather/10c554.wgsl
index d64a317..7abaa7f 100644
--- a/test/intrinsics/gen/textureGather/10c554.wgsl
+++ b/test/intrinsics/gen/textureGather/10c554.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_cube;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_depth_cube;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureGather(texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>) -> vec4<f32>
 fn textureGather_10c554() {
   var res: vec4<f32> = textureGather(arg_0, arg_1, vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_10c554();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_10c554();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_10c554();
 }
diff --git a/test/intrinsics/gen/textureGather/10c554.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/10c554.wgsl.expected.wgsl
index 748e379..71d449e 100644
--- a/test/intrinsics/gen/textureGather/10c554.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/10c554.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_cube;
+@group(1) @binding(0) var arg_0 : texture_depth_cube;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureGather_10c554() {
   var res : vec4<f32> = textureGather(arg_0, arg_1, vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_10c554();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_10c554();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_10c554();
 }
diff --git a/test/intrinsics/gen/textureGather/15d79c.wgsl b/test/intrinsics/gen/textureGather/15d79c.wgsl
index 55c4e46..47bc2da 100644
--- a/test/intrinsics/gen/textureGather/15d79c.wgsl
+++ b/test/intrinsics/gen/textureGather/15d79c.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(1)]] var arg_1: texture_2d<f32>;
-[[group(1), binding(2)]] var arg_2: sampler;
+@group(1) @binding(1) var arg_1: texture_2d<f32>;
+@group(1) @binding(2) var arg_2: sampler;
 
 // fn textureGather(component: i32, texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, offset: vec2<i32>) -> vec4<f32>
 fn textureGather_15d79c() {
   var res: vec4<f32> = textureGather(1, arg_1, arg_2, vec2<f32>(), vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_15d79c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_15d79c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_15d79c();
 }
diff --git a/test/intrinsics/gen/textureGather/15d79c.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/15d79c.wgsl.expected.wgsl
index 5319046..14d9203 100644
--- a/test/intrinsics/gen/textureGather/15d79c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/15d79c.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(1)]] var arg_1 : texture_2d<f32>;
+@group(1) @binding(1) var arg_1 : texture_2d<f32>;
 
-[[group(1), binding(2)]] var arg_2 : sampler;
+@group(1) @binding(2) var arg_2 : sampler;
 
 fn textureGather_15d79c() {
   var res : vec4<f32> = textureGather(1, arg_1, arg_2, vec2<f32>(), vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_15d79c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_15d79c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_15d79c();
 }
diff --git a/test/intrinsics/gen/textureGather/2e0ed5.wgsl b/test/intrinsics/gen/textureGather/2e0ed5.wgsl
index c8c1104..ff561c9 100644
--- a/test/intrinsics/gen/textureGather/2e0ed5.wgsl
+++ b/test/intrinsics/gen/textureGather/2e0ed5.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureGather(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>) -> vec4<f32>
 fn textureGather_2e0ed5() {
   var res: vec4<f32> = textureGather(arg_0, arg_1, vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_2e0ed5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_2e0ed5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_2e0ed5();
 }
diff --git a/test/intrinsics/gen/textureGather/2e0ed5.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/2e0ed5.wgsl.expected.wgsl
index 3439a78..f3b60b8 100644
--- a/test/intrinsics/gen/textureGather/2e0ed5.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/2e0ed5.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_2d;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureGather_2e0ed5() {
   var res : vec4<f32> = textureGather(arg_0, arg_1, vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_2e0ed5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_2e0ed5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_2e0ed5();
 }
diff --git a/test/intrinsics/gen/textureGather/3112e8.wgsl b/test/intrinsics/gen/textureGather/3112e8.wgsl
index e556b30..a08ae70 100644
--- a/test/intrinsics/gen/textureGather/3112e8.wgsl
+++ b/test/intrinsics/gen/textureGather/3112e8.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(1)]] var arg_1: texture_cube_array<f32>;
-[[group(1), binding(2)]] var arg_2: sampler;
+@group(1) @binding(1) var arg_1: texture_cube_array<f32>;
+@group(1) @binding(2) var arg_2: sampler;
 
 // fn textureGather(component: i32, texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: i32) -> vec4<f32>
 fn textureGather_3112e8() {
   var res: vec4<f32> = textureGather(1, arg_1, arg_2, vec3<f32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_3112e8();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_3112e8();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_3112e8();
 }
diff --git a/test/intrinsics/gen/textureGather/3112e8.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/3112e8.wgsl.expected.wgsl
index 5b0bd78..3f7ac9e 100644
--- a/test/intrinsics/gen/textureGather/3112e8.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/3112e8.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(1)]] var arg_1 : texture_cube_array<f32>;
+@group(1) @binding(1) var arg_1 : texture_cube_array<f32>;
 
-[[group(1), binding(2)]] var arg_2 : sampler;
+@group(1) @binding(2) var arg_2 : sampler;
 
 fn textureGather_3112e8() {
   var res : vec4<f32> = textureGather(1, arg_1, arg_2, vec3<f32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_3112e8();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_3112e8();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_3112e8();
 }
diff --git a/test/intrinsics/gen/textureGather/3c527e.wgsl b/test/intrinsics/gen/textureGather/3c527e.wgsl
index 1877c38..f6f8f67 100644
--- a/test/intrinsics/gen/textureGather/3c527e.wgsl
+++ b/test/intrinsics/gen/textureGather/3c527e.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(1)]] var arg_1: texture_cube_array<u32>;
-[[group(1), binding(2)]] var arg_2: sampler;
+@group(1) @binding(1) var arg_1: texture_cube_array<u32>;
+@group(1) @binding(2) var arg_2: sampler;
 
 // fn textureGather(component: i32, texture: texture_cube_array<u32>, sampler: sampler, coords: vec3<f32>, array_index: i32) -> vec4<u32>
 fn textureGather_3c527e() {
   var res: vec4<u32> = textureGather(1, arg_1, arg_2, vec3<f32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_3c527e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_3c527e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_3c527e();
 }
diff --git a/test/intrinsics/gen/textureGather/3c527e.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/3c527e.wgsl.expected.wgsl
index 4aeb587..9753db4 100644
--- a/test/intrinsics/gen/textureGather/3c527e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/3c527e.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(1)]] var arg_1 : texture_cube_array<u32>;
+@group(1) @binding(1) var arg_1 : texture_cube_array<u32>;
 
-[[group(1), binding(2)]] var arg_2 : sampler;
+@group(1) @binding(2) var arg_2 : sampler;
 
 fn textureGather_3c527e() {
   var res : vec4<u32> = textureGather(1, arg_1, arg_2, vec3<f32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_3c527e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_3c527e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_3c527e();
 }
diff --git a/test/intrinsics/gen/textureGather/43025d.wgsl b/test/intrinsics/gen/textureGather/43025d.wgsl
index 219cd0a..2cf28ef 100644
--- a/test/intrinsics/gen/textureGather/43025d.wgsl
+++ b/test/intrinsics/gen/textureGather/43025d.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_cube_array;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_depth_cube_array;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureGather(texture: texture_depth_cube_array, sampler: sampler, coords: vec3<f32>, array_index: i32) -> vec4<f32>
 fn textureGather_43025d() {
   var res: vec4<f32> = textureGather(arg_0, arg_1, vec3<f32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_43025d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_43025d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_43025d();
 }
diff --git a/test/intrinsics/gen/textureGather/43025d.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/43025d.wgsl.expected.wgsl
index 121a1da..f94fa45 100644
--- a/test/intrinsics/gen/textureGather/43025d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/43025d.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_cube_array;
+@group(1) @binding(0) var arg_0 : texture_depth_cube_array;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureGather_43025d() {
   var res : vec4<f32> = textureGather(arg_0, arg_1, vec3<f32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_43025d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_43025d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_43025d();
 }
diff --git a/test/intrinsics/gen/textureGather/4f2350.wgsl b/test/intrinsics/gen/textureGather/4f2350.wgsl
index 296c243..6945968 100644
--- a/test/intrinsics/gen/textureGather/4f2350.wgsl
+++ b/test/intrinsics/gen/textureGather/4f2350.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(1)]] var arg_1: texture_2d_array<i32>;
-[[group(1), binding(2)]] var arg_2: sampler;
+@group(1) @binding(1) var arg_1: texture_2d_array<i32>;
+@group(1) @binding(2) var arg_2: sampler;
 
 // fn textureGather(component: i32, texture: texture_2d_array<i32>, sampler: sampler, coords: vec2<f32>, array_index: i32, offset: vec2<i32>) -> vec4<i32>
 fn textureGather_4f2350() {
   var res: vec4<i32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_4f2350();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_4f2350();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_4f2350();
 }
diff --git a/test/intrinsics/gen/textureGather/4f2350.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/4f2350.wgsl.expected.wgsl
index 4dade7f..75a6912 100644
--- a/test/intrinsics/gen/textureGather/4f2350.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/4f2350.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(1)]] var arg_1 : texture_2d_array<i32>;
+@group(1) @binding(1) var arg_1 : texture_2d_array<i32>;
 
-[[group(1), binding(2)]] var arg_2 : sampler;
+@group(1) @binding(2) var arg_2 : sampler;
 
 fn textureGather_4f2350() {
   var res : vec4<i32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_4f2350();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_4f2350();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_4f2350();
 }
diff --git a/test/intrinsics/gen/textureGather/51cf0b.wgsl b/test/intrinsics/gen/textureGather/51cf0b.wgsl
index 349aaa6..6e503ce 100644
--- a/test/intrinsics/gen/textureGather/51cf0b.wgsl
+++ b/test/intrinsics/gen/textureGather/51cf0b.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(1)]] var arg_1: texture_2d_array<i32>;
-[[group(1), binding(2)]] var arg_2: sampler;
+@group(1) @binding(1) var arg_1: texture_2d_array<i32>;
+@group(1) @binding(2) var arg_2: sampler;
 
 // fn textureGather(component: i32, texture: texture_2d_array<i32>, sampler: sampler, coords: vec2<f32>, array_index: i32) -> vec4<i32>
 fn textureGather_51cf0b() {
   var res: vec4<i32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_51cf0b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_51cf0b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_51cf0b();
 }
diff --git a/test/intrinsics/gen/textureGather/51cf0b.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/51cf0b.wgsl.expected.wgsl
index d14de6e..e326e20 100644
--- a/test/intrinsics/gen/textureGather/51cf0b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/51cf0b.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(1)]] var arg_1 : texture_2d_array<i32>;
+@group(1) @binding(1) var arg_1 : texture_2d_array<i32>;
 
-[[group(1), binding(2)]] var arg_2 : sampler;
+@group(1) @binding(2) var arg_2 : sampler;
 
 fn textureGather_51cf0b() {
   var res : vec4<i32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_51cf0b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_51cf0b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_51cf0b();
 }
diff --git a/test/intrinsics/gen/textureGather/53ece6.wgsl b/test/intrinsics/gen/textureGather/53ece6.wgsl
index b218496..045f2ba 100644
--- a/test/intrinsics/gen/textureGather/53ece6.wgsl
+++ b/test/intrinsics/gen/textureGather/53ece6.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d_array;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureGather(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: i32, offset: vec2<i32>) -> vec4<f32>
 fn textureGather_53ece6() {
   var res: vec4<f32> = textureGather(arg_0, arg_1, vec2<f32>(), 1, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_53ece6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_53ece6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_53ece6();
 }
diff --git a/test/intrinsics/gen/textureGather/53ece6.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/53ece6.wgsl.expected.wgsl
index 8cf894a..27c47cf 100644
--- a/test/intrinsics/gen/textureGather/53ece6.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/53ece6.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d_array;
+@group(1) @binding(0) var arg_0 : texture_depth_2d_array;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureGather_53ece6() {
   var res : vec4<f32> = textureGather(arg_0, arg_1, vec2<f32>(), 1, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_53ece6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_53ece6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_53ece6();
 }
diff --git a/test/intrinsics/gen/textureGather/57bfc6.wgsl b/test/intrinsics/gen/textureGather/57bfc6.wgsl
index 27ab266..daf1cc0 100644
--- a/test/intrinsics/gen/textureGather/57bfc6.wgsl
+++ b/test/intrinsics/gen/textureGather/57bfc6.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(1)]] var arg_1: texture_cube<f32>;
-[[group(1), binding(2)]] var arg_2: sampler;
+@group(1) @binding(1) var arg_1: texture_cube<f32>;
+@group(1) @binding(2) var arg_2: sampler;
 
 // fn textureGather(component: i32, texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>) -> vec4<f32>
 fn textureGather_57bfc6() {
   var res: vec4<f32> = textureGather(1, arg_1, arg_2, vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_57bfc6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_57bfc6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_57bfc6();
 }
diff --git a/test/intrinsics/gen/textureGather/57bfc6.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/57bfc6.wgsl.expected.wgsl
index 5be66ca..8273199 100644
--- a/test/intrinsics/gen/textureGather/57bfc6.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/57bfc6.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(1)]] var arg_1 : texture_cube<f32>;
+@group(1) @binding(1) var arg_1 : texture_cube<f32>;
 
-[[group(1), binding(2)]] var arg_2 : sampler;
+@group(1) @binding(2) var arg_2 : sampler;
 
 fn textureGather_57bfc6() {
   var res : vec4<f32> = textureGather(1, arg_1, arg_2, vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_57bfc6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_57bfc6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_57bfc6();
 }
diff --git a/test/intrinsics/gen/textureGather/587ba3.wgsl b/test/intrinsics/gen/textureGather/587ba3.wgsl
index ac9a292..5bc617c 100644
--- a/test/intrinsics/gen/textureGather/587ba3.wgsl
+++ b/test/intrinsics/gen/textureGather/587ba3.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(1)]] var arg_1: texture_2d<i32>;
-[[group(1), binding(2)]] var arg_2: sampler;
+@group(1) @binding(1) var arg_1: texture_2d<i32>;
+@group(1) @binding(2) var arg_2: sampler;
 
 // fn textureGather(component: i32, texture: texture_2d<i32>, sampler: sampler, coords: vec2<f32>) -> vec4<i32>
 fn textureGather_587ba3() {
   var res: vec4<i32> = textureGather(1, arg_1, arg_2, vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_587ba3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_587ba3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_587ba3();
 }
diff --git a/test/intrinsics/gen/textureGather/587ba3.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/587ba3.wgsl.expected.wgsl
index 8ef9c1f..d906b0b 100644
--- a/test/intrinsics/gen/textureGather/587ba3.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/587ba3.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(1)]] var arg_1 : texture_2d<i32>;
+@group(1) @binding(1) var arg_1 : texture_2d<i32>;
 
-[[group(1), binding(2)]] var arg_2 : sampler;
+@group(1) @binding(2) var arg_2 : sampler;
 
 fn textureGather_587ba3() {
   var res : vec4<i32> = textureGather(1, arg_1, arg_2, vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_587ba3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_587ba3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_587ba3();
 }
diff --git a/test/intrinsics/gen/textureGather/69e0fb.wgsl b/test/intrinsics/gen/textureGather/69e0fb.wgsl
index d8c2376..3d4a9fa 100644
--- a/test/intrinsics/gen/textureGather/69e0fb.wgsl
+++ b/test/intrinsics/gen/textureGather/69e0fb.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(1)]] var arg_1: texture_2d<i32>;
-[[group(1), binding(2)]] var arg_2: sampler;
+@group(1) @binding(1) var arg_1: texture_2d<i32>;
+@group(1) @binding(2) var arg_2: sampler;
 
 // fn textureGather(component: i32, texture: texture_2d<i32>, sampler: sampler, coords: vec2<f32>, offset: vec2<i32>) -> vec4<i32>
 fn textureGather_69e0fb() {
   var res: vec4<i32> = textureGather(1, arg_1, arg_2, vec2<f32>(), vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_69e0fb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_69e0fb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_69e0fb();
 }
diff --git a/test/intrinsics/gen/textureGather/69e0fb.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/69e0fb.wgsl.expected.wgsl
index 21d5efd..a23c38f 100644
--- a/test/intrinsics/gen/textureGather/69e0fb.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/69e0fb.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(1)]] var arg_1 : texture_2d<i32>;
+@group(1) @binding(1) var arg_1 : texture_2d<i32>;
 
-[[group(1), binding(2)]] var arg_2 : sampler;
+@group(1) @binding(2) var arg_2 : sampler;
 
 fn textureGather_69e0fb() {
   var res : vec4<i32> = textureGather(1, arg_1, arg_2, vec2<f32>(), vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_69e0fb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_69e0fb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_69e0fb();
 }
diff --git a/test/intrinsics/gen/textureGather/93003d.wgsl b/test/intrinsics/gen/textureGather/93003d.wgsl
index fcbedcb..c194b51 100644
--- a/test/intrinsics/gen/textureGather/93003d.wgsl
+++ b/test/intrinsics/gen/textureGather/93003d.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(1)]] var arg_1: texture_2d<u32>;
-[[group(1), binding(2)]] var arg_2: sampler;
+@group(1) @binding(1) var arg_1: texture_2d<u32>;
+@group(1) @binding(2) var arg_2: sampler;
 
 // fn textureGather(component: i32, texture: texture_2d<u32>, sampler: sampler, coords: vec2<f32>, offset: vec2<i32>) -> vec4<u32>
 fn textureGather_93003d() {
   var res: vec4<u32> = textureGather(1, arg_1, arg_2, vec2<f32>(), vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_93003d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_93003d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_93003d();
 }
diff --git a/test/intrinsics/gen/textureGather/93003d.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/93003d.wgsl.expected.wgsl
index 64c3ad0..c4adea5 100644
--- a/test/intrinsics/gen/textureGather/93003d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/93003d.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(1)]] var arg_1 : texture_2d<u32>;
+@group(1) @binding(1) var arg_1 : texture_2d<u32>;
 
-[[group(1), binding(2)]] var arg_2 : sampler;
+@group(1) @binding(2) var arg_2 : sampler;
 
 fn textureGather_93003d() {
   var res : vec4<u32> = textureGather(1, arg_1, arg_2, vec2<f32>(), vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_93003d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_93003d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_93003d();
 }
diff --git a/test/intrinsics/gen/textureGather/9a6358.wgsl b/test/intrinsics/gen/textureGather/9a6358.wgsl
index 7b84b02..0aff04c 100644
--- a/test/intrinsics/gen/textureGather/9a6358.wgsl
+++ b/test/intrinsics/gen/textureGather/9a6358.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d_array;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureGather(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: i32) -> vec4<f32>
 fn textureGather_9a6358() {
   var res: vec4<f32> = textureGather(arg_0, arg_1, vec2<f32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_9a6358();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_9a6358();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_9a6358();
 }
diff --git a/test/intrinsics/gen/textureGather/9a6358.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/9a6358.wgsl.expected.wgsl
index 9721e3a..984ff98 100644
--- a/test/intrinsics/gen/textureGather/9a6358.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/9a6358.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d_array;
+@group(1) @binding(0) var arg_0 : texture_depth_2d_array;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureGather_9a6358() {
   var res : vec4<f32> = textureGather(arg_0, arg_1, vec2<f32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_9a6358();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_9a6358();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_9a6358();
 }
diff --git a/test/intrinsics/gen/textureGather/9efca2.wgsl b/test/intrinsics/gen/textureGather/9efca2.wgsl
index 2008c2e..d1fd63f 100644
--- a/test/intrinsics/gen/textureGather/9efca2.wgsl
+++ b/test/intrinsics/gen/textureGather/9efca2.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(1)]] var arg_1: texture_2d_array<f32>;
-[[group(1), binding(2)]] var arg_2: sampler;
+@group(1) @binding(1) var arg_1: texture_2d_array<f32>;
+@group(1) @binding(2) var arg_2: sampler;
 
 // fn textureGather(component: i32, texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32) -> vec4<f32>
 fn textureGather_9efca2() {
   var res: vec4<f32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_9efca2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_9efca2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_9efca2();
 }
diff --git a/test/intrinsics/gen/textureGather/9efca2.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/9efca2.wgsl.expected.wgsl
index 07113dd..c977428 100644
--- a/test/intrinsics/gen/textureGather/9efca2.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/9efca2.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(1)]] var arg_1 : texture_2d_array<f32>;
+@group(1) @binding(1) var arg_1 : texture_2d_array<f32>;
 
-[[group(1), binding(2)]] var arg_2 : sampler;
+@group(1) @binding(2) var arg_2 : sampler;
 
 fn textureGather_9efca2() {
   var res : vec4<f32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_9efca2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_9efca2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_9efca2();
 }
diff --git a/test/intrinsics/gen/textureGather/bd0b1e.wgsl b/test/intrinsics/gen/textureGather/bd0b1e.wgsl
index 9b59824..e7bf959 100644
--- a/test/intrinsics/gen/textureGather/bd0b1e.wgsl
+++ b/test/intrinsics/gen/textureGather/bd0b1e.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(1)]] var arg_1: texture_2d<f32>;
-[[group(1), binding(2)]] var arg_2: sampler;
+@group(1) @binding(1) var arg_1: texture_2d<f32>;
+@group(1) @binding(2) var arg_2: sampler;
 
 // fn textureGather(component: i32, texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>) -> vec4<f32>
 fn textureGather_bd0b1e() {
   var res: vec4<f32> = textureGather(1, arg_1, arg_2, vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_bd0b1e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_bd0b1e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_bd0b1e();
 }
diff --git a/test/intrinsics/gen/textureGather/bd0b1e.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/bd0b1e.wgsl.expected.wgsl
index 6094dd2..c4f05ce 100644
--- a/test/intrinsics/gen/textureGather/bd0b1e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/bd0b1e.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(1)]] var arg_1 : texture_2d<f32>;
+@group(1) @binding(1) var arg_1 : texture_2d<f32>;
 
-[[group(1), binding(2)]] var arg_2 : sampler;
+@group(1) @binding(2) var arg_2 : sampler;
 
 fn textureGather_bd0b1e() {
   var res : vec4<f32> = textureGather(1, arg_1, arg_2, vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_bd0b1e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_bd0b1e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_bd0b1e();
 }
diff --git a/test/intrinsics/gen/textureGather/c409ae.wgsl b/test/intrinsics/gen/textureGather/c409ae.wgsl
index 95088b0..8778bb7 100644
--- a/test/intrinsics/gen/textureGather/c409ae.wgsl
+++ b/test/intrinsics/gen/textureGather/c409ae.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureGather(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, offset: vec2<i32>) -> vec4<f32>
 fn textureGather_c409ae() {
   var res: vec4<f32> = textureGather(arg_0, arg_1, vec2<f32>(), vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_c409ae();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_c409ae();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_c409ae();
 }
diff --git a/test/intrinsics/gen/textureGather/c409ae.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/c409ae.wgsl.expected.wgsl
index 88bc15d..3610a5d 100644
--- a/test/intrinsics/gen/textureGather/c409ae.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/c409ae.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_2d;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureGather_c409ae() {
   var res : vec4<f32> = textureGather(arg_0, arg_1, vec2<f32>(), vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_c409ae();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_c409ae();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_c409ae();
 }
diff --git a/test/intrinsics/gen/textureGather/c55822.wgsl b/test/intrinsics/gen/textureGather/c55822.wgsl
index e91568d..9cedd59 100644
--- a/test/intrinsics/gen/textureGather/c55822.wgsl
+++ b/test/intrinsics/gen/textureGather/c55822.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(1)]] var arg_1: texture_cube_array<i32>;
-[[group(1), binding(2)]] var arg_2: sampler;
+@group(1) @binding(1) var arg_1: texture_cube_array<i32>;
+@group(1) @binding(2) var arg_2: sampler;
 
 // fn textureGather(component: i32, texture: texture_cube_array<i32>, sampler: sampler, coords: vec3<f32>, array_index: i32) -> vec4<i32>
 fn textureGather_c55822() {
   var res: vec4<i32> = textureGather(1, arg_1, arg_2, vec3<f32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_c55822();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_c55822();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_c55822();
 }
diff --git a/test/intrinsics/gen/textureGather/c55822.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/c55822.wgsl.expected.wgsl
index 58bbb42..261b01b 100644
--- a/test/intrinsics/gen/textureGather/c55822.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/c55822.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(1)]] var arg_1 : texture_cube_array<i32>;
+@group(1) @binding(1) var arg_1 : texture_cube_array<i32>;
 
-[[group(1), binding(2)]] var arg_2 : sampler;
+@group(1) @binding(2) var arg_2 : sampler;
 
 fn textureGather_c55822() {
   var res : vec4<i32> = textureGather(1, arg_1, arg_2, vec3<f32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_c55822();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_c55822();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_c55822();
 }
diff --git a/test/intrinsics/gen/textureGather/e1b67d.wgsl b/test/intrinsics/gen/textureGather/e1b67d.wgsl
index d243474..ac8f15a 100644
--- a/test/intrinsics/gen/textureGather/e1b67d.wgsl
+++ b/test/intrinsics/gen/textureGather/e1b67d.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(1)]] var arg_1: texture_cube<u32>;
-[[group(1), binding(2)]] var arg_2: sampler;
+@group(1) @binding(1) var arg_1: texture_cube<u32>;
+@group(1) @binding(2) var arg_2: sampler;
 
 // fn textureGather(component: i32, texture: texture_cube<u32>, sampler: sampler, coords: vec3<f32>) -> vec4<u32>
 fn textureGather_e1b67d() {
   var res: vec4<u32> = textureGather(1, arg_1, arg_2, vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_e1b67d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_e1b67d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_e1b67d();
 }
diff --git a/test/intrinsics/gen/textureGather/e1b67d.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/e1b67d.wgsl.expected.wgsl
index 125d649..4f60ac7 100644
--- a/test/intrinsics/gen/textureGather/e1b67d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/e1b67d.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(1)]] var arg_1 : texture_cube<u32>;
+@group(1) @binding(1) var arg_1 : texture_cube<u32>;
 
-[[group(1), binding(2)]] var arg_2 : sampler;
+@group(1) @binding(2) var arg_2 : sampler;
 
 fn textureGather_e1b67d() {
   var res : vec4<u32> = textureGather(1, arg_1, arg_2, vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_e1b67d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_e1b67d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_e1b67d();
 }
diff --git a/test/intrinsics/gen/textureGather/e9eff6.wgsl b/test/intrinsics/gen/textureGather/e9eff6.wgsl
index 02702a4..b0477f9 100644
--- a/test/intrinsics/gen/textureGather/e9eff6.wgsl
+++ b/test/intrinsics/gen/textureGather/e9eff6.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(1)]] var arg_1: texture_2d<u32>;
-[[group(1), binding(2)]] var arg_2: sampler;
+@group(1) @binding(1) var arg_1: texture_2d<u32>;
+@group(1) @binding(2) var arg_2: sampler;
 
 // fn textureGather(component: i32, texture: texture_2d<u32>, sampler: sampler, coords: vec2<f32>) -> vec4<u32>
 fn textureGather_e9eff6() {
   var res: vec4<u32> = textureGather(1, arg_1, arg_2, vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_e9eff6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_e9eff6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_e9eff6();
 }
diff --git a/test/intrinsics/gen/textureGather/e9eff6.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/e9eff6.wgsl.expected.wgsl
index 1f11f53..708a011 100644
--- a/test/intrinsics/gen/textureGather/e9eff6.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/e9eff6.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(1)]] var arg_1 : texture_2d<u32>;
+@group(1) @binding(1) var arg_1 : texture_2d<u32>;
 
-[[group(1), binding(2)]] var arg_2 : sampler;
+@group(1) @binding(2) var arg_2 : sampler;
 
 fn textureGather_e9eff6() {
   var res : vec4<u32> = textureGather(1, arg_1, arg_2, vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_e9eff6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_e9eff6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_e9eff6();
 }
diff --git a/test/intrinsics/gen/textureGather/f5f3ba.wgsl b/test/intrinsics/gen/textureGather/f5f3ba.wgsl
index 9b998b4..f263256 100644
--- a/test/intrinsics/gen/textureGather/f5f3ba.wgsl
+++ b/test/intrinsics/gen/textureGather/f5f3ba.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(1)]] var arg_1: texture_2d_array<u32>;
-[[group(1), binding(2)]] var arg_2: sampler;
+@group(1) @binding(1) var arg_1: texture_2d_array<u32>;
+@group(1) @binding(2) var arg_2: sampler;
 
 // fn textureGather(component: i32, texture: texture_2d_array<u32>, sampler: sampler, coords: vec2<f32>, array_index: i32, offset: vec2<i32>) -> vec4<u32>
 fn textureGather_f5f3ba() {
   var res: vec4<u32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_f5f3ba();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_f5f3ba();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_f5f3ba();
 }
diff --git a/test/intrinsics/gen/textureGather/f5f3ba.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/f5f3ba.wgsl.expected.wgsl
index 0505f50..b5ddcdc 100644
--- a/test/intrinsics/gen/textureGather/f5f3ba.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/f5f3ba.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(1)]] var arg_1 : texture_2d_array<u32>;
+@group(1) @binding(1) var arg_1 : texture_2d_array<u32>;
 
-[[group(1), binding(2)]] var arg_2 : sampler;
+@group(1) @binding(2) var arg_2 : sampler;
 
 fn textureGather_f5f3ba() {
   var res : vec4<u32> = textureGather(1, arg_1, arg_2, vec2<f32>(), 1, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_f5f3ba();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_f5f3ba();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_f5f3ba();
 }
diff --git a/test/intrinsics/gen/textureGather/f7995a.wgsl b/test/intrinsics/gen/textureGather/f7995a.wgsl
index b4f7aac..19c42fc 100644
--- a/test/intrinsics/gen/textureGather/f7995a.wgsl
+++ b/test/intrinsics/gen/textureGather/f7995a.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(1)]] var arg_1: texture_cube<i32>;
-[[group(1), binding(2)]] var arg_2: sampler;
+@group(1) @binding(1) var arg_1: texture_cube<i32>;
+@group(1) @binding(2) var arg_2: sampler;
 
 // fn textureGather(component: i32, texture: texture_cube<i32>, sampler: sampler, coords: vec3<f32>) -> vec4<i32>
 fn textureGather_f7995a() {
   var res: vec4<i32> = textureGather(1, arg_1, arg_2, vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_f7995a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_f7995a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_f7995a();
 }
diff --git a/test/intrinsics/gen/textureGather/f7995a.wgsl.expected.wgsl b/test/intrinsics/gen/textureGather/f7995a.wgsl.expected.wgsl
index 273f599..59c890e 100644
--- a/test/intrinsics/gen/textureGather/f7995a.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGather/f7995a.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(1)]] var arg_1 : texture_cube<i32>;
+@group(1) @binding(1) var arg_1 : texture_cube<i32>;
 
-[[group(1), binding(2)]] var arg_2 : sampler;
+@group(1) @binding(2) var arg_2 : sampler;
 
 fn textureGather_f7995a() {
   var res : vec4<i32> = textureGather(1, arg_1, arg_2, vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGather_f7995a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGather_f7995a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGather_f7995a();
 }
diff --git a/test/intrinsics/gen/textureGatherCompare/182fd4.wgsl b/test/intrinsics/gen/textureGatherCompare/182fd4.wgsl
index 732eb5a..afaaa84 100644
--- a/test/intrinsics/gen/textureGatherCompare/182fd4.wgsl
+++ b/test/intrinsics/gen/textureGatherCompare/182fd4.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_cube;
-[[group(1), binding(1)]] var arg_1: sampler_comparison;
+@group(1) @binding(0) var arg_0: texture_depth_cube;
+@group(1) @binding(1) var arg_1: sampler_comparison;
 
 // fn textureGatherCompare(texture: texture_depth_cube, sampler: sampler_comparison, coords: vec3<f32>, depth_ref: f32) -> vec4<f32>
 fn textureGatherCompare_182fd4() {
   var res: vec4<f32> = textureGatherCompare(arg_0, arg_1, vec3<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGatherCompare_182fd4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGatherCompare_182fd4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGatherCompare_182fd4();
 }
diff --git a/test/intrinsics/gen/textureGatherCompare/182fd4.wgsl.expected.wgsl b/test/intrinsics/gen/textureGatherCompare/182fd4.wgsl.expected.wgsl
index f04178c..3a4d029 100644
--- a/test/intrinsics/gen/textureGatherCompare/182fd4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGatherCompare/182fd4.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_cube;
+@group(1) @binding(0) var arg_0 : texture_depth_cube;
 
-[[group(1), binding(1)]] var arg_1 : sampler_comparison;
+@group(1) @binding(1) var arg_1 : sampler_comparison;
 
 fn textureGatherCompare_182fd4() {
   var res : vec4<f32> = textureGatherCompare(arg_0, arg_1, vec3<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGatherCompare_182fd4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGatherCompare_182fd4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGatherCompare_182fd4();
 }
diff --git a/test/intrinsics/gen/textureGatherCompare/60d2d1.wgsl b/test/intrinsics/gen/textureGatherCompare/60d2d1.wgsl
index fcb9b53..53ed423 100644
--- a/test/intrinsics/gen/textureGatherCompare/60d2d1.wgsl
+++ b/test/intrinsics/gen/textureGatherCompare/60d2d1.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_cube_array;
-[[group(1), binding(1)]] var arg_1: sampler_comparison;
+@group(1) @binding(0) var arg_0: texture_depth_cube_array;
+@group(1) @binding(1) var arg_1: sampler_comparison;
 
 // fn textureGatherCompare(texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: i32, depth_ref: f32) -> vec4<f32>
 fn textureGatherCompare_60d2d1() {
   var res: vec4<f32> = textureGatherCompare(arg_0, arg_1, vec3<f32>(), 1, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGatherCompare_60d2d1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGatherCompare_60d2d1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGatherCompare_60d2d1();
 }
diff --git a/test/intrinsics/gen/textureGatherCompare/60d2d1.wgsl.expected.wgsl b/test/intrinsics/gen/textureGatherCompare/60d2d1.wgsl.expected.wgsl
index 005cc8d..e22b1fc 100644
--- a/test/intrinsics/gen/textureGatherCompare/60d2d1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGatherCompare/60d2d1.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_cube_array;
+@group(1) @binding(0) var arg_0 : texture_depth_cube_array;
 
-[[group(1), binding(1)]] var arg_1 : sampler_comparison;
+@group(1) @binding(1) var arg_1 : sampler_comparison;
 
 fn textureGatherCompare_60d2d1() {
   var res : vec4<f32> = textureGatherCompare(arg_0, arg_1, vec3<f32>(), 1, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGatherCompare_60d2d1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGatherCompare_60d2d1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGatherCompare_60d2d1();
 }
diff --git a/test/intrinsics/gen/textureGatherCompare/6d9352.wgsl b/test/intrinsics/gen/textureGatherCompare/6d9352.wgsl
index 16611ce..5a577ba 100644
--- a/test/intrinsics/gen/textureGatherCompare/6d9352.wgsl
+++ b/test/intrinsics/gen/textureGatherCompare/6d9352.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d;
-[[group(1), binding(1)]] var arg_1: sampler_comparison;
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler_comparison;
 
 // fn textureGatherCompare(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32) -> vec4<f32>
 fn textureGatherCompare_6d9352() {
   var res: vec4<f32> = textureGatherCompare(arg_0, arg_1, vec2<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGatherCompare_6d9352();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGatherCompare_6d9352();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGatherCompare_6d9352();
 }
diff --git a/test/intrinsics/gen/textureGatherCompare/6d9352.wgsl.expected.wgsl b/test/intrinsics/gen/textureGatherCompare/6d9352.wgsl.expected.wgsl
index de6fa2c..6fc40ce 100644
--- a/test/intrinsics/gen/textureGatherCompare/6d9352.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGatherCompare/6d9352.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_2d;
 
-[[group(1), binding(1)]] var arg_1 : sampler_comparison;
+@group(1) @binding(1) var arg_1 : sampler_comparison;
 
 fn textureGatherCompare_6d9352() {
   var res : vec4<f32> = textureGatherCompare(arg_0, arg_1, vec2<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGatherCompare_6d9352();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGatherCompare_6d9352();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGatherCompare_6d9352();
 }
diff --git a/test/intrinsics/gen/textureGatherCompare/6f1267.wgsl b/test/intrinsics/gen/textureGatherCompare/6f1267.wgsl
index b2eb4b7..c71a699 100644
--- a/test/intrinsics/gen/textureGatherCompare/6f1267.wgsl
+++ b/test/intrinsics/gen/textureGatherCompare/6f1267.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d_array;
-[[group(1), binding(1)]] var arg_1: sampler_comparison;
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler_comparison;
 
 // fn textureGatherCompare(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: i32, depth_ref: f32, offset: vec2<i32>) -> vec4<f32>
 fn textureGatherCompare_6f1267() {
   var res: vec4<f32> = textureGatherCompare(arg_0, arg_1, vec2<f32>(), 1, 1.0, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGatherCompare_6f1267();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGatherCompare_6f1267();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGatherCompare_6f1267();
 }
diff --git a/test/intrinsics/gen/textureGatherCompare/6f1267.wgsl.expected.wgsl b/test/intrinsics/gen/textureGatherCompare/6f1267.wgsl.expected.wgsl
index 096891c..19e782d 100644
--- a/test/intrinsics/gen/textureGatherCompare/6f1267.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGatherCompare/6f1267.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d_array;
+@group(1) @binding(0) var arg_0 : texture_depth_2d_array;
 
-[[group(1), binding(1)]] var arg_1 : sampler_comparison;
+@group(1) @binding(1) var arg_1 : sampler_comparison;
 
 fn textureGatherCompare_6f1267() {
   var res : vec4<f32> = textureGatherCompare(arg_0, arg_1, vec2<f32>(), 1, 1.0, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGatherCompare_6f1267();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGatherCompare_6f1267();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGatherCompare_6f1267();
 }
diff --git a/test/intrinsics/gen/textureGatherCompare/783e65.wgsl b/test/intrinsics/gen/textureGatherCompare/783e65.wgsl
index f10cee1..8bd4779 100644
--- a/test/intrinsics/gen/textureGatherCompare/783e65.wgsl
+++ b/test/intrinsics/gen/textureGatherCompare/783e65.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d_array;
-[[group(1), binding(1)]] var arg_1: sampler_comparison;
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler_comparison;
 
 // fn textureGatherCompare(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: i32, depth_ref: f32) -> vec4<f32>
 fn textureGatherCompare_783e65() {
   var res: vec4<f32> = textureGatherCompare(arg_0, arg_1, vec2<f32>(), 1, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGatherCompare_783e65();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGatherCompare_783e65();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGatherCompare_783e65();
 }
diff --git a/test/intrinsics/gen/textureGatherCompare/783e65.wgsl.expected.wgsl b/test/intrinsics/gen/textureGatherCompare/783e65.wgsl.expected.wgsl
index 0ee58ce..9800261 100644
--- a/test/intrinsics/gen/textureGatherCompare/783e65.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGatherCompare/783e65.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d_array;
+@group(1) @binding(0) var arg_0 : texture_depth_2d_array;
 
-[[group(1), binding(1)]] var arg_1 : sampler_comparison;
+@group(1) @binding(1) var arg_1 : sampler_comparison;
 
 fn textureGatherCompare_783e65() {
   var res : vec4<f32> = textureGatherCompare(arg_0, arg_1, vec2<f32>(), 1, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGatherCompare_783e65();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGatherCompare_783e65();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGatherCompare_783e65();
 }
diff --git a/test/intrinsics/gen/textureGatherCompare/a5f587.wgsl b/test/intrinsics/gen/textureGatherCompare/a5f587.wgsl
index 803c4f1..b8a2718 100644
--- a/test/intrinsics/gen/textureGatherCompare/a5f587.wgsl
+++ b/test/intrinsics/gen/textureGatherCompare/a5f587.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d;
-[[group(1), binding(1)]] var arg_1: sampler_comparison;
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler_comparison;
 
 // fn textureGatherCompare(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32, offset: vec2<i32>) -> vec4<f32>
 fn textureGatherCompare_a5f587() {
   var res: vec4<f32> = textureGatherCompare(arg_0, arg_1, vec2<f32>(), 1.0, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGatherCompare_a5f587();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGatherCompare_a5f587();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGatherCompare_a5f587();
 }
diff --git a/test/intrinsics/gen/textureGatherCompare/a5f587.wgsl.expected.wgsl b/test/intrinsics/gen/textureGatherCompare/a5f587.wgsl.expected.wgsl
index 9590326..44b3cf1 100644
--- a/test/intrinsics/gen/textureGatherCompare/a5f587.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureGatherCompare/a5f587.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_2d;
 
-[[group(1), binding(1)]] var arg_1 : sampler_comparison;
+@group(1) @binding(1) var arg_1 : sampler_comparison;
 
 fn textureGatherCompare_a5f587() {
   var res : vec4<f32> = textureGatherCompare(arg_0, arg_1, vec2<f32>(), 1.0, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureGatherCompare_a5f587();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureGatherCompare_a5f587();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureGatherCompare_a5f587();
 }
diff --git a/test/intrinsics/gen/textureLoad/19cf87.wgsl b/test/intrinsics/gen/textureLoad/19cf87.wgsl
index d650031..609ce46 100644
--- a/test/intrinsics/gen/textureLoad/19cf87.wgsl
+++ b/test/intrinsics/gen/textureLoad/19cf87.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d;
+@group(1) @binding(0) var arg_0: texture_depth_2d;
 
 // fn textureLoad(texture: texture_depth_2d, coords: vec2<i32>, level: i32) -> f32
 fn textureLoad_19cf87() {
   var res: f32 = textureLoad(arg_0, vec2<i32>(), 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_19cf87();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_19cf87();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_19cf87();
 }
diff --git a/test/intrinsics/gen/textureLoad/19cf87.wgsl.expected.wgsl b/test/intrinsics/gen/textureLoad/19cf87.wgsl.expected.wgsl
index ec9ae1e..886136a 100644
--- a/test/intrinsics/gen/textureLoad/19cf87.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureLoad/19cf87.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_2d;
 
 fn textureLoad_19cf87() {
   var res : f32 = textureLoad(arg_0, vec2<i32>(), 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_19cf87();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_19cf87();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_19cf87();
 }
diff --git a/test/intrinsics/gen/textureLoad/1b8588.wgsl b/test/intrinsics/gen/textureLoad/1b8588.wgsl
index 3801d85..80a4cae 100644
--- a/test/intrinsics/gen/textureLoad/1b8588.wgsl
+++ b/test/intrinsics/gen/textureLoad/1b8588.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_1d<u32>;
+@group(1) @binding(0) var arg_0: texture_1d<u32>;
 
 // fn textureLoad(texture: texture_1d<u32>, coords: i32, level: i32) -> vec4<u32>
 fn textureLoad_1b8588() {
   var res: vec4<u32> = textureLoad(arg_0, 1, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_1b8588();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_1b8588();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_1b8588();
 }
diff --git a/test/intrinsics/gen/textureLoad/1b8588.wgsl.expected.wgsl b/test/intrinsics/gen/textureLoad/1b8588.wgsl.expected.wgsl
index 58a627c..07481f8 100644
--- a/test/intrinsics/gen/textureLoad/1b8588.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureLoad/1b8588.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_1d<u32>;
+@group(1) @binding(0) var arg_0 : texture_1d<u32>;
 
 fn textureLoad_1b8588() {
   var res : vec4<u32> = textureLoad(arg_0, 1, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_1b8588();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_1b8588();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_1b8588();
 }
diff --git a/test/intrinsics/gen/textureLoad/1f2016.wgsl b/test/intrinsics/gen/textureLoad/1f2016.wgsl
index c95d6d1..9e3a286 100644
--- a/test/intrinsics/gen/textureLoad/1f2016.wgsl
+++ b/test/intrinsics/gen/textureLoad/1f2016.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_3d<f32>;
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
 
 // fn textureLoad(texture: texture_3d<f32>, coords: vec3<i32>, level: i32) -> vec4<f32>
 fn textureLoad_1f2016() {
   var res: vec4<f32> = textureLoad(arg_0, vec3<i32>(), 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_1f2016();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_1f2016();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_1f2016();
 }
diff --git a/test/intrinsics/gen/textureLoad/1f2016.wgsl.expected.wgsl b/test/intrinsics/gen/textureLoad/1f2016.wgsl.expected.wgsl
index 70c8e62..910f641 100644
--- a/test/intrinsics/gen/textureLoad/1f2016.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureLoad/1f2016.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_3d<f32>;
+@group(1) @binding(0) var arg_0 : texture_3d<f32>;
 
 fn textureLoad_1f2016() {
   var res : vec4<f32> = textureLoad(arg_0, vec3<i32>(), 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_1f2016();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_1f2016();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_1f2016();
 }
diff --git a/test/intrinsics/gen/textureLoad/484344.wgsl b/test/intrinsics/gen/textureLoad/484344.wgsl
index 37b5a5f..920d8e0 100644
--- a/test/intrinsics/gen/textureLoad/484344.wgsl
+++ b/test/intrinsics/gen/textureLoad/484344.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d<f32>;
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
 
 // fn textureLoad(texture: texture_2d<f32>, coords: vec2<i32>, level: i32) -> vec4<f32>
 fn textureLoad_484344() {
   var res: vec4<f32> = textureLoad(arg_0, vec2<i32>(), 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_484344();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_484344();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_484344();
 }
diff --git a/test/intrinsics/gen/textureLoad/484344.wgsl.expected.wgsl b/test/intrinsics/gen/textureLoad/484344.wgsl.expected.wgsl
index d198e1e..e87d195 100644
--- a/test/intrinsics/gen/textureLoad/484344.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureLoad/484344.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d<f32>;
 
 fn textureLoad_484344() {
   var res : vec4<f32> = textureLoad(arg_0, vec2<i32>(), 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_484344();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_484344();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_484344();
 }
diff --git a/test/intrinsics/gen/textureLoad/4fd803.wgsl b/test/intrinsics/gen/textureLoad/4fd803.wgsl
index bde90c7..d309c2b 100644
--- a/test/intrinsics/gen/textureLoad/4fd803.wgsl
+++ b/test/intrinsics/gen/textureLoad/4fd803.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_3d<i32>;
+@group(1) @binding(0) var arg_0: texture_3d<i32>;
 
 // fn textureLoad(texture: texture_3d<i32>, coords: vec3<i32>, level: i32) -> vec4<i32>
 fn textureLoad_4fd803() {
   var res: vec4<i32> = textureLoad(arg_0, vec3<i32>(), 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_4fd803();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_4fd803();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_4fd803();
 }
diff --git a/test/intrinsics/gen/textureLoad/4fd803.wgsl.expected.wgsl b/test/intrinsics/gen/textureLoad/4fd803.wgsl.expected.wgsl
index 08653d9..c4f10d6 100644
--- a/test/intrinsics/gen/textureLoad/4fd803.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureLoad/4fd803.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_3d<i32>;
+@group(1) @binding(0) var arg_0 : texture_3d<i32>;
 
 fn textureLoad_4fd803() {
   var res : vec4<i32> = textureLoad(arg_0, vec3<i32>(), 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_4fd803();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_4fd803();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_4fd803();
 }
diff --git a/test/intrinsics/gen/textureLoad/5a2f9d.wgsl b/test/intrinsics/gen/textureLoad/5a2f9d.wgsl
index 5fd2dcc..5f19cb5 100644
--- a/test/intrinsics/gen/textureLoad/5a2f9d.wgsl
+++ b/test/intrinsics/gen/textureLoad/5a2f9d.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_1d<i32>;
+@group(1) @binding(0) var arg_0: texture_1d<i32>;
 
 // fn textureLoad(texture: texture_1d<i32>, coords: i32, level: i32) -> vec4<i32>
 fn textureLoad_5a2f9d() {
   var res: vec4<i32> = textureLoad(arg_0, 1, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_5a2f9d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_5a2f9d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_5a2f9d();
 }
diff --git a/test/intrinsics/gen/textureLoad/5a2f9d.wgsl.expected.wgsl b/test/intrinsics/gen/textureLoad/5a2f9d.wgsl.expected.wgsl
index ecaf9a0..3e02059 100644
--- a/test/intrinsics/gen/textureLoad/5a2f9d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureLoad/5a2f9d.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_1d<i32>;
+@group(1) @binding(0) var arg_0 : texture_1d<i32>;
 
 fn textureLoad_5a2f9d() {
   var res : vec4<i32> = textureLoad(arg_0, 1, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_5a2f9d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_5a2f9d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_5a2f9d();
 }
diff --git a/test/intrinsics/gen/textureLoad/6154d4.wgsl b/test/intrinsics/gen/textureLoad/6154d4.wgsl
index 5786c34..ba6d633 100644
--- a/test/intrinsics/gen/textureLoad/6154d4.wgsl
+++ b/test/intrinsics/gen/textureLoad/6154d4.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d<u32>;
+@group(1) @binding(0) var arg_0: texture_2d<u32>;
 
 // fn textureLoad(texture: texture_2d<u32>, coords: vec2<i32>, level: i32) -> vec4<u32>
 fn textureLoad_6154d4() {
   var res: vec4<u32> = textureLoad(arg_0, vec2<i32>(), 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_6154d4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_6154d4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_6154d4();
 }
diff --git a/test/intrinsics/gen/textureLoad/6154d4.wgsl.expected.wgsl b/test/intrinsics/gen/textureLoad/6154d4.wgsl.expected.wgsl
index 64e28d7..811bfc6 100644
--- a/test/intrinsics/gen/textureLoad/6154d4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureLoad/6154d4.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d<u32>;
+@group(1) @binding(0) var arg_0 : texture_2d<u32>;
 
 fn textureLoad_6154d4() {
   var res : vec4<u32> = textureLoad(arg_0, vec2<i32>(), 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_6154d4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_6154d4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_6154d4();
 }
diff --git a/test/intrinsics/gen/textureLoad/6273b1.wgsl b/test/intrinsics/gen/textureLoad/6273b1.wgsl
index 600fb45..944e5a3 100644
--- a/test/intrinsics/gen/textureLoad/6273b1.wgsl
+++ b/test/intrinsics/gen/textureLoad/6273b1.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_multisampled_2d;
+@group(1) @binding(0) var arg_0: texture_depth_multisampled_2d;
 
 // fn textureLoad(texture: texture_depth_multisampled_2d, coords: vec2<i32>, sample_index: i32) -> f32
 fn textureLoad_6273b1() {
   var res: f32 = textureLoad(arg_0, vec2<i32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_6273b1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_6273b1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_6273b1();
 }
diff --git a/test/intrinsics/gen/textureLoad/6273b1.wgsl.expected.wgsl b/test/intrinsics/gen/textureLoad/6273b1.wgsl.expected.wgsl
index 9d21c59..ec3f25b 100644
--- a/test/intrinsics/gen/textureLoad/6273b1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureLoad/6273b1.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_multisampled_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_multisampled_2d;
 
 fn textureLoad_6273b1() {
   var res : f32 = textureLoad(arg_0, vec2<i32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_6273b1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_6273b1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_6273b1();
 }
diff --git a/test/intrinsics/gen/textureLoad/79e697.wgsl b/test/intrinsics/gen/textureLoad/79e697.wgsl
index 3ce2841..4ed308e 100644
--- a/test/intrinsics/gen/textureLoad/79e697.wgsl
+++ b/test/intrinsics/gen/textureLoad/79e697.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d_array<i32>;
+@group(1) @binding(0) var arg_0: texture_2d_array<i32>;
 
 // fn textureLoad(texture: texture_2d_array<i32>, coords: vec2<i32>, array_index: i32, level: i32) -> vec4<i32>
 fn textureLoad_79e697() {
   var res: vec4<i32> = textureLoad(arg_0, vec2<i32>(), 1, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_79e697();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_79e697();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_79e697();
 }
diff --git a/test/intrinsics/gen/textureLoad/79e697.wgsl.expected.wgsl b/test/intrinsics/gen/textureLoad/79e697.wgsl.expected.wgsl
index f93cbe0..3e26917 100644
--- a/test/intrinsics/gen/textureLoad/79e697.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureLoad/79e697.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d_array<i32>;
+@group(1) @binding(0) var arg_0 : texture_2d_array<i32>;
 
 fn textureLoad_79e697() {
   var res : vec4<i32> = textureLoad(arg_0, vec2<i32>(), 1, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_79e697();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_79e697();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_79e697();
 }
diff --git a/test/intrinsics/gen/textureLoad/7c90e5.wgsl b/test/intrinsics/gen/textureLoad/7c90e5.wgsl
index 3207c05..29da0dc 100644
--- a/test/intrinsics/gen/textureLoad/7c90e5.wgsl
+++ b/test/intrinsics/gen/textureLoad/7c90e5.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d_array<u32>;
+@group(1) @binding(0) var arg_0: texture_2d_array<u32>;
 
 // fn textureLoad(texture: texture_2d_array<u32>, coords: vec2<i32>, array_index: i32, level: i32) -> vec4<u32>
 fn textureLoad_7c90e5() {
   var res: vec4<u32> = textureLoad(arg_0, vec2<i32>(), 1, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_7c90e5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_7c90e5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_7c90e5();
 }
diff --git a/test/intrinsics/gen/textureLoad/7c90e5.wgsl.expected.wgsl b/test/intrinsics/gen/textureLoad/7c90e5.wgsl.expected.wgsl
index 779b955..3308f0f 100644
--- a/test/intrinsics/gen/textureLoad/7c90e5.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureLoad/7c90e5.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d_array<u32>;
+@group(1) @binding(0) var arg_0 : texture_2d_array<u32>;
 
 fn textureLoad_7c90e5() {
   var res : vec4<u32> = textureLoad(arg_0, vec2<i32>(), 1, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_7c90e5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_7c90e5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_7c90e5();
 }
diff --git a/test/intrinsics/gen/textureLoad/81c381.wgsl b/test/intrinsics/gen/textureLoad/81c381.wgsl
index 4c156c6..dccf1b8 100644
--- a/test/intrinsics/gen/textureLoad/81c381.wgsl
+++ b/test/intrinsics/gen/textureLoad/81c381.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_1d<f32>;
+@group(1) @binding(0) var arg_0: texture_1d<f32>;
 
 // fn textureLoad(texture: texture_1d<f32>, coords: i32, level: i32) -> vec4<f32>
 fn textureLoad_81c381() {
   var res: vec4<f32> = textureLoad(arg_0, 1, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_81c381();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_81c381();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_81c381();
 }
diff --git a/test/intrinsics/gen/textureLoad/81c381.wgsl.expected.wgsl b/test/intrinsics/gen/textureLoad/81c381.wgsl.expected.wgsl
index 0658863..7671a38 100644
--- a/test/intrinsics/gen/textureLoad/81c381.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureLoad/81c381.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_1d<f32>;
+@group(1) @binding(0) var arg_0 : texture_1d<f32>;
 
 fn textureLoad_81c381() {
   var res : vec4<f32> = textureLoad(arg_0, 1, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_81c381();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_81c381();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_81c381();
 }
diff --git a/test/intrinsics/gen/textureLoad/87be85.wgsl b/test/intrinsics/gen/textureLoad/87be85.wgsl
index 39366e5..b1124d7 100644
--- a/test/intrinsics/gen/textureLoad/87be85.wgsl
+++ b/test/intrinsics/gen/textureLoad/87be85.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d_array<f32>;
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
 
 // fn textureLoad(texture: texture_2d_array<f32>, coords: vec2<i32>, array_index: i32, level: i32) -> vec4<f32>
 fn textureLoad_87be85() {
   var res: vec4<f32> = textureLoad(arg_0, vec2<i32>(), 1, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_87be85();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_87be85();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_87be85();
 }
diff --git a/test/intrinsics/gen/textureLoad/87be85.wgsl.expected.wgsl b/test/intrinsics/gen/textureLoad/87be85.wgsl.expected.wgsl
index 4543559..febe014 100644
--- a/test/intrinsics/gen/textureLoad/87be85.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureLoad/87be85.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d_array<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d_array<f32>;
 
 fn textureLoad_87be85() {
   var res : vec4<f32> = textureLoad(arg_0, vec2<i32>(), 1, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_87be85();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_87be85();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_87be85();
 }
diff --git a/test/intrinsics/gen/textureLoad/8acf41.wgsl b/test/intrinsics/gen/textureLoad/8acf41.wgsl
index b19c731..effdecd 100644
--- a/test/intrinsics/gen/textureLoad/8acf41.wgsl
+++ b/test/intrinsics/gen/textureLoad/8acf41.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_external;
+@group(1) @binding(0) var arg_0: texture_external;
 
 // fn textureLoad(texture: texture_external, coords: vec2<i32>) -> vec4<f32>
 fn textureLoad_8acf41() {
   var res: vec4<f32> = textureLoad(arg_0, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_8acf41();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_8acf41();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_8acf41();
 }
diff --git a/test/intrinsics/gen/textureLoad/8acf41.wgsl.expected.wgsl b/test/intrinsics/gen/textureLoad/8acf41.wgsl.expected.wgsl
index 769efb3..a25ef5f 100644
--- a/test/intrinsics/gen/textureLoad/8acf41.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureLoad/8acf41.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_external;
+@group(1) @binding(0) var arg_0 : texture_external;
 
 fn textureLoad_8acf41() {
   var res : vec4<f32> = textureLoad(arg_0, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_8acf41();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_8acf41();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_8acf41();
 }
diff --git a/test/intrinsics/gen/textureLoad/9b2667.wgsl b/test/intrinsics/gen/textureLoad/9b2667.wgsl
index 0e09fa4..4372cdb 100644
--- a/test/intrinsics/gen/textureLoad/9b2667.wgsl
+++ b/test/intrinsics/gen/textureLoad/9b2667.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d_array;
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
 
 // fn textureLoad(texture: texture_depth_2d_array, coords: vec2<i32>, array_index: i32, level: i32) -> f32
 fn textureLoad_9b2667() {
   var res: f32 = textureLoad(arg_0, vec2<i32>(), 1, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_9b2667();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_9b2667();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_9b2667();
 }
diff --git a/test/intrinsics/gen/textureLoad/9b2667.wgsl.expected.wgsl b/test/intrinsics/gen/textureLoad/9b2667.wgsl.expected.wgsl
index 271bb61..5d857d0 100644
--- a/test/intrinsics/gen/textureLoad/9b2667.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureLoad/9b2667.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d_array;
+@group(1) @binding(0) var arg_0 : texture_depth_2d_array;
 
 fn textureLoad_9b2667() {
   var res : f32 = textureLoad(arg_0, vec2<i32>(), 1, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_9b2667();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_9b2667();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_9b2667();
 }
diff --git a/test/intrinsics/gen/textureLoad/a583c9.wgsl b/test/intrinsics/gen/textureLoad/a583c9.wgsl
index 39adb02..5f67c51 100644
--- a/test/intrinsics/gen/textureLoad/a583c9.wgsl
+++ b/test/intrinsics/gen/textureLoad/a583c9.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_multisampled_2d<f32>;
+@group(1) @binding(0) var arg_0: texture_multisampled_2d<f32>;
 
 // fn textureLoad(texture: texture_multisampled_2d<f32>, coords: vec2<i32>, sample_index: i32) -> vec4<f32>
 fn textureLoad_a583c9() {
   var res: vec4<f32> = textureLoad(arg_0, vec2<i32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_a583c9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_a583c9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_a583c9();
 }
diff --git a/test/intrinsics/gen/textureLoad/a583c9.wgsl.expected.wgsl b/test/intrinsics/gen/textureLoad/a583c9.wgsl.expected.wgsl
index 0ffac21..1b4fb0f 100644
--- a/test/intrinsics/gen/textureLoad/a583c9.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureLoad/a583c9.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_multisampled_2d<f32>;
+@group(1) @binding(0) var arg_0 : texture_multisampled_2d<f32>;
 
 fn textureLoad_a583c9() {
   var res : vec4<f32> = textureLoad(arg_0, vec2<i32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_a583c9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_a583c9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_a583c9();
 }
diff --git a/test/intrinsics/gen/textureLoad/a9a9f5.wgsl b/test/intrinsics/gen/textureLoad/a9a9f5.wgsl
index 58ebcd2..236927b 100644
--- a/test/intrinsics/gen/textureLoad/a9a9f5.wgsl
+++ b/test/intrinsics/gen/textureLoad/a9a9f5.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_3d<u32>;
+@group(1) @binding(0) var arg_0: texture_3d<u32>;
 
 // fn textureLoad(texture: texture_3d<u32>, coords: vec3<i32>, level: i32) -> vec4<u32>
 fn textureLoad_a9a9f5() {
   var res: vec4<u32> = textureLoad(arg_0, vec3<i32>(), 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_a9a9f5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_a9a9f5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_a9a9f5();
 }
diff --git a/test/intrinsics/gen/textureLoad/a9a9f5.wgsl.expected.wgsl b/test/intrinsics/gen/textureLoad/a9a9f5.wgsl.expected.wgsl
index 0a21560..ac36fdc 100644
--- a/test/intrinsics/gen/textureLoad/a9a9f5.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureLoad/a9a9f5.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_3d<u32>;
+@group(1) @binding(0) var arg_0 : texture_3d<u32>;
 
 fn textureLoad_a9a9f5() {
   var res : vec4<u32> = textureLoad(arg_0, vec3<i32>(), 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_a9a9f5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_a9a9f5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_a9a9f5();
 }
diff --git a/test/intrinsics/gen/textureLoad/c2a480.wgsl b/test/intrinsics/gen/textureLoad/c2a480.wgsl
index f9149e7..6aa17f7 100644
--- a/test/intrinsics/gen/textureLoad/c2a480.wgsl
+++ b/test/intrinsics/gen/textureLoad/c2a480.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d<i32>;
+@group(1) @binding(0) var arg_0: texture_2d<i32>;
 
 // fn textureLoad(texture: texture_2d<i32>, coords: vec2<i32>, level: i32) -> vec4<i32>
 fn textureLoad_c2a480() {
   var res: vec4<i32> = textureLoad(arg_0, vec2<i32>(), 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_c2a480();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_c2a480();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_c2a480();
 }
diff --git a/test/intrinsics/gen/textureLoad/c2a480.wgsl.expected.wgsl b/test/intrinsics/gen/textureLoad/c2a480.wgsl.expected.wgsl
index e8cee3f..ce9e2c7 100644
--- a/test/intrinsics/gen/textureLoad/c2a480.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureLoad/c2a480.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d<i32>;
+@group(1) @binding(0) var arg_0 : texture_2d<i32>;
 
 fn textureLoad_c2a480() {
   var res : vec4<i32> = textureLoad(arg_0, vec2<i32>(), 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_c2a480();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_c2a480();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_c2a480();
 }
diff --git a/test/intrinsics/gen/textureLoad/c378ee.wgsl b/test/intrinsics/gen/textureLoad/c378ee.wgsl
index 7a31013..2ddc52a 100644
--- a/test/intrinsics/gen/textureLoad/c378ee.wgsl
+++ b/test/intrinsics/gen/textureLoad/c378ee.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_multisampled_2d<u32>;
+@group(1) @binding(0) var arg_0: texture_multisampled_2d<u32>;
 
 // fn textureLoad(texture: texture_multisampled_2d<u32>, coords: vec2<i32>, sample_index: i32) -> vec4<u32>
 fn textureLoad_c378ee() {
   var res: vec4<u32> = textureLoad(arg_0, vec2<i32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_c378ee();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_c378ee();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_c378ee();
 }
diff --git a/test/intrinsics/gen/textureLoad/c378ee.wgsl.expected.wgsl b/test/intrinsics/gen/textureLoad/c378ee.wgsl.expected.wgsl
index 0a7ba1a..d47f756 100644
--- a/test/intrinsics/gen/textureLoad/c378ee.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureLoad/c378ee.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_multisampled_2d<u32>;
+@group(1) @binding(0) var arg_0 : texture_multisampled_2d<u32>;
 
 fn textureLoad_c378ee() {
   var res : vec4<u32> = textureLoad(arg_0, vec2<i32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_c378ee();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_c378ee();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_c378ee();
 }
diff --git a/test/intrinsics/gen/textureLoad/e3d2cc.wgsl b/test/intrinsics/gen/textureLoad/e3d2cc.wgsl
index 3450bb6..65b9d17 100644
--- a/test/intrinsics/gen/textureLoad/e3d2cc.wgsl
+++ b/test/intrinsics/gen/textureLoad/e3d2cc.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_multisampled_2d<i32>;
+@group(1) @binding(0) var arg_0: texture_multisampled_2d<i32>;
 
 // fn textureLoad(texture: texture_multisampled_2d<i32>, coords: vec2<i32>, sample_index: i32) -> vec4<i32>
 fn textureLoad_e3d2cc() {
   var res: vec4<i32> = textureLoad(arg_0, vec2<i32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_e3d2cc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_e3d2cc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_e3d2cc();
 }
diff --git a/test/intrinsics/gen/textureLoad/e3d2cc.wgsl.expected.wgsl b/test/intrinsics/gen/textureLoad/e3d2cc.wgsl.expected.wgsl
index b77d037..f8a1af7 100644
--- a/test/intrinsics/gen/textureLoad/e3d2cc.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureLoad/e3d2cc.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_multisampled_2d<i32>;
+@group(1) @binding(0) var arg_0 : texture_multisampled_2d<i32>;
 
 fn textureLoad_e3d2cc() {
   var res : vec4<i32> = textureLoad(arg_0, vec2<i32>(), 1);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureLoad_e3d2cc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureLoad_e3d2cc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureLoad_e3d2cc();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/024820.wgsl b/test/intrinsics/gen/textureNumLayers/024820.wgsl
index c8b519d..e0ad9de 100644
--- a/test/intrinsics/gen/textureNumLayers/024820.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/024820.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d_array<f32>;
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
 
 // fn textureNumLayers(texture: texture_2d_array<f32>) -> i32
 fn textureNumLayers_024820() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_024820();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_024820();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_024820();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/024820.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/024820.wgsl.expected.wgsl
index 7725c8a..f58c93c 100644
--- a/test/intrinsics/gen/textureNumLayers/024820.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/024820.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d_array<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d_array<f32>;
 
 fn textureNumLayers_024820() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_024820();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_024820();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_024820();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/053df7.wgsl b/test/intrinsics/gen/textureNumLayers/053df7.wgsl
index b8913be..dcb5cf3 100644
--- a/test/intrinsics/gen/textureNumLayers/053df7.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/053df7.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube_array<u32>;
+@group(1) @binding(0) var arg_0: texture_cube_array<u32>;
 
 // fn textureNumLayers(texture: texture_cube_array<u32>) -> i32
 fn textureNumLayers_053df7() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_053df7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_053df7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_053df7();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/053df7.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/053df7.wgsl.expected.wgsl
index 3184b30..fae44b9 100644
--- a/test/intrinsics/gen/textureNumLayers/053df7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/053df7.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube_array<u32>;
+@group(1) @binding(0) var arg_0 : texture_cube_array<u32>;
 
 fn textureNumLayers_053df7() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_053df7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_053df7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_053df7();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/058cc3.wgsl b/test/intrinsics/gen/textureNumLayers/058cc3.wgsl
index e884562..1897559 100644
--- a/test/intrinsics/gen/textureNumLayers/058cc3.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/058cc3.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rg32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32sint, write>;
 
 // fn textureNumLayers(texture: texture_storage_2d_array<rg32sint, write>) -> i32
 fn textureNumLayers_058cc3() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_058cc3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_058cc3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_058cc3();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/058cc3.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/058cc3.wgsl.expected.wgsl
index 6f96e17..ee5d2e0 100644
--- a/test/intrinsics/gen/textureNumLayers/058cc3.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/058cc3.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rg32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rg32sint, write>;
 
 fn textureNumLayers_058cc3() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_058cc3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_058cc3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_058cc3();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/09d05d.wgsl b/test/intrinsics/gen/textureNumLayers/09d05d.wgsl
index bdf8cfe..e39514f 100644
--- a/test/intrinsics/gen/textureNumLayers/09d05d.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/09d05d.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba8unorm, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8unorm, write>;
 
 // fn textureNumLayers(texture: texture_storage_2d_array<rgba8unorm, write>) -> i32
 fn textureNumLayers_09d05d() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_09d05d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_09d05d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_09d05d();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/09d05d.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/09d05d.wgsl.expected.wgsl
index db04a65..2034fa4 100644
--- a/test/intrinsics/gen/textureNumLayers/09d05d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/09d05d.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba8unorm, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8unorm, write>;
 
 fn textureNumLayers_09d05d() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_09d05d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_09d05d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_09d05d();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/13b4ce.wgsl b/test/intrinsics/gen/textureNumLayers/13b4ce.wgsl
index 31fc91a..f6361f1 100644
--- a/test/intrinsics/gen/textureNumLayers/13b4ce.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/13b4ce.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32sint, write>;
 
 // fn textureNumLayers(texture: texture_storage_2d_array<rgba32sint, write>) -> i32
 fn textureNumLayers_13b4ce() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_13b4ce();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_13b4ce();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_13b4ce();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/13b4ce.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/13b4ce.wgsl.expected.wgsl
index 2314463..5061e7e 100644
--- a/test/intrinsics/gen/textureNumLayers/13b4ce.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/13b4ce.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba32sint, write>;
 
 fn textureNumLayers_13b4ce() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_13b4ce();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_13b4ce();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_13b4ce();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/22e53b.wgsl b/test/intrinsics/gen/textureNumLayers/22e53b.wgsl
index 4c830ac..c9101c0 100644
--- a/test/intrinsics/gen/textureNumLayers/22e53b.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/22e53b.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<r32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32sint, write>;
 
 // fn textureNumLayers(texture: texture_storage_2d_array<r32sint, write>) -> i32
 fn textureNumLayers_22e53b() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_22e53b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_22e53b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_22e53b();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/22e53b.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/22e53b.wgsl.expected.wgsl
index f407b3f..6d9957b 100644
--- a/test/intrinsics/gen/textureNumLayers/22e53b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/22e53b.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<r32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<r32sint, write>;
 
 fn textureNumLayers_22e53b() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_22e53b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_22e53b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_22e53b();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/562013.wgsl b/test/intrinsics/gen/textureNumLayers/562013.wgsl
index 764c381..18c77ad 100644
--- a/test/intrinsics/gen/textureNumLayers/562013.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/562013.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba16float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16float, write>;
 
 // fn textureNumLayers(texture: texture_storage_2d_array<rgba16float, write>) -> i32
 fn textureNumLayers_562013() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_562013();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_562013();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_562013();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/562013.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/562013.wgsl.expected.wgsl
index c34ef1c..7223170 100644
--- a/test/intrinsics/gen/textureNumLayers/562013.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/562013.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba16float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba16float, write>;
 
 fn textureNumLayers_562013() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_562013();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_562013();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_562013();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/5d59cd.wgsl b/test/intrinsics/gen/textureNumLayers/5d59cd.wgsl
index 201defd2..2a0f4de 100644
--- a/test/intrinsics/gen/textureNumLayers/5d59cd.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/5d59cd.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube_array<f32>;
+@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
 
 // fn textureNumLayers(texture: texture_cube_array<f32>) -> i32
 fn textureNumLayers_5d59cd() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_5d59cd();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_5d59cd();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_5d59cd();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/5d59cd.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/5d59cd.wgsl.expected.wgsl
index 57e2cf6..170c763 100644
--- a/test/intrinsics/gen/textureNumLayers/5d59cd.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/5d59cd.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube_array<f32>;
+@group(1) @binding(0) var arg_0 : texture_cube_array<f32>;
 
 fn textureNumLayers_5d59cd() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_5d59cd();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_5d59cd();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_5d59cd();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/68a65b.wgsl b/test/intrinsics/gen/textureNumLayers/68a65b.wgsl
index 2832cf4..f551fc2 100644
--- a/test/intrinsics/gen/textureNumLayers/68a65b.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/68a65b.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32float, write>;
 
 // fn textureNumLayers(texture: texture_storage_2d_array<rgba32float, write>) -> i32
 fn textureNumLayers_68a65b() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_68a65b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_68a65b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_68a65b();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/68a65b.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/68a65b.wgsl.expected.wgsl
index 4aad50a..f358993 100644
--- a/test/intrinsics/gen/textureNumLayers/68a65b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/68a65b.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba32float, write>;
 
 fn textureNumLayers_68a65b() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_68a65b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_68a65b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_68a65b();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/778bd1.wgsl b/test/intrinsics/gen/textureNumLayers/778bd1.wgsl
index 4ca7348..ec88c84 100644
--- a/test/intrinsics/gen/textureNumLayers/778bd1.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/778bd1.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_cube_array;
+@group(1) @binding(0) var arg_0: texture_depth_cube_array;
 
 // fn textureNumLayers(texture: texture_depth_cube_array) -> i32
 fn textureNumLayers_778bd1() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_778bd1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_778bd1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_778bd1();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/778bd1.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/778bd1.wgsl.expected.wgsl
index d71f24b..c13e994 100644
--- a/test/intrinsics/gen/textureNumLayers/778bd1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/778bd1.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_cube_array;
+@group(1) @binding(0) var arg_0 : texture_depth_cube_array;
 
 fn textureNumLayers_778bd1() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_778bd1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_778bd1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_778bd1();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/7f1937.wgsl b/test/intrinsics/gen/textureNumLayers/7f1937.wgsl
index 581a2db..7652201 100644
--- a/test/intrinsics/gen/textureNumLayers/7f1937.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/7f1937.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rg32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32float, write>;
 
 // fn textureNumLayers(texture: texture_storage_2d_array<rg32float, write>) -> i32
 fn textureNumLayers_7f1937() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_7f1937();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_7f1937();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_7f1937();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/7f1937.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/7f1937.wgsl.expected.wgsl
index 279ac3c..4450ceb 100644
--- a/test/intrinsics/gen/textureNumLayers/7f1937.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/7f1937.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rg32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rg32float, write>;
 
 fn textureNumLayers_7f1937() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_7f1937();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_7f1937();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_7f1937();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/85f980.wgsl b/test/intrinsics/gen/textureNumLayers/85f980.wgsl
index 7f2e7ea..c91c09d 100644
--- a/test/intrinsics/gen/textureNumLayers/85f980.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/85f980.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube_array<i32>;
+@group(1) @binding(0) var arg_0: texture_cube_array<i32>;
 
 // fn textureNumLayers(texture: texture_cube_array<i32>) -> i32
 fn textureNumLayers_85f980() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_85f980();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_85f980();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_85f980();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/85f980.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/85f980.wgsl.expected.wgsl
index b7e09af..4dc70c7 100644
--- a/test/intrinsics/gen/textureNumLayers/85f980.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/85f980.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube_array<i32>;
+@group(1) @binding(0) var arg_0 : texture_cube_array<i32>;
 
 fn textureNumLayers_85f980() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_85f980();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_85f980();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_85f980();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/87953e.wgsl b/test/intrinsics/gen/textureNumLayers/87953e.wgsl
index 249897c..d4b3e5a 100644
--- a/test/intrinsics/gen/textureNumLayers/87953e.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/87953e.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d_array<u32>;
+@group(1) @binding(0) var arg_0: texture_2d_array<u32>;
 
 // fn textureNumLayers(texture: texture_2d_array<u32>) -> i32
 fn textureNumLayers_87953e() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_87953e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_87953e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_87953e();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/87953e.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/87953e.wgsl.expected.wgsl
index 49b2809..26f73ea 100644
--- a/test/intrinsics/gen/textureNumLayers/87953e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/87953e.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d_array<u32>;
+@group(1) @binding(0) var arg_0 : texture_2d_array<u32>;
 
 fn textureNumLayers_87953e() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_87953e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_87953e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_87953e();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/893e7c.wgsl b/test/intrinsics/gen/textureNumLayers/893e7c.wgsl
index 0f09f81..b00bdbd 100644
--- a/test/intrinsics/gen/textureNumLayers/893e7c.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/893e7c.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d_array<i32>;
+@group(1) @binding(0) var arg_0: texture_2d_array<i32>;
 
 // fn textureNumLayers(texture: texture_2d_array<i32>) -> i32
 fn textureNumLayers_893e7c() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_893e7c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_893e7c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_893e7c();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/893e7c.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/893e7c.wgsl.expected.wgsl
index 3e73652..3cda546 100644
--- a/test/intrinsics/gen/textureNumLayers/893e7c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/893e7c.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d_array<i32>;
+@group(1) @binding(0) var arg_0 : texture_2d_array<i32>;
 
 fn textureNumLayers_893e7c() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_893e7c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_893e7c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_893e7c();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/9700fb.wgsl b/test/intrinsics/gen/textureNumLayers/9700fb.wgsl
index 0bc05ec..474b691 100644
--- a/test/intrinsics/gen/textureNumLayers/9700fb.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/9700fb.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba16uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16uint, write>;
 
 // fn textureNumLayers(texture: texture_storage_2d_array<rgba16uint, write>) -> i32
 fn textureNumLayers_9700fb() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_9700fb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_9700fb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_9700fb();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/9700fb.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/9700fb.wgsl.expected.wgsl
index 21c77a5..ce6acab 100644
--- a/test/intrinsics/gen/textureNumLayers/9700fb.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/9700fb.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba16uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba16uint, write>;
 
 fn textureNumLayers_9700fb() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_9700fb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_9700fb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_9700fb();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/a216d2.wgsl b/test/intrinsics/gen/textureNumLayers/a216d2.wgsl
index 155ad27..f64da9e 100644
--- a/test/intrinsics/gen/textureNumLayers/a216d2.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/a216d2.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba8sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8sint, write>;
 
 // fn textureNumLayers(texture: texture_storage_2d_array<rgba8sint, write>) -> i32
 fn textureNumLayers_a216d2() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_a216d2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_a216d2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_a216d2();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/a216d2.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/a216d2.wgsl.expected.wgsl
index 48e65b1..38fbc89 100644
--- a/test/intrinsics/gen/textureNumLayers/a216d2.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/a216d2.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba8sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8sint, write>;
 
 fn textureNumLayers_a216d2() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_a216d2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_a216d2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_a216d2();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/cd5dc8.wgsl b/test/intrinsics/gen/textureNumLayers/cd5dc8.wgsl
index c7fd877..3756b00 100644
--- a/test/intrinsics/gen/textureNumLayers/cd5dc8.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/cd5dc8.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32uint, write>;
 
 // fn textureNumLayers(texture: texture_storage_2d_array<rgba32uint, write>) -> i32
 fn textureNumLayers_cd5dc8() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_cd5dc8();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_cd5dc8();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_cd5dc8();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/cd5dc8.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/cd5dc8.wgsl.expected.wgsl
index 05e08ff..870778b 100644
--- a/test/intrinsics/gen/textureNumLayers/cd5dc8.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/cd5dc8.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba32uint, write>;
 
 fn textureNumLayers_cd5dc8() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_cd5dc8();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_cd5dc8();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_cd5dc8();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/d5b228.wgsl b/test/intrinsics/gen/textureNumLayers/d5b228.wgsl
index 3426387..ccc1d48 100644
--- a/test/intrinsics/gen/textureNumLayers/d5b228.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/d5b228.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<r32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32float, write>;
 
 // fn textureNumLayers(texture: texture_storage_2d_array<r32float, write>) -> i32
 fn textureNumLayers_d5b228() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_d5b228();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_d5b228();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_d5b228();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/d5b228.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/d5b228.wgsl.expected.wgsl
index 8cce42a..798b0a8 100644
--- a/test/intrinsics/gen/textureNumLayers/d5b228.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/d5b228.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<r32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<r32float, write>;
 
 fn textureNumLayers_d5b228() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_d5b228();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_d5b228();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_d5b228();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/e31be1.wgsl b/test/intrinsics/gen/textureNumLayers/e31be1.wgsl
index ce3f74a..d80689a 100644
--- a/test/intrinsics/gen/textureNumLayers/e31be1.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/e31be1.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba8snorm, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8snorm, write>;
 
 // fn textureNumLayers(texture: texture_storage_2d_array<rgba8snorm, write>) -> i32
 fn textureNumLayers_e31be1() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_e31be1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_e31be1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_e31be1();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/e31be1.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/e31be1.wgsl.expected.wgsl
index e24d1ef..e47d202 100644
--- a/test/intrinsics/gen/textureNumLayers/e31be1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/e31be1.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba8snorm, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8snorm, write>;
 
 fn textureNumLayers_e31be1() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_e31be1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_e31be1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_e31be1();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/e653c0.wgsl b/test/intrinsics/gen/textureNumLayers/e653c0.wgsl
index 8558800..44cb31c 100644
--- a/test/intrinsics/gen/textureNumLayers/e653c0.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/e653c0.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d_array;
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
 
 // fn textureNumLayers(texture: texture_depth_2d_array) -> i32
 fn textureNumLayers_e653c0() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_e653c0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_e653c0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_e653c0();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/e653c0.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/e653c0.wgsl.expected.wgsl
index d4d6394..4adddfb 100644
--- a/test/intrinsics/gen/textureNumLayers/e653c0.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/e653c0.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d_array;
+@group(1) @binding(0) var arg_0 : texture_depth_2d_array;
 
 fn textureNumLayers_e653c0() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_e653c0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_e653c0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_e653c0();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/ee942f.wgsl b/test/intrinsics/gen/textureNumLayers/ee942f.wgsl
index 3605608..7c4e1b4 100644
--- a/test/intrinsics/gen/textureNumLayers/ee942f.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/ee942f.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<r32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32uint, write>;
 
 // fn textureNumLayers(texture: texture_storage_2d_array<r32uint, write>) -> i32
 fn textureNumLayers_ee942f() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_ee942f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_ee942f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_ee942f();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/ee942f.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/ee942f.wgsl.expected.wgsl
index ec81d1d..4d48fac 100644
--- a/test/intrinsics/gen/textureNumLayers/ee942f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/ee942f.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<r32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<r32uint, write>;
 
 fn textureNumLayers_ee942f() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_ee942f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_ee942f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_ee942f();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/f33005.wgsl b/test/intrinsics/gen/textureNumLayers/f33005.wgsl
index 8f0efdd..6d5b10c 100644
--- a/test/intrinsics/gen/textureNumLayers/f33005.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/f33005.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba16sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16sint, write>;
 
 // fn textureNumLayers(texture: texture_storage_2d_array<rgba16sint, write>) -> i32
 fn textureNumLayers_f33005() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_f33005();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_f33005();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_f33005();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/f33005.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/f33005.wgsl.expected.wgsl
index b4da2c1..35bd8ca 100644
--- a/test/intrinsics/gen/textureNumLayers/f33005.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/f33005.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba16sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba16sint, write>;
 
 fn textureNumLayers_f33005() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_f33005();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_f33005();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_f33005();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/fcec98.wgsl b/test/intrinsics/gen/textureNumLayers/fcec98.wgsl
index 3e33fda..aab70d9 100644
--- a/test/intrinsics/gen/textureNumLayers/fcec98.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/fcec98.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rg32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32uint, write>;
 
 // fn textureNumLayers(texture: texture_storage_2d_array<rg32uint, write>) -> i32
 fn textureNumLayers_fcec98() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_fcec98();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_fcec98();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_fcec98();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/fcec98.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/fcec98.wgsl.expected.wgsl
index c1ab9b5..6a1723e 100644
--- a/test/intrinsics/gen/textureNumLayers/fcec98.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/fcec98.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rg32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rg32uint, write>;
 
 fn textureNumLayers_fcec98() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_fcec98();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_fcec98();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_fcec98();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/ff5e89.wgsl b/test/intrinsics/gen/textureNumLayers/ff5e89.wgsl
index df16a2d..e6fe277 100644
--- a/test/intrinsics/gen/textureNumLayers/ff5e89.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/ff5e89.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba8uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8uint, write>;
 
 // fn textureNumLayers(texture: texture_storage_2d_array<rgba8uint, write>) -> i32
 fn textureNumLayers_ff5e89() {
   var res: i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_ff5e89();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_ff5e89();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_ff5e89();
 }
diff --git a/test/intrinsics/gen/textureNumLayers/ff5e89.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLayers/ff5e89.wgsl.expected.wgsl
index b5f5e98..cd8cb2d 100644
--- a/test/intrinsics/gen/textureNumLayers/ff5e89.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLayers/ff5e89.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba8uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8uint, write>;
 
 fn textureNumLayers_ff5e89() {
   var res : i32 = textureNumLayers(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLayers_ff5e89();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLayers_ff5e89();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLayers_ff5e89();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/076cb5.wgsl b/test/intrinsics/gen/textureNumLevels/076cb5.wgsl
index 3b07e8c..367dac4 100644
--- a/test/intrinsics/gen/textureNumLevels/076cb5.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/076cb5.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_cube;
+@group(1) @binding(0) var arg_0: texture_depth_cube;
 
 // fn textureNumLevels(texture: texture_depth_cube) -> i32
 fn textureNumLevels_076cb5() {
   var res: i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_076cb5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_076cb5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_076cb5();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/076cb5.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLevels/076cb5.wgsl.expected.wgsl
index 9730ca4..c04d6e6 100644
--- a/test/intrinsics/gen/textureNumLevels/076cb5.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/076cb5.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_cube;
+@group(1) @binding(0) var arg_0 : texture_depth_cube;
 
 fn textureNumLevels_076cb5() {
   var res : i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_076cb5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_076cb5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_076cb5();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/080d95.wgsl b/test/intrinsics/gen/textureNumLevels/080d95.wgsl
index c918197..b3bbba3 100644
--- a/test/intrinsics/gen/textureNumLevels/080d95.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/080d95.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube<i32>;
+@group(1) @binding(0) var arg_0: texture_cube<i32>;
 
 // fn textureNumLevels(texture: texture_cube<i32>) -> i32
 fn textureNumLevels_080d95() {
   var res: i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_080d95();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_080d95();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_080d95();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/080d95.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLevels/080d95.wgsl.expected.wgsl
index adbd0e5..686c908 100644
--- a/test/intrinsics/gen/textureNumLevels/080d95.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/080d95.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube<i32>;
+@group(1) @binding(0) var arg_0 : texture_cube<i32>;
 
 fn textureNumLevels_080d95() {
   var res : i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_080d95();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_080d95();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_080d95();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/09ddd0.wgsl b/test/intrinsics/gen/textureNumLevels/09ddd0.wgsl
index 566b3fb..b68221c 100644
--- a/test/intrinsics/gen/textureNumLevels/09ddd0.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/09ddd0.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d<u32>;
+@group(1) @binding(0) var arg_0: texture_2d<u32>;
 
 // fn textureNumLevels(texture: texture_2d<u32>) -> i32
 fn textureNumLevels_09ddd0() {
   var res: i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_09ddd0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_09ddd0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_09ddd0();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/09ddd0.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLevels/09ddd0.wgsl.expected.wgsl
index df0f042..7a4d344 100644
--- a/test/intrinsics/gen/textureNumLevels/09ddd0.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/09ddd0.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d<u32>;
+@group(1) @binding(0) var arg_0 : texture_2d<u32>;
 
 fn textureNumLevels_09ddd0() {
   var res : i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_09ddd0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_09ddd0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_09ddd0();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/105988.wgsl b/test/intrinsics/gen/textureNumLevels/105988.wgsl
index af619bd..9f03753 100644
--- a/test/intrinsics/gen/textureNumLevels/105988.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/105988.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d_array<f32>;
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
 
 // fn textureNumLevels(texture: texture_2d_array<f32>) -> i32
 fn textureNumLevels_105988() {
   var res: i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_105988();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_105988();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_105988();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/105988.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLevels/105988.wgsl.expected.wgsl
index 776a1cc..1466976 100644
--- a/test/intrinsics/gen/textureNumLevels/105988.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/105988.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d_array<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d_array<f32>;
 
 fn textureNumLevels_105988() {
   var res : i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_105988();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_105988();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_105988();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/1e6f3b.wgsl b/test/intrinsics/gen/textureNumLevels/1e6f3b.wgsl
index 02e002f..fc14600 100644
--- a/test/intrinsics/gen/textureNumLevels/1e6f3b.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/1e6f3b.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_1d<u32>;
+@group(1) @binding(0) var arg_0: texture_1d<u32>;
 
 // fn textureNumLevels(texture: texture_1d<u32>) -> i32
 fn textureNumLevels_1e6f3b() {
   var res: i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_1e6f3b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_1e6f3b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_1e6f3b();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/1e6f3b.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLevels/1e6f3b.wgsl.expected.wgsl
index 1aa0112..3643d3e 100644
--- a/test/intrinsics/gen/textureNumLevels/1e6f3b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/1e6f3b.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_1d<u32>;
+@group(1) @binding(0) var arg_0 : texture_1d<u32>;
 
 fn textureNumLevels_1e6f3b() {
   var res : i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_1e6f3b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_1e6f3b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_1e6f3b();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/23f750.wgsl b/test/intrinsics/gen/textureNumLevels/23f750.wgsl
index 01cef5e..4b914fc 100644
--- a/test/intrinsics/gen/textureNumLevels/23f750.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/23f750.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d<i32>;
+@group(1) @binding(0) var arg_0: texture_2d<i32>;
 
 // fn textureNumLevels(texture: texture_2d<i32>) -> i32
 fn textureNumLevels_23f750() {
   var res: i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_23f750();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_23f750();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_23f750();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/23f750.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLevels/23f750.wgsl.expected.wgsl
index 9589607..86bf588 100644
--- a/test/intrinsics/gen/textureNumLevels/23f750.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/23f750.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d<i32>;
+@group(1) @binding(0) var arg_0 : texture_2d<i32>;
 
 fn textureNumLevels_23f750() {
   var res : i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_23f750();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_23f750();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_23f750();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/2c3575.wgsl b/test/intrinsics/gen/textureNumLevels/2c3575.wgsl
index 51dcb5f..556e103 100644
--- a/test/intrinsics/gen/textureNumLevels/2c3575.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/2c3575.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_cube_array;
+@group(1) @binding(0) var arg_0: texture_depth_cube_array;
 
 // fn textureNumLevels(texture: texture_depth_cube_array) -> i32
 fn textureNumLevels_2c3575() {
   var res: i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_2c3575();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_2c3575();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_2c3575();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/2c3575.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLevels/2c3575.wgsl.expected.wgsl
index 2709a15..6f2f54d 100644
--- a/test/intrinsics/gen/textureNumLevels/2c3575.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/2c3575.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_cube_array;
+@group(1) @binding(0) var arg_0 : texture_depth_cube_array;
 
 fn textureNumLevels_2c3575() {
   var res : i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_2c3575();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_2c3575();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_2c3575();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/32a0ae.wgsl b/test/intrinsics/gen/textureNumLevels/32a0ae.wgsl
index 1509fb9..04ae341 100644
--- a/test/intrinsics/gen/textureNumLevels/32a0ae.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/32a0ae.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_1d<i32>;
+@group(1) @binding(0) var arg_0: texture_1d<i32>;
 
 // fn textureNumLevels(texture: texture_1d<i32>) -> i32
 fn textureNumLevels_32a0ae() {
   var res: i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_32a0ae();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_32a0ae();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_32a0ae();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/32a0ae.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLevels/32a0ae.wgsl.expected.wgsl
index 2ec9379..e5016eb 100644
--- a/test/intrinsics/gen/textureNumLevels/32a0ae.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/32a0ae.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_1d<i32>;
+@group(1) @binding(0) var arg_0 : texture_1d<i32>;
 
 fn textureNumLevels_32a0ae() {
   var res : i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_32a0ae();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_32a0ae();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_32a0ae();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/5101cf.wgsl b/test/intrinsics/gen/textureNumLevels/5101cf.wgsl
index 9dcd78b..cab7551 100644
--- a/test/intrinsics/gen/textureNumLevels/5101cf.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/5101cf.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d_array<u32>;
+@group(1) @binding(0) var arg_0: texture_2d_array<u32>;
 
 // fn textureNumLevels(texture: texture_2d_array<u32>) -> i32
 fn textureNumLevels_5101cf() {
   var res: i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_5101cf();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_5101cf();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_5101cf();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/5101cf.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLevels/5101cf.wgsl.expected.wgsl
index fb10b80..694397b 100644
--- a/test/intrinsics/gen/textureNumLevels/5101cf.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/5101cf.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d_array<u32>;
+@group(1) @binding(0) var arg_0 : texture_2d_array<u32>;
 
 fn textureNumLevels_5101cf() {
   var res : i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_5101cf();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_5101cf();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_5101cf();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/51b5bb.wgsl b/test/intrinsics/gen/textureNumLevels/51b5bb.wgsl
index 5dfe672..04be5cb 100644
--- a/test/intrinsics/gen/textureNumLevels/51b5bb.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/51b5bb.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_1d<f32>;
+@group(1) @binding(0) var arg_0: texture_1d<f32>;
 
 // fn textureNumLevels(texture: texture_1d<f32>) -> i32
 fn textureNumLevels_51b5bb() {
   var res: i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_51b5bb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_51b5bb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_51b5bb();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/51b5bb.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLevels/51b5bb.wgsl.expected.wgsl
index 61beb7a..2ee7aa9 100644
--- a/test/intrinsics/gen/textureNumLevels/51b5bb.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/51b5bb.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_1d<f32>;
+@group(1) @binding(0) var arg_0 : texture_1d<f32>;
 
 fn textureNumLevels_51b5bb() {
   var res : i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_51b5bb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_51b5bb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_51b5bb();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/897aaf.wgsl b/test/intrinsics/gen/textureNumLevels/897aaf.wgsl
index 00c1fa3..6daf4db 100644
--- a/test/intrinsics/gen/textureNumLevels/897aaf.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/897aaf.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube<f32>;
+@group(1) @binding(0) var arg_0: texture_cube<f32>;
 
 // fn textureNumLevels(texture: texture_cube<f32>) -> i32
 fn textureNumLevels_897aaf() {
   var res: i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_897aaf();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_897aaf();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_897aaf();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/897aaf.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLevels/897aaf.wgsl.expected.wgsl
index f208427..97e9275 100644
--- a/test/intrinsics/gen/textureNumLevels/897aaf.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/897aaf.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube<f32>;
+@group(1) @binding(0) var arg_0 : texture_cube<f32>;
 
 fn textureNumLevels_897aaf() {
   var res : i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_897aaf();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_897aaf();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_897aaf();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/9da7a5.wgsl b/test/intrinsics/gen/textureNumLevels/9da7a5.wgsl
index d7c908f..c471eba 100644
--- a/test/intrinsics/gen/textureNumLevels/9da7a5.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/9da7a5.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_3d<i32>;
+@group(1) @binding(0) var arg_0: texture_3d<i32>;
 
 // fn textureNumLevels(texture: texture_3d<i32>) -> i32
 fn textureNumLevels_9da7a5() {
   var res: i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_9da7a5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_9da7a5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_9da7a5();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/9da7a5.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLevels/9da7a5.wgsl.expected.wgsl
index aeb5080..5980b48 100644
--- a/test/intrinsics/gen/textureNumLevels/9da7a5.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/9da7a5.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_3d<i32>;
+@group(1) @binding(0) var arg_0 : texture_3d<i32>;
 
 fn textureNumLevels_9da7a5() {
   var res : i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_9da7a5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_9da7a5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_9da7a5();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/a91c03.wgsl b/test/intrinsics/gen/textureNumLevels/a91c03.wgsl
index 9dfd011..0d9d201 100644
--- a/test/intrinsics/gen/textureNumLevels/a91c03.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/a91c03.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube_array<i32>;
+@group(1) @binding(0) var arg_0: texture_cube_array<i32>;
 
 // fn textureNumLevels(texture: texture_cube_array<i32>) -> i32
 fn textureNumLevels_a91c03() {
   var res: i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_a91c03();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_a91c03();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_a91c03();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/a91c03.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLevels/a91c03.wgsl.expected.wgsl
index e367038..7212853 100644
--- a/test/intrinsics/gen/textureNumLevels/a91c03.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/a91c03.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube_array<i32>;
+@group(1) @binding(0) var arg_0 : texture_cube_array<i32>;
 
 fn textureNumLevels_a91c03() {
   var res : i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_a91c03();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_a91c03();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_a91c03();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/aee7c8.wgsl b/test/intrinsics/gen/textureNumLevels/aee7c8.wgsl
index baf3a5b..701dd1e 100644
--- a/test/intrinsics/gen/textureNumLevels/aee7c8.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/aee7c8.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube_array<f32>;
+@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
 
 // fn textureNumLevels(texture: texture_cube_array<f32>) -> i32
 fn textureNumLevels_aee7c8() {
   var res: i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_aee7c8();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_aee7c8();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_aee7c8();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/aee7c8.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLevels/aee7c8.wgsl.expected.wgsl
index dc4a392..32c8b5a 100644
--- a/test/intrinsics/gen/textureNumLevels/aee7c8.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/aee7c8.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube_array<f32>;
+@group(1) @binding(0) var arg_0 : texture_cube_array<f32>;
 
 fn textureNumLevels_aee7c8() {
   var res : i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_aee7c8();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_aee7c8();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_aee7c8();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/b1b12b.wgsl b/test/intrinsics/gen/textureNumLevels/b1b12b.wgsl
index bb46fdb..9f8980a 100644
--- a/test/intrinsics/gen/textureNumLevels/b1b12b.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/b1b12b.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d;
+@group(1) @binding(0) var arg_0: texture_depth_2d;
 
 // fn textureNumLevels(texture: texture_depth_2d) -> i32
 fn textureNumLevels_b1b12b() {
   var res: i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_b1b12b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_b1b12b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_b1b12b();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/b1b12b.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLevels/b1b12b.wgsl.expected.wgsl
index 2fe948a..97fd9a2 100644
--- a/test/intrinsics/gen/textureNumLevels/b1b12b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/b1b12b.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_2d;
 
 fn textureNumLevels_b1b12b() {
   var res : i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_b1b12b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_b1b12b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_b1b12b();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/b4f5ea.wgsl b/test/intrinsics/gen/textureNumLevels/b4f5ea.wgsl
index 6c79105..57d2353 100644
--- a/test/intrinsics/gen/textureNumLevels/b4f5ea.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/b4f5ea.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_3d<u32>;
+@group(1) @binding(0) var arg_0: texture_3d<u32>;
 
 // fn textureNumLevels(texture: texture_3d<u32>) -> i32
 fn textureNumLevels_b4f5ea() {
   var res: i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_b4f5ea();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_b4f5ea();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_b4f5ea();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/b4f5ea.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLevels/b4f5ea.wgsl.expected.wgsl
index 70c5658..ff1823d 100644
--- a/test/intrinsics/gen/textureNumLevels/b4f5ea.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/b4f5ea.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_3d<u32>;
+@group(1) @binding(0) var arg_0 : texture_3d<u32>;
 
 fn textureNumLevels_b4f5ea() {
   var res : i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_b4f5ea();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_b4f5ea();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_b4f5ea();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/d004a9.wgsl b/test/intrinsics/gen/textureNumLevels/d004a9.wgsl
index 1353492..862bc8d 100644
--- a/test/intrinsics/gen/textureNumLevels/d004a9.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/d004a9.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d_array<i32>;
+@group(1) @binding(0) var arg_0: texture_2d_array<i32>;
 
 // fn textureNumLevels(texture: texture_2d_array<i32>) -> i32
 fn textureNumLevels_d004a9() {
   var res: i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_d004a9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_d004a9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_d004a9();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/d004a9.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLevels/d004a9.wgsl.expected.wgsl
index 23230e9..e6efa4a 100644
--- a/test/intrinsics/gen/textureNumLevels/d004a9.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/d004a9.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d_array<i32>;
+@group(1) @binding(0) var arg_0 : texture_2d_array<i32>;
 
 fn textureNumLevels_d004a9() {
   var res : i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_d004a9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_d004a9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_d004a9();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/dca09e.wgsl b/test/intrinsics/gen/textureNumLevels/dca09e.wgsl
index 52bc5de..85fb619 100644
--- a/test/intrinsics/gen/textureNumLevels/dca09e.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/dca09e.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_3d<f32>;
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
 
 // fn textureNumLevels(texture: texture_3d<f32>) -> i32
 fn textureNumLevels_dca09e() {
   var res: i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_dca09e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_dca09e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_dca09e();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/dca09e.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLevels/dca09e.wgsl.expected.wgsl
index bbf325d..81c2ed1 100644
--- a/test/intrinsics/gen/textureNumLevels/dca09e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/dca09e.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_3d<f32>;
+@group(1) @binding(0) var arg_0 : texture_3d<f32>;
 
 fn textureNumLevels_dca09e() {
   var res : i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_dca09e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_dca09e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_dca09e();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/e67231.wgsl b/test/intrinsics/gen/textureNumLevels/e67231.wgsl
index 817b334..05f8db0 100644
--- a/test/intrinsics/gen/textureNumLevels/e67231.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/e67231.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d<f32>;
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
 
 // fn textureNumLevels(texture: texture_2d<f32>) -> i32
 fn textureNumLevels_e67231() {
   var res: i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_e67231();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_e67231();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_e67231();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/e67231.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLevels/e67231.wgsl.expected.wgsl
index 1db03ef..b9b5a95 100644
--- a/test/intrinsics/gen/textureNumLevels/e67231.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/e67231.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d<f32>;
 
 fn textureNumLevels_e67231() {
   var res : i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_e67231();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_e67231();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_e67231();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/ed078b.wgsl b/test/intrinsics/gen/textureNumLevels/ed078b.wgsl
index 739603d..76ac64c 100644
--- a/test/intrinsics/gen/textureNumLevels/ed078b.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/ed078b.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube<u32>;
+@group(1) @binding(0) var arg_0: texture_cube<u32>;
 
 // fn textureNumLevels(texture: texture_cube<u32>) -> i32
 fn textureNumLevels_ed078b() {
   var res: i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_ed078b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_ed078b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_ed078b();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/ed078b.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLevels/ed078b.wgsl.expected.wgsl
index 4684f74..1eb3d87 100644
--- a/test/intrinsics/gen/textureNumLevels/ed078b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/ed078b.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube<u32>;
+@group(1) @binding(0) var arg_0 : texture_cube<u32>;
 
 fn textureNumLevels_ed078b() {
   var res : i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_ed078b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_ed078b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_ed078b();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/f46ec6.wgsl b/test/intrinsics/gen/textureNumLevels/f46ec6.wgsl
index 05a8710..10ccf4e 100644
--- a/test/intrinsics/gen/textureNumLevels/f46ec6.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/f46ec6.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube_array<u32>;
+@group(1) @binding(0) var arg_0: texture_cube_array<u32>;
 
 // fn textureNumLevels(texture: texture_cube_array<u32>) -> i32
 fn textureNumLevels_f46ec6() {
   var res: i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_f46ec6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_f46ec6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_f46ec6();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/f46ec6.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLevels/f46ec6.wgsl.expected.wgsl
index ecf4daf..d380d9b 100644
--- a/test/intrinsics/gen/textureNumLevels/f46ec6.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/f46ec6.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube_array<u32>;
+@group(1) @binding(0) var arg_0 : texture_cube_array<u32>;
 
 fn textureNumLevels_f46ec6() {
   var res : i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_f46ec6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_f46ec6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_f46ec6();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/f5828d.wgsl b/test/intrinsics/gen/textureNumLevels/f5828d.wgsl
index 68737ce..bdfcc52 100644
--- a/test/intrinsics/gen/textureNumLevels/f5828d.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/f5828d.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d_array;
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
 
 // fn textureNumLevels(texture: texture_depth_2d_array) -> i32
 fn textureNumLevels_f5828d() {
   var res: i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_f5828d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_f5828d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_f5828d();
 }
diff --git a/test/intrinsics/gen/textureNumLevels/f5828d.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumLevels/f5828d.wgsl.expected.wgsl
index 5314134..501fe61 100644
--- a/test/intrinsics/gen/textureNumLevels/f5828d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumLevels/f5828d.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d_array;
+@group(1) @binding(0) var arg_0 : texture_depth_2d_array;
 
 fn textureNumLevels_f5828d() {
   var res : i32 = textureNumLevels(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumLevels_f5828d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumLevels_f5828d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumLevels_f5828d();
 }
diff --git a/test/intrinsics/gen/textureNumSamples/2c6f14.wgsl b/test/intrinsics/gen/textureNumSamples/2c6f14.wgsl
index 4015d41..8a28fd4 100644
--- a/test/intrinsics/gen/textureNumSamples/2c6f14.wgsl
+++ b/test/intrinsics/gen/textureNumSamples/2c6f14.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_multisampled_2d<f32>;
+@group(1) @binding(0) var arg_0: texture_multisampled_2d<f32>;
 
 // fn textureNumSamples(texture: texture_multisampled_2d<f32>) -> i32
 fn textureNumSamples_2c6f14() {
   var res: i32 = textureNumSamples(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumSamples_2c6f14();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumSamples_2c6f14();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumSamples_2c6f14();
 }
diff --git a/test/intrinsics/gen/textureNumSamples/2c6f14.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumSamples/2c6f14.wgsl.expected.wgsl
index a8d25bc..be49934 100644
--- a/test/intrinsics/gen/textureNumSamples/2c6f14.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumSamples/2c6f14.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_multisampled_2d<f32>;
+@group(1) @binding(0) var arg_0 : texture_multisampled_2d<f32>;
 
 fn textureNumSamples_2c6f14() {
   var res : i32 = textureNumSamples(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumSamples_2c6f14();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumSamples_2c6f14();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumSamples_2c6f14();
 }
diff --git a/test/intrinsics/gen/textureNumSamples/42f8bb.wgsl b/test/intrinsics/gen/textureNumSamples/42f8bb.wgsl
index 606e5be..143f3a8 100644
--- a/test/intrinsics/gen/textureNumSamples/42f8bb.wgsl
+++ b/test/intrinsics/gen/textureNumSamples/42f8bb.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_multisampled_2d<u32>;
+@group(1) @binding(0) var arg_0: texture_multisampled_2d<u32>;
 
 // fn textureNumSamples(texture: texture_multisampled_2d<u32>) -> i32
 fn textureNumSamples_42f8bb() {
   var res: i32 = textureNumSamples(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumSamples_42f8bb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumSamples_42f8bb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumSamples_42f8bb();
 }
diff --git a/test/intrinsics/gen/textureNumSamples/42f8bb.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumSamples/42f8bb.wgsl.expected.wgsl
index 2f1e941..ef11b63 100644
--- a/test/intrinsics/gen/textureNumSamples/42f8bb.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumSamples/42f8bb.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_multisampled_2d<u32>;
+@group(1) @binding(0) var arg_0 : texture_multisampled_2d<u32>;
 
 fn textureNumSamples_42f8bb() {
   var res : i32 = textureNumSamples(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumSamples_42f8bb();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumSamples_42f8bb();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumSamples_42f8bb();
 }
diff --git a/test/intrinsics/gen/textureNumSamples/449d23.wgsl b/test/intrinsics/gen/textureNumSamples/449d23.wgsl
index 9f1de6e..c34a440 100644
--- a/test/intrinsics/gen/textureNumSamples/449d23.wgsl
+++ b/test/intrinsics/gen/textureNumSamples/449d23.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_multisampled_2d<i32>;
+@group(1) @binding(0) var arg_0: texture_multisampled_2d<i32>;
 
 // fn textureNumSamples(texture: texture_multisampled_2d<i32>) -> i32
 fn textureNumSamples_449d23() {
   var res: i32 = textureNumSamples(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumSamples_449d23();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumSamples_449d23();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumSamples_449d23();
 }
diff --git a/test/intrinsics/gen/textureNumSamples/449d23.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumSamples/449d23.wgsl.expected.wgsl
index 74b98a5..9cab69e 100644
--- a/test/intrinsics/gen/textureNumSamples/449d23.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumSamples/449d23.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_multisampled_2d<i32>;
+@group(1) @binding(0) var arg_0 : texture_multisampled_2d<i32>;
 
 fn textureNumSamples_449d23() {
   var res : i32 = textureNumSamples(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumSamples_449d23();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumSamples_449d23();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumSamples_449d23();
 }
diff --git a/test/intrinsics/gen/textureNumSamples/a3c8a0.wgsl b/test/intrinsics/gen/textureNumSamples/a3c8a0.wgsl
index 4cc3843..bafea1a 100644
--- a/test/intrinsics/gen/textureNumSamples/a3c8a0.wgsl
+++ b/test/intrinsics/gen/textureNumSamples/a3c8a0.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_multisampled_2d;
+@group(1) @binding(0) var arg_0: texture_depth_multisampled_2d;
 
 // fn textureNumSamples(texture: texture_depth_multisampled_2d) -> i32
 fn textureNumSamples_a3c8a0() {
   var res: i32 = textureNumSamples(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumSamples_a3c8a0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumSamples_a3c8a0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumSamples_a3c8a0();
 }
diff --git a/test/intrinsics/gen/textureNumSamples/a3c8a0.wgsl.expected.wgsl b/test/intrinsics/gen/textureNumSamples/a3c8a0.wgsl.expected.wgsl
index 141f059..29a914a 100644
--- a/test/intrinsics/gen/textureNumSamples/a3c8a0.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureNumSamples/a3c8a0.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_multisampled_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_multisampled_2d;
 
 fn textureNumSamples_a3c8a0() {
   var res : i32 = textureNumSamples(arg_0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureNumSamples_a3c8a0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureNumSamples_a3c8a0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureNumSamples_a3c8a0();
 }
diff --git a/test/intrinsics/gen/textureSample/02aa9b.wgsl b/test/intrinsics/gen/textureSample/02aa9b.wgsl
index 2827f6f..006a838 100644
--- a/test/intrinsics/gen/textureSample/02aa9b.wgsl
+++ b/test/intrinsics/gen/textureSample/02aa9b.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d_array<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSample(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, offset: vec2<i32>) -> vec4<f32>
 fn textureSample_02aa9b() {
   var res: vec4<f32> = textureSample(arg_0, arg_1, vec2<f32>(), 1, vec2<i32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_02aa9b();
 }
diff --git a/test/intrinsics/gen/textureSample/02aa9b.wgsl.expected.wgsl b/test/intrinsics/gen/textureSample/02aa9b.wgsl.expected.wgsl
index b005caa..8557991 100644
--- a/test/intrinsics/gen/textureSample/02aa9b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSample/02aa9b.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d_array<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d_array<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSample_02aa9b() {
   var res : vec4<f32> = textureSample(arg_0, arg_1, vec2<f32>(), 1, vec2<i32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_02aa9b();
 }
diff --git a/test/intrinsics/gen/textureSample/100dc0.wgsl b/test/intrinsics/gen/textureSample/100dc0.wgsl
index 49ea8de..a5f95e7 100644
--- a/test/intrinsics/gen/textureSample/100dc0.wgsl
+++ b/test/intrinsics/gen/textureSample/100dc0.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_3d<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSample(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, offset: vec3<i32>) -> vec4<f32>
 fn textureSample_100dc0() {
   var res: vec4<f32> = textureSample(arg_0, arg_1, vec3<f32>(), vec3<i32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_100dc0();
 }
diff --git a/test/intrinsics/gen/textureSample/100dc0.wgsl.expected.wgsl b/test/intrinsics/gen/textureSample/100dc0.wgsl.expected.wgsl
index 6fcbb13..b972855 100644
--- a/test/intrinsics/gen/textureSample/100dc0.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSample/100dc0.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_3d<f32>;
+@group(1) @binding(0) var arg_0 : texture_3d<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSample_100dc0() {
   var res : vec4<f32> = textureSample(arg_0, arg_1, vec3<f32>(), vec3<i32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_100dc0();
 }
diff --git a/test/intrinsics/gen/textureSample/38bbb9.wgsl b/test/intrinsics/gen/textureSample/38bbb9.wgsl
index effaac2..ee2abbd 100644
--- a/test/intrinsics/gen/textureSample/38bbb9.wgsl
+++ b/test/intrinsics/gen/textureSample/38bbb9.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSample(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>) -> f32
 fn textureSample_38bbb9() {
   var res: f32 = textureSample(arg_0, arg_1, vec2<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_38bbb9();
 }
diff --git a/test/intrinsics/gen/textureSample/38bbb9.wgsl.expected.wgsl b/test/intrinsics/gen/textureSample/38bbb9.wgsl.expected.wgsl
index 3d321ed..438d008 100644
--- a/test/intrinsics/gen/textureSample/38bbb9.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSample/38bbb9.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_2d;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSample_38bbb9() {
   var res : f32 = textureSample(arg_0, arg_1, vec2<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_38bbb9();
 }
diff --git a/test/intrinsics/gen/textureSample/3b50bd.wgsl b/test/intrinsics/gen/textureSample/3b50bd.wgsl
index c429a99..0c0b55f 100644
--- a/test/intrinsics/gen/textureSample/3b50bd.wgsl
+++ b/test/intrinsics/gen/textureSample/3b50bd.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_3d<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSample(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>) -> vec4<f32>
 fn textureSample_3b50bd() {
   var res: vec4<f32> = textureSample(arg_0, arg_1, vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_3b50bd();
 }
diff --git a/test/intrinsics/gen/textureSample/3b50bd.wgsl.expected.wgsl b/test/intrinsics/gen/textureSample/3b50bd.wgsl.expected.wgsl
index 268e4e4..03ccde3 100644
--- a/test/intrinsics/gen/textureSample/3b50bd.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSample/3b50bd.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_3d<f32>;
+@group(1) @binding(0) var arg_0 : texture_3d<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSample_3b50bd() {
   var res : vec4<f32> = textureSample(arg_0, arg_1, vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_3b50bd();
 }
diff --git a/test/intrinsics/gen/textureSample/4dd1bf.wgsl b/test/intrinsics/gen/textureSample/4dd1bf.wgsl
index 7e33126..f722cd1 100644
--- a/test/intrinsics/gen/textureSample/4dd1bf.wgsl
+++ b/test/intrinsics/gen/textureSample/4dd1bf.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube_array<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSample(texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: i32) -> vec4<f32>
 fn textureSample_4dd1bf() {
   var res: vec4<f32> = textureSample(arg_0, arg_1, vec3<f32>(), 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_4dd1bf();
 }
diff --git a/test/intrinsics/gen/textureSample/4dd1bf.wgsl.expected.wgsl b/test/intrinsics/gen/textureSample/4dd1bf.wgsl.expected.wgsl
index 25c98d3..77ad88a 100644
--- a/test/intrinsics/gen/textureSample/4dd1bf.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSample/4dd1bf.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube_array<f32>;
+@group(1) @binding(0) var arg_0 : texture_cube_array<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSample_4dd1bf() {
   var res : vec4<f32> = textureSample(arg_0, arg_1, vec3<f32>(), 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_4dd1bf();
 }
diff --git a/test/intrinsics/gen/textureSample/51b514.wgsl b/test/intrinsics/gen/textureSample/51b514.wgsl
index 4ba2216..5433460 100644
--- a/test/intrinsics/gen/textureSample/51b514.wgsl
+++ b/test/intrinsics/gen/textureSample/51b514.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSample(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>) -> vec4<f32>
 fn textureSample_51b514() {
   var res: vec4<f32> = textureSample(arg_0, arg_1, vec2<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_51b514();
 }
diff --git a/test/intrinsics/gen/textureSample/51b514.wgsl.expected.wgsl b/test/intrinsics/gen/textureSample/51b514.wgsl.expected.wgsl
index 825becd..f866a59 100644
--- a/test/intrinsics/gen/textureSample/51b514.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSample/51b514.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSample_51b514() {
   var res : vec4<f32> = textureSample(arg_0, arg_1, vec2<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_51b514();
 }
diff --git a/test/intrinsics/gen/textureSample/667d76.wgsl b/test/intrinsics/gen/textureSample/667d76.wgsl
index 73ba79a..23d98a9 100644
--- a/test/intrinsics/gen/textureSample/667d76.wgsl
+++ b/test/intrinsics/gen/textureSample/667d76.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSample(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, offset: vec2<i32>) -> f32
 fn textureSample_667d76() {
   var res: f32 = textureSample(arg_0, arg_1, vec2<f32>(), vec2<i32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_667d76();
 }
diff --git a/test/intrinsics/gen/textureSample/667d76.wgsl.expected.wgsl b/test/intrinsics/gen/textureSample/667d76.wgsl.expected.wgsl
index 3e92695..d541431 100644
--- a/test/intrinsics/gen/textureSample/667d76.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSample/667d76.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_2d;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSample_667d76() {
   var res : f32 = textureSample(arg_0, arg_1, vec2<f32>(), vec2<i32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_667d76();
 }
diff --git a/test/intrinsics/gen/textureSample/6717ca.wgsl b/test/intrinsics/gen/textureSample/6717ca.wgsl
index 35f0657..fc09cca 100644
--- a/test/intrinsics/gen/textureSample/6717ca.wgsl
+++ b/test/intrinsics/gen/textureSample/6717ca.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d_array<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSample(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32) -> vec4<f32>
 fn textureSample_6717ca() {
   var res: vec4<f32> = textureSample(arg_0, arg_1, vec2<f32>(), 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_6717ca();
 }
diff --git a/test/intrinsics/gen/textureSample/6717ca.wgsl.expected.wgsl b/test/intrinsics/gen/textureSample/6717ca.wgsl.expected.wgsl
index 9d9e695..b767d29 100644
--- a/test/intrinsics/gen/textureSample/6717ca.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSample/6717ca.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d_array<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d_array<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSample_6717ca() {
   var res : vec4<f32> = textureSample(arg_0, arg_1, vec2<f32>(), 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_6717ca();
 }
diff --git a/test/intrinsics/gen/textureSample/6e64fb.wgsl b/test/intrinsics/gen/textureSample/6e64fb.wgsl
index 24a8ae7..d49bb9c 100644
--- a/test/intrinsics/gen/textureSample/6e64fb.wgsl
+++ b/test/intrinsics/gen/textureSample/6e64fb.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_1d<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_1d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSample(texture: texture_1d<f32>, sampler: sampler, coords: f32) -> vec4<f32>
 fn textureSample_6e64fb() {
   var res: vec4<f32> = textureSample(arg_0, arg_1, 1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_6e64fb();
 }
diff --git a/test/intrinsics/gen/textureSample/6e64fb.wgsl.expected.wgsl b/test/intrinsics/gen/textureSample/6e64fb.wgsl.expected.wgsl
index 7e7d7ec..4d7b6ce 100644
--- a/test/intrinsics/gen/textureSample/6e64fb.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSample/6e64fb.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_1d<f32>;
+@group(1) @binding(0) var arg_0 : texture_1d<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSample_6e64fb() {
   var res : vec4<f32> = textureSample(arg_0, arg_1, 1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_6e64fb();
 }
diff --git a/test/intrinsics/gen/textureSample/7c3baa.wgsl b/test/intrinsics/gen/textureSample/7c3baa.wgsl
index 6486d89..9f32596 100644
--- a/test/intrinsics/gen/textureSample/7c3baa.wgsl
+++ b/test/intrinsics/gen/textureSample/7c3baa.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSample(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, offset: vec2<i32>) -> vec4<f32>
 fn textureSample_7c3baa() {
   var res: vec4<f32> = textureSample(arg_0, arg_1, vec2<f32>(), vec2<i32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_7c3baa();
 }
diff --git a/test/intrinsics/gen/textureSample/7c3baa.wgsl.expected.wgsl b/test/intrinsics/gen/textureSample/7c3baa.wgsl.expected.wgsl
index 7491762..f4105d8 100644
--- a/test/intrinsics/gen/textureSample/7c3baa.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSample/7c3baa.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSample_7c3baa() {
   var res : vec4<f32> = textureSample(arg_0, arg_1, vec2<f32>(), vec2<i32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_7c3baa();
 }
diff --git a/test/intrinsics/gen/textureSample/7e9ffd.wgsl b/test/intrinsics/gen/textureSample/7e9ffd.wgsl
index 3e4a681..d5242f6 100644
--- a/test/intrinsics/gen/textureSample/7e9ffd.wgsl
+++ b/test/intrinsics/gen/textureSample/7e9ffd.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d_array;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSample(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: i32) -> f32
 fn textureSample_7e9ffd() {
   var res: f32 = textureSample(arg_0, arg_1, vec2<f32>(), 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_7e9ffd();
 }
diff --git a/test/intrinsics/gen/textureSample/7e9ffd.wgsl.expected.wgsl b/test/intrinsics/gen/textureSample/7e9ffd.wgsl.expected.wgsl
index b570940..ba76347 100644
--- a/test/intrinsics/gen/textureSample/7e9ffd.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSample/7e9ffd.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d_array;
+@group(1) @binding(0) var arg_0 : texture_depth_2d_array;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSample_7e9ffd() {
   var res : f32 = textureSample(arg_0, arg_1, vec2<f32>(), 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_7e9ffd();
 }
diff --git a/test/intrinsics/gen/textureSample/8522e7.wgsl b/test/intrinsics/gen/textureSample/8522e7.wgsl
index afc0646..2ac3071 100644
--- a/test/intrinsics/gen/textureSample/8522e7.wgsl
+++ b/test/intrinsics/gen/textureSample/8522e7.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d_array;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSample(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: i32, offset: vec2<i32>) -> f32
 fn textureSample_8522e7() {
   var res: f32 = textureSample(arg_0, arg_1, vec2<f32>(), 1, vec2<i32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_8522e7();
 }
diff --git a/test/intrinsics/gen/textureSample/8522e7.wgsl.expected.wgsl b/test/intrinsics/gen/textureSample/8522e7.wgsl.expected.wgsl
index 4133cde..a3d93c8 100644
--- a/test/intrinsics/gen/textureSample/8522e7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSample/8522e7.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d_array;
+@group(1) @binding(0) var arg_0 : texture_depth_2d_array;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSample_8522e7() {
   var res : f32 = textureSample(arg_0, arg_1, vec2<f32>(), 1, vec2<i32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_8522e7();
 }
diff --git a/test/intrinsics/gen/textureSample/c2f4e8.wgsl b/test/intrinsics/gen/textureSample/c2f4e8.wgsl
index cd23dcc..e6c03a1 100644
--- a/test/intrinsics/gen/textureSample/c2f4e8.wgsl
+++ b/test/intrinsics/gen/textureSample/c2f4e8.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_cube_array;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_depth_cube_array;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSample(texture: texture_depth_cube_array, sampler: sampler, coords: vec3<f32>, array_index: i32) -> f32
 fn textureSample_c2f4e8() {
   var res: f32 = textureSample(arg_0, arg_1, vec3<f32>(), 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_c2f4e8();
 }
diff --git a/test/intrinsics/gen/textureSample/c2f4e8.wgsl.expected.wgsl b/test/intrinsics/gen/textureSample/c2f4e8.wgsl.expected.wgsl
index 835f3c2..0a6f332 100644
--- a/test/intrinsics/gen/textureSample/c2f4e8.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSample/c2f4e8.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_cube_array;
+@group(1) @binding(0) var arg_0 : texture_depth_cube_array;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSample_c2f4e8() {
   var res : f32 = textureSample(arg_0, arg_1, vec3<f32>(), 1);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_c2f4e8();
 }
diff --git a/test/intrinsics/gen/textureSample/e53267.wgsl b/test/intrinsics/gen/textureSample/e53267.wgsl
index 14163e1..6ac4cd6 100644
--- a/test/intrinsics/gen/textureSample/e53267.wgsl
+++ b/test/intrinsics/gen/textureSample/e53267.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_cube<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSample(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>) -> vec4<f32>
 fn textureSample_e53267() {
   var res: vec4<f32> = textureSample(arg_0, arg_1, vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_e53267();
 }
diff --git a/test/intrinsics/gen/textureSample/e53267.wgsl.expected.wgsl b/test/intrinsics/gen/textureSample/e53267.wgsl.expected.wgsl
index 64f9da9..b1d17e7 100644
--- a/test/intrinsics/gen/textureSample/e53267.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSample/e53267.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube<f32>;
+@group(1) @binding(0) var arg_0 : texture_cube<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSample_e53267() {
   var res : vec4<f32> = textureSample(arg_0, arg_1, vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_e53267();
 }
diff --git a/test/intrinsics/gen/textureSample/ea7030.wgsl b/test/intrinsics/gen/textureSample/ea7030.wgsl
index f36a76e..482686a 100644
--- a/test/intrinsics/gen/textureSample/ea7030.wgsl
+++ b/test/intrinsics/gen/textureSample/ea7030.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_cube;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_depth_cube;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSample(texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>) -> f32
 fn textureSample_ea7030() {
   var res: f32 = textureSample(arg_0, arg_1, vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_ea7030();
 }
diff --git a/test/intrinsics/gen/textureSample/ea7030.wgsl.expected.wgsl b/test/intrinsics/gen/textureSample/ea7030.wgsl.expected.wgsl
index 580b0b0..4fffe53 100644
--- a/test/intrinsics/gen/textureSample/ea7030.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSample/ea7030.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_cube;
+@group(1) @binding(0) var arg_0 : texture_depth_cube;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSample_ea7030() {
   var res : f32 = textureSample(arg_0, arg_1, vec3<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSample_ea7030();
 }
diff --git a/test/intrinsics/gen/textureSampleBias/53b9f7.wgsl b/test/intrinsics/gen/textureSampleBias/53b9f7.wgsl
index 976b690..17b3557 100644
--- a/test/intrinsics/gen/textureSampleBias/53b9f7.wgsl
+++ b/test/intrinsics/gen/textureSampleBias/53b9f7.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_cube<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleBias(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>, bias: f32) -> vec4<f32>
 fn textureSampleBias_53b9f7() {
   var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec3<f32>(), 1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleBias_53b9f7();
 }
diff --git a/test/intrinsics/gen/textureSampleBias/53b9f7.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleBias/53b9f7.wgsl.expected.wgsl
index aaeec48..58e2030 100644
--- a/test/intrinsics/gen/textureSampleBias/53b9f7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleBias/53b9f7.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube<f32>;
+@group(1) @binding(0) var arg_0 : texture_cube<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleBias_53b9f7() {
   var res : vec4<f32> = textureSampleBias(arg_0, arg_1, vec3<f32>(), 1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleBias_53b9f7();
 }
diff --git a/test/intrinsics/gen/textureSampleBias/65ac50.wgsl b/test/intrinsics/gen/textureSampleBias/65ac50.wgsl
index e3c0a22..5a95380 100644
--- a/test/intrinsics/gen/textureSampleBias/65ac50.wgsl
+++ b/test/intrinsics/gen/textureSampleBias/65ac50.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d_array<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleBias(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, bias: f32, offset: vec2<i32>) -> vec4<f32>
 fn textureSampleBias_65ac50() {
   var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec2<f32>(), 1, 1.0, vec2<i32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleBias_65ac50();
 }
diff --git a/test/intrinsics/gen/textureSampleBias/65ac50.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleBias/65ac50.wgsl.expected.wgsl
index 915c1f4..ca8e190 100644
--- a/test/intrinsics/gen/textureSampleBias/65ac50.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleBias/65ac50.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d_array<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d_array<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleBias_65ac50() {
   var res : vec4<f32> = textureSampleBias(arg_0, arg_1, vec2<f32>(), 1, 1.0, vec2<i32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleBias_65ac50();
 }
diff --git a/test/intrinsics/gen/textureSampleBias/6a9113.wgsl b/test/intrinsics/gen/textureSampleBias/6a9113.wgsl
index e7648e4..8c17b47 100644
--- a/test/intrinsics/gen/textureSampleBias/6a9113.wgsl
+++ b/test/intrinsics/gen/textureSampleBias/6a9113.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleBias(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, bias: f32) -> vec4<f32>
 fn textureSampleBias_6a9113() {
   var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec2<f32>(), 1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleBias_6a9113();
 }
diff --git a/test/intrinsics/gen/textureSampleBias/6a9113.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleBias/6a9113.wgsl.expected.wgsl
index 36043aa..a5ff76e 100644
--- a/test/intrinsics/gen/textureSampleBias/6a9113.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleBias/6a9113.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleBias_6a9113() {
   var res : vec4<f32> = textureSampleBias(arg_0, arg_1, vec2<f32>(), 1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleBias_6a9113();
 }
diff --git a/test/intrinsics/gen/textureSampleBias/80e579.wgsl b/test/intrinsics/gen/textureSampleBias/80e579.wgsl
index 37e9940..0ae5cc8 100644
--- a/test/intrinsics/gen/textureSampleBias/80e579.wgsl
+++ b/test/intrinsics/gen/textureSampleBias/80e579.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d_array<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleBias(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, bias: f32) -> vec4<f32>
 fn textureSampleBias_80e579() {
   var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec2<f32>(), 1, 1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleBias_80e579();
 }
diff --git a/test/intrinsics/gen/textureSampleBias/80e579.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleBias/80e579.wgsl.expected.wgsl
index 6134ecb..164c81e 100644
--- a/test/intrinsics/gen/textureSampleBias/80e579.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleBias/80e579.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d_array<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d_array<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleBias_80e579() {
   var res : vec4<f32> = textureSampleBias(arg_0, arg_1, vec2<f32>(), 1, 1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleBias_80e579();
 }
diff --git a/test/intrinsics/gen/textureSampleBias/81c19a.wgsl b/test/intrinsics/gen/textureSampleBias/81c19a.wgsl
index 145a1e9..f6f996f 100644
--- a/test/intrinsics/gen/textureSampleBias/81c19a.wgsl
+++ b/test/intrinsics/gen/textureSampleBias/81c19a.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleBias(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, bias: f32, offset: vec2<i32>) -> vec4<f32>
 fn textureSampleBias_81c19a() {
   var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec2<f32>(), 1.0, vec2<i32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleBias_81c19a();
 }
diff --git a/test/intrinsics/gen/textureSampleBias/81c19a.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleBias/81c19a.wgsl.expected.wgsl
index 88ef14b..2719198 100644
--- a/test/intrinsics/gen/textureSampleBias/81c19a.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleBias/81c19a.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleBias_81c19a() {
   var res : vec4<f32> = textureSampleBias(arg_0, arg_1, vec2<f32>(), 1.0, vec2<i32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleBias_81c19a();
 }
diff --git a/test/intrinsics/gen/textureSampleBias/d3fa1b.wgsl b/test/intrinsics/gen/textureSampleBias/d3fa1b.wgsl
index 5ec074c..d70657e 100644
--- a/test/intrinsics/gen/textureSampleBias/d3fa1b.wgsl
+++ b/test/intrinsics/gen/textureSampleBias/d3fa1b.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_3d<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleBias(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, bias: f32) -> vec4<f32>
 fn textureSampleBias_d3fa1b() {
   var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec3<f32>(), 1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleBias_d3fa1b();
 }
diff --git a/test/intrinsics/gen/textureSampleBias/d3fa1b.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleBias/d3fa1b.wgsl.expected.wgsl
index 40dc89e..7a07c30 100644
--- a/test/intrinsics/gen/textureSampleBias/d3fa1b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleBias/d3fa1b.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_3d<f32>;
+@group(1) @binding(0) var arg_0 : texture_3d<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleBias_d3fa1b() {
   var res : vec4<f32> = textureSampleBias(arg_0, arg_1, vec3<f32>(), 1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleBias_d3fa1b();
 }
diff --git a/test/intrinsics/gen/textureSampleBias/df91bb.wgsl b/test/intrinsics/gen/textureSampleBias/df91bb.wgsl
index 41c7990..b35e5a4 100644
--- a/test/intrinsics/gen/textureSampleBias/df91bb.wgsl
+++ b/test/intrinsics/gen/textureSampleBias/df91bb.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_3d<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleBias(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, bias: f32, offset: vec3<i32>) -> vec4<f32>
 fn textureSampleBias_df91bb() {
   var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec3<f32>(), 1.0, vec3<i32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleBias_df91bb();
 }
diff --git a/test/intrinsics/gen/textureSampleBias/df91bb.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleBias/df91bb.wgsl.expected.wgsl
index c361dd7..9f530da 100644
--- a/test/intrinsics/gen/textureSampleBias/df91bb.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleBias/df91bb.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_3d<f32>;
+@group(1) @binding(0) var arg_0 : texture_3d<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleBias_df91bb() {
   var res : vec4<f32> = textureSampleBias(arg_0, arg_1, vec3<f32>(), 1.0, vec3<i32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleBias_df91bb();
 }
diff --git a/test/intrinsics/gen/textureSampleBias/eed7c4.wgsl b/test/intrinsics/gen/textureSampleBias/eed7c4.wgsl
index a2df185..408326a 100644
--- a/test/intrinsics/gen/textureSampleBias/eed7c4.wgsl
+++ b/test/intrinsics/gen/textureSampleBias/eed7c4.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube_array<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleBias(texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: i32, bias: f32) -> vec4<f32>
 fn textureSampleBias_eed7c4() {
   var res: vec4<f32> = textureSampleBias(arg_0, arg_1, vec3<f32>(), 1, 1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleBias_eed7c4();
 }
diff --git a/test/intrinsics/gen/textureSampleBias/eed7c4.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleBias/eed7c4.wgsl.expected.wgsl
index c106d85..e2c3aa7 100644
--- a/test/intrinsics/gen/textureSampleBias/eed7c4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleBias/eed7c4.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube_array<f32>;
+@group(1) @binding(0) var arg_0 : texture_cube_array<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleBias_eed7c4() {
   var res : vec4<f32> = textureSampleBias(arg_0, arg_1, vec3<f32>(), 1, 1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleBias_eed7c4();
 }
diff --git a/test/intrinsics/gen/textureSampleCompare/25fcd1.wgsl b/test/intrinsics/gen/textureSampleCompare/25fcd1.wgsl
index 022bc66..3f6096a 100644
--- a/test/intrinsics/gen/textureSampleCompare/25fcd1.wgsl
+++ b/test/intrinsics/gen/textureSampleCompare/25fcd1.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d;
-[[group(1), binding(1)]] var arg_1: sampler_comparison;
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler_comparison;
 
 // fn textureSampleCompare(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32, offset: vec2<i32>) -> f32
 fn textureSampleCompare_25fcd1() {
   var res: f32 = textureSampleCompare(arg_0, arg_1, vec2<f32>(), 1.0, vec2<i32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompare_25fcd1();
 }
diff --git a/test/intrinsics/gen/textureSampleCompare/25fcd1.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleCompare/25fcd1.wgsl.expected.wgsl
index 7beb7ef..532be33 100644
--- a/test/intrinsics/gen/textureSampleCompare/25fcd1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleCompare/25fcd1.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_2d;
 
-[[group(1), binding(1)]] var arg_1 : sampler_comparison;
+@group(1) @binding(1) var arg_1 : sampler_comparison;
 
 fn textureSampleCompare_25fcd1() {
   var res : f32 = textureSampleCompare(arg_0, arg_1, vec2<f32>(), 1.0, vec2<i32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompare_25fcd1();
 }
diff --git a/test/intrinsics/gen/textureSampleCompare/3a5923.wgsl b/test/intrinsics/gen/textureSampleCompare/3a5923.wgsl
index e943215..1c2c30c 100644
--- a/test/intrinsics/gen/textureSampleCompare/3a5923.wgsl
+++ b/test/intrinsics/gen/textureSampleCompare/3a5923.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d;
-[[group(1), binding(1)]] var arg_1: sampler_comparison;
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler_comparison;
 
 // fn textureSampleCompare(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32) -> f32
 fn textureSampleCompare_3a5923() {
   var res: f32 = textureSampleCompare(arg_0, arg_1, vec2<f32>(), 1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompare_3a5923();
 }
diff --git a/test/intrinsics/gen/textureSampleCompare/3a5923.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleCompare/3a5923.wgsl.expected.wgsl
index a002ef2..eb88140 100644
--- a/test/intrinsics/gen/textureSampleCompare/3a5923.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleCompare/3a5923.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_2d;
 
-[[group(1), binding(1)]] var arg_1 : sampler_comparison;
+@group(1) @binding(1) var arg_1 : sampler_comparison;
 
 fn textureSampleCompare_3a5923() {
   var res : f32 = textureSampleCompare(arg_0, arg_1, vec2<f32>(), 1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompare_3a5923();
 }
diff --git a/test/intrinsics/gen/textureSampleCompare/63fb83.wgsl b/test/intrinsics/gen/textureSampleCompare/63fb83.wgsl
index 56bcd60..1accd53 100644
--- a/test/intrinsics/gen/textureSampleCompare/63fb83.wgsl
+++ b/test/intrinsics/gen/textureSampleCompare/63fb83.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_cube;
-[[group(1), binding(1)]] var arg_1: sampler_comparison;
+@group(1) @binding(0) var arg_0: texture_depth_cube;
+@group(1) @binding(1) var arg_1: sampler_comparison;
 
 // fn textureSampleCompare(texture: texture_depth_cube, sampler: sampler_comparison, coords: vec3<f32>, depth_ref: f32) -> f32
 fn textureSampleCompare_63fb83() {
   var res: f32 = textureSampleCompare(arg_0, arg_1, vec3<f32>(), 1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompare_63fb83();
 }
diff --git a/test/intrinsics/gen/textureSampleCompare/63fb83.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleCompare/63fb83.wgsl.expected.wgsl
index 622f997..38e555e 100644
--- a/test/intrinsics/gen/textureSampleCompare/63fb83.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleCompare/63fb83.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_cube;
+@group(1) @binding(0) var arg_0 : texture_depth_cube;
 
-[[group(1), binding(1)]] var arg_1 : sampler_comparison;
+@group(1) @binding(1) var arg_1 : sampler_comparison;
 
 fn textureSampleCompare_63fb83() {
   var res : f32 = textureSampleCompare(arg_0, arg_1, vec3<f32>(), 1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompare_63fb83();
 }
diff --git a/test/intrinsics/gen/textureSampleCompare/98b85c.wgsl b/test/intrinsics/gen/textureSampleCompare/98b85c.wgsl
index 2e77473..43552d7 100644
--- a/test/intrinsics/gen/textureSampleCompare/98b85c.wgsl
+++ b/test/intrinsics/gen/textureSampleCompare/98b85c.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d_array;
-[[group(1), binding(1)]] var arg_1: sampler_comparison;
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler_comparison;
 
 // fn textureSampleCompare(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: i32, depth_ref: f32, offset: vec2<i32>) -> f32
 fn textureSampleCompare_98b85c() {
   var res: f32 = textureSampleCompare(arg_0, arg_1, vec2<f32>(), 1, 1.0, vec2<i32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompare_98b85c();
 }
diff --git a/test/intrinsics/gen/textureSampleCompare/98b85c.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleCompare/98b85c.wgsl.expected.wgsl
index 6e6b107..de96847 100644
--- a/test/intrinsics/gen/textureSampleCompare/98b85c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleCompare/98b85c.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d_array;
+@group(1) @binding(0) var arg_0 : texture_depth_2d_array;
 
-[[group(1), binding(1)]] var arg_1 : sampler_comparison;
+@group(1) @binding(1) var arg_1 : sampler_comparison;
 
 fn textureSampleCompare_98b85c() {
   var res : f32 = textureSampleCompare(arg_0, arg_1, vec2<f32>(), 1, 1.0, vec2<i32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompare_98b85c();
 }
diff --git a/test/intrinsics/gen/textureSampleCompare/a3ca7e.wgsl b/test/intrinsics/gen/textureSampleCompare/a3ca7e.wgsl
index cb4665c..073e25a 100644
--- a/test/intrinsics/gen/textureSampleCompare/a3ca7e.wgsl
+++ b/test/intrinsics/gen/textureSampleCompare/a3ca7e.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_cube_array;
-[[group(1), binding(1)]] var arg_1: sampler_comparison;
+@group(1) @binding(0) var arg_0: texture_depth_cube_array;
+@group(1) @binding(1) var arg_1: sampler_comparison;
 
 // fn textureSampleCompare(texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: i32, depth_ref: f32) -> f32
 fn textureSampleCompare_a3ca7e() {
   var res: f32 = textureSampleCompare(arg_0, arg_1, vec3<f32>(), 1, 1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompare_a3ca7e();
 }
diff --git a/test/intrinsics/gen/textureSampleCompare/a3ca7e.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleCompare/a3ca7e.wgsl.expected.wgsl
index 2d8f4b1..5dc12e5 100644
--- a/test/intrinsics/gen/textureSampleCompare/a3ca7e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleCompare/a3ca7e.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_cube_array;
+@group(1) @binding(0) var arg_0 : texture_depth_cube_array;
 
-[[group(1), binding(1)]] var arg_1 : sampler_comparison;
+@group(1) @binding(1) var arg_1 : sampler_comparison;
 
 fn textureSampleCompare_a3ca7e() {
   var res : f32 = textureSampleCompare(arg_0, arg_1, vec3<f32>(), 1, 1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompare_a3ca7e();
 }
diff --git a/test/intrinsics/gen/textureSampleCompare/dd431d.wgsl b/test/intrinsics/gen/textureSampleCompare/dd431d.wgsl
index c4aa7d7..4291866 100644
--- a/test/intrinsics/gen/textureSampleCompare/dd431d.wgsl
+++ b/test/intrinsics/gen/textureSampleCompare/dd431d.wgsl
@@ -22,15 +22,15 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d_array;
-[[group(1), binding(1)]] var arg_1: sampler_comparison;
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler_comparison;
 
 // fn textureSampleCompare(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: i32, depth_ref: f32) -> f32
 fn textureSampleCompare_dd431d() {
   var res: f32 = textureSampleCompare(arg_0, arg_1, vec2<f32>(), 1, 1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompare_dd431d();
 }
diff --git a/test/intrinsics/gen/textureSampleCompare/dd431d.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleCompare/dd431d.wgsl.expected.wgsl
index 8a292ad..f36d443 100644
--- a/test/intrinsics/gen/textureSampleCompare/dd431d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleCompare/dd431d.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d_array;
+@group(1) @binding(0) var arg_0 : texture_depth_2d_array;
 
-[[group(1), binding(1)]] var arg_1 : sampler_comparison;
+@group(1) @binding(1) var arg_1 : sampler_comparison;
 
 fn textureSampleCompare_dd431d() {
   var res : f32 = textureSampleCompare(arg_0, arg_1, vec2<f32>(), 1, 1.0);
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompare_dd431d();
 }
diff --git a/test/intrinsics/gen/textureSampleCompareLevel/011a8f.wgsl b/test/intrinsics/gen/textureSampleCompareLevel/011a8f.wgsl
index 45b69ce..7cc7525 100644
--- a/test/intrinsics/gen/textureSampleCompareLevel/011a8f.wgsl
+++ b/test/intrinsics/gen/textureSampleCompareLevel/011a8f.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d_array;
-[[group(1), binding(1)]] var arg_1: sampler_comparison;
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler_comparison;
 
 // fn textureSampleCompareLevel(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: i32, depth_ref: f32, offset: vec2<i32>) -> f32
 fn textureSampleCompareLevel_011a8f() {
   var res: f32 = textureSampleCompareLevel(arg_0, arg_1, vec2<f32>(), 1, 1.0, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleCompareLevel_011a8f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompareLevel_011a8f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleCompareLevel_011a8f();
 }
diff --git a/test/intrinsics/gen/textureSampleCompareLevel/011a8f.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleCompareLevel/011a8f.wgsl.expected.wgsl
index 9c02468..d98d813 100644
--- a/test/intrinsics/gen/textureSampleCompareLevel/011a8f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleCompareLevel/011a8f.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d_array;
+@group(1) @binding(0) var arg_0 : texture_depth_2d_array;
 
-[[group(1), binding(1)]] var arg_1 : sampler_comparison;
+@group(1) @binding(1) var arg_1 : sampler_comparison;
 
 fn textureSampleCompareLevel_011a8f() {
   var res : f32 = textureSampleCompareLevel(arg_0, arg_1, vec2<f32>(), 1, 1.0, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleCompareLevel_011a8f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompareLevel_011a8f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleCompareLevel_011a8f();
 }
diff --git a/test/intrinsics/gen/textureSampleCompareLevel/1116ed.wgsl b/test/intrinsics/gen/textureSampleCompareLevel/1116ed.wgsl
index 363ccec..21a27d8 100644
--- a/test/intrinsics/gen/textureSampleCompareLevel/1116ed.wgsl
+++ b/test/intrinsics/gen/textureSampleCompareLevel/1116ed.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d_array;
-[[group(1), binding(1)]] var arg_1: sampler_comparison;
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler_comparison;
 
 // fn textureSampleCompareLevel(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: i32, depth_ref: f32) -> f32
 fn textureSampleCompareLevel_1116ed() {
   var res: f32 = textureSampleCompareLevel(arg_0, arg_1, vec2<f32>(), 1, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleCompareLevel_1116ed();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompareLevel_1116ed();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleCompareLevel_1116ed();
 }
diff --git a/test/intrinsics/gen/textureSampleCompareLevel/1116ed.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleCompareLevel/1116ed.wgsl.expected.wgsl
index aac38c8..97ee867 100644
--- a/test/intrinsics/gen/textureSampleCompareLevel/1116ed.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleCompareLevel/1116ed.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d_array;
+@group(1) @binding(0) var arg_0 : texture_depth_2d_array;
 
-[[group(1), binding(1)]] var arg_1 : sampler_comparison;
+@group(1) @binding(1) var arg_1 : sampler_comparison;
 
 fn textureSampleCompareLevel_1116ed() {
   var res : f32 = textureSampleCompareLevel(arg_0, arg_1, vec2<f32>(), 1, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleCompareLevel_1116ed();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompareLevel_1116ed();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleCompareLevel_1116ed();
 }
diff --git a/test/intrinsics/gen/textureSampleCompareLevel/1568e3.wgsl b/test/intrinsics/gen/textureSampleCompareLevel/1568e3.wgsl
index 21daae7..30c2867 100644
--- a/test/intrinsics/gen/textureSampleCompareLevel/1568e3.wgsl
+++ b/test/intrinsics/gen/textureSampleCompareLevel/1568e3.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_cube;
-[[group(1), binding(1)]] var arg_1: sampler_comparison;
+@group(1) @binding(0) var arg_0: texture_depth_cube;
+@group(1) @binding(1) var arg_1: sampler_comparison;
 
 // fn textureSampleCompareLevel(texture: texture_depth_cube, sampler: sampler_comparison, coords: vec3<f32>, depth_ref: f32) -> f32
 fn textureSampleCompareLevel_1568e3() {
   var res: f32 = textureSampleCompareLevel(arg_0, arg_1, vec3<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleCompareLevel_1568e3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompareLevel_1568e3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleCompareLevel_1568e3();
 }
diff --git a/test/intrinsics/gen/textureSampleCompareLevel/1568e3.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleCompareLevel/1568e3.wgsl.expected.wgsl
index 06ad79e..ff5e88d 100644
--- a/test/intrinsics/gen/textureSampleCompareLevel/1568e3.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleCompareLevel/1568e3.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_cube;
+@group(1) @binding(0) var arg_0 : texture_depth_cube;
 
-[[group(1), binding(1)]] var arg_1 : sampler_comparison;
+@group(1) @binding(1) var arg_1 : sampler_comparison;
 
 fn textureSampleCompareLevel_1568e3() {
   var res : f32 = textureSampleCompareLevel(arg_0, arg_1, vec3<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleCompareLevel_1568e3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompareLevel_1568e3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleCompareLevel_1568e3();
 }
diff --git a/test/intrinsics/gen/textureSampleCompareLevel/2ad2b1.wgsl b/test/intrinsics/gen/textureSampleCompareLevel/2ad2b1.wgsl
index 6cead7a..6a6fcee 100644
--- a/test/intrinsics/gen/textureSampleCompareLevel/2ad2b1.wgsl
+++ b/test/intrinsics/gen/textureSampleCompareLevel/2ad2b1.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d;
-[[group(1), binding(1)]] var arg_1: sampler_comparison;
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler_comparison;
 
 // fn textureSampleCompareLevel(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32) -> f32
 fn textureSampleCompareLevel_2ad2b1() {
   var res: f32 = textureSampleCompareLevel(arg_0, arg_1, vec2<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleCompareLevel_2ad2b1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompareLevel_2ad2b1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleCompareLevel_2ad2b1();
 }
diff --git a/test/intrinsics/gen/textureSampleCompareLevel/2ad2b1.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleCompareLevel/2ad2b1.wgsl.expected.wgsl
index 24be312..76fe2cb 100644
--- a/test/intrinsics/gen/textureSampleCompareLevel/2ad2b1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleCompareLevel/2ad2b1.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_2d;
 
-[[group(1), binding(1)]] var arg_1 : sampler_comparison;
+@group(1) @binding(1) var arg_1 : sampler_comparison;
 
 fn textureSampleCompareLevel_2ad2b1() {
   var res : f32 = textureSampleCompareLevel(arg_0, arg_1, vec2<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleCompareLevel_2ad2b1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompareLevel_2ad2b1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleCompareLevel_2ad2b1();
 }
diff --git a/test/intrinsics/gen/textureSampleCompareLevel/4cf3a2.wgsl b/test/intrinsics/gen/textureSampleCompareLevel/4cf3a2.wgsl
index 86b87ea..02d5f74 100644
--- a/test/intrinsics/gen/textureSampleCompareLevel/4cf3a2.wgsl
+++ b/test/intrinsics/gen/textureSampleCompareLevel/4cf3a2.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_cube_array;
-[[group(1), binding(1)]] var arg_1: sampler_comparison;
+@group(1) @binding(0) var arg_0: texture_depth_cube_array;
+@group(1) @binding(1) var arg_1: sampler_comparison;
 
 // fn textureSampleCompareLevel(texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: i32, depth_ref: f32) -> f32
 fn textureSampleCompareLevel_4cf3a2() {
   var res: f32 = textureSampleCompareLevel(arg_0, arg_1, vec3<f32>(), 1, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleCompareLevel_4cf3a2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompareLevel_4cf3a2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleCompareLevel_4cf3a2();
 }
diff --git a/test/intrinsics/gen/textureSampleCompareLevel/4cf3a2.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleCompareLevel/4cf3a2.wgsl.expected.wgsl
index efdac05..1fb3470 100644
--- a/test/intrinsics/gen/textureSampleCompareLevel/4cf3a2.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleCompareLevel/4cf3a2.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_cube_array;
+@group(1) @binding(0) var arg_0 : texture_depth_cube_array;
 
-[[group(1), binding(1)]] var arg_1 : sampler_comparison;
+@group(1) @binding(1) var arg_1 : sampler_comparison;
 
 fn textureSampleCompareLevel_4cf3a2() {
   var res : f32 = textureSampleCompareLevel(arg_0, arg_1, vec3<f32>(), 1, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleCompareLevel_4cf3a2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompareLevel_4cf3a2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleCompareLevel_4cf3a2();
 }
diff --git a/test/intrinsics/gen/textureSampleCompareLevel/f8121c.wgsl b/test/intrinsics/gen/textureSampleCompareLevel/f8121c.wgsl
index 5fc6e60..97401ce 100644
--- a/test/intrinsics/gen/textureSampleCompareLevel/f8121c.wgsl
+++ b/test/intrinsics/gen/textureSampleCompareLevel/f8121c.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d;
-[[group(1), binding(1)]] var arg_1: sampler_comparison;
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler_comparison;
 
 // fn textureSampleCompareLevel(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32, offset: vec2<i32>) -> f32
 fn textureSampleCompareLevel_f8121c() {
   var res: f32 = textureSampleCompareLevel(arg_0, arg_1, vec2<f32>(), 1.0, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleCompareLevel_f8121c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompareLevel_f8121c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleCompareLevel_f8121c();
 }
diff --git a/test/intrinsics/gen/textureSampleCompareLevel/f8121c.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleCompareLevel/f8121c.wgsl.expected.wgsl
index 5012e84..a63e6b3 100644
--- a/test/intrinsics/gen/textureSampleCompareLevel/f8121c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleCompareLevel/f8121c.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_2d;
 
-[[group(1), binding(1)]] var arg_1 : sampler_comparison;
+@group(1) @binding(1) var arg_1 : sampler_comparison;
 
 fn textureSampleCompareLevel_f8121c() {
   var res : f32 = textureSampleCompareLevel(arg_0, arg_1, vec2<f32>(), 1.0, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleCompareLevel_f8121c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleCompareLevel_f8121c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleCompareLevel_f8121c();
 }
diff --git a/test/intrinsics/gen/textureSampleGrad/21402b.wgsl b/test/intrinsics/gen/textureSampleGrad/21402b.wgsl
index c2abcf5..8d8aa0f 100644
--- a/test/intrinsics/gen/textureSampleGrad/21402b.wgsl
+++ b/test/intrinsics/gen/textureSampleGrad/21402b.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_3d<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleGrad(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, ddx: vec3<f32>, ddy: vec3<f32>) -> vec4<f32>
 fn textureSampleGrad_21402b() {
   var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec3<f32>(), vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleGrad_21402b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleGrad_21402b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleGrad_21402b();
 }
diff --git a/test/intrinsics/gen/textureSampleGrad/21402b.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleGrad/21402b.wgsl.expected.wgsl
index c2c4814..c5e185c 100644
--- a/test/intrinsics/gen/textureSampleGrad/21402b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleGrad/21402b.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_3d<f32>;
+@group(1) @binding(0) var arg_0 : texture_3d<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleGrad_21402b() {
   var res : vec4<f32> = textureSampleGrad(arg_0, arg_1, vec3<f32>(), vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleGrad_21402b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleGrad_21402b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleGrad_21402b();
 }
diff --git a/test/intrinsics/gen/textureSampleGrad/2ecd8f.wgsl b/test/intrinsics/gen/textureSampleGrad/2ecd8f.wgsl
index d615afa..5c242be 100644
--- a/test/intrinsics/gen/textureSampleGrad/2ecd8f.wgsl
+++ b/test/intrinsics/gen/textureSampleGrad/2ecd8f.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d_array<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleGrad(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, ddx: vec2<f32>, ddy: vec2<f32>) -> vec4<f32>
 fn textureSampleGrad_2ecd8f() {
   var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec2<f32>(), 1, vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleGrad_2ecd8f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleGrad_2ecd8f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleGrad_2ecd8f();
 }
diff --git a/test/intrinsics/gen/textureSampleGrad/2ecd8f.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleGrad/2ecd8f.wgsl.expected.wgsl
index 4c80e96..233ce18 100644
--- a/test/intrinsics/gen/textureSampleGrad/2ecd8f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleGrad/2ecd8f.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d_array<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d_array<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleGrad_2ecd8f() {
   var res : vec4<f32> = textureSampleGrad(arg_0, arg_1, vec2<f32>(), 1, vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleGrad_2ecd8f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleGrad_2ecd8f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleGrad_2ecd8f();
 }
diff --git a/test/intrinsics/gen/textureSampleGrad/468f88.wgsl b/test/intrinsics/gen/textureSampleGrad/468f88.wgsl
index 54d36db..7749ccd 100644
--- a/test/intrinsics/gen/textureSampleGrad/468f88.wgsl
+++ b/test/intrinsics/gen/textureSampleGrad/468f88.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleGrad(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, ddx: vec2<f32>, ddy: vec2<f32>, offset: vec2<i32>) -> vec4<f32>
 fn textureSampleGrad_468f88() {
   var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec2<f32>(), vec2<f32>(), vec2<f32>(), vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleGrad_468f88();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleGrad_468f88();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleGrad_468f88();
 }
diff --git a/test/intrinsics/gen/textureSampleGrad/468f88.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleGrad/468f88.wgsl.expected.wgsl
index 510cb94..fc63b37 100644
--- a/test/intrinsics/gen/textureSampleGrad/468f88.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleGrad/468f88.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleGrad_468f88() {
   var res : vec4<f32> = textureSampleGrad(arg_0, arg_1, vec2<f32>(), vec2<f32>(), vec2<f32>(), vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleGrad_468f88();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleGrad_468f88();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleGrad_468f88();
 }
diff --git a/test/intrinsics/gen/textureSampleGrad/521263.wgsl b/test/intrinsics/gen/textureSampleGrad/521263.wgsl
index 1e5e25b..7f832e9 100644
--- a/test/intrinsics/gen/textureSampleGrad/521263.wgsl
+++ b/test/intrinsics/gen/textureSampleGrad/521263.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleGrad(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, ddx: vec2<f32>, ddy: vec2<f32>) -> vec4<f32>
 fn textureSampleGrad_521263() {
   var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec2<f32>(), vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleGrad_521263();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleGrad_521263();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleGrad_521263();
 }
diff --git a/test/intrinsics/gen/textureSampleGrad/521263.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleGrad/521263.wgsl.expected.wgsl
index a4f4403..f440117 100644
--- a/test/intrinsics/gen/textureSampleGrad/521263.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleGrad/521263.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleGrad_521263() {
   var res : vec4<f32> = textureSampleGrad(arg_0, arg_1, vec2<f32>(), vec2<f32>(), vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleGrad_521263();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleGrad_521263();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleGrad_521263();
 }
diff --git a/test/intrinsics/gen/textureSampleGrad/5312f4.wgsl b/test/intrinsics/gen/textureSampleGrad/5312f4.wgsl
index a316e8c..47a84a9 100644
--- a/test/intrinsics/gen/textureSampleGrad/5312f4.wgsl
+++ b/test/intrinsics/gen/textureSampleGrad/5312f4.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_cube<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleGrad(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>, ddx: vec3<f32>, ddy: vec3<f32>) -> vec4<f32>
 fn textureSampleGrad_5312f4() {
   var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec3<f32>(), vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleGrad_5312f4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleGrad_5312f4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleGrad_5312f4();
 }
diff --git a/test/intrinsics/gen/textureSampleGrad/5312f4.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleGrad/5312f4.wgsl.expected.wgsl
index 2dd32a8..22507b7 100644
--- a/test/intrinsics/gen/textureSampleGrad/5312f4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleGrad/5312f4.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube<f32>;
+@group(1) @binding(0) var arg_0 : texture_cube<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleGrad_5312f4() {
   var res : vec4<f32> = textureSampleGrad(arg_0, arg_1, vec3<f32>(), vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleGrad_5312f4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleGrad_5312f4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleGrad_5312f4();
 }
diff --git a/test/intrinsics/gen/textureSampleGrad/872f00.wgsl b/test/intrinsics/gen/textureSampleGrad/872f00.wgsl
index 8dbecf8..cfb073f 100644
--- a/test/intrinsics/gen/textureSampleGrad/872f00.wgsl
+++ b/test/intrinsics/gen/textureSampleGrad/872f00.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d_array<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleGrad(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, ddx: vec2<f32>, ddy: vec2<f32>, offset: vec2<i32>) -> vec4<f32>
 fn textureSampleGrad_872f00() {
   var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec2<f32>(), 1, vec2<f32>(), vec2<f32>(), vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleGrad_872f00();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleGrad_872f00();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleGrad_872f00();
 }
diff --git a/test/intrinsics/gen/textureSampleGrad/872f00.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleGrad/872f00.wgsl.expected.wgsl
index ff9ca46..095fe4f 100644
--- a/test/intrinsics/gen/textureSampleGrad/872f00.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleGrad/872f00.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d_array<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d_array<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleGrad_872f00() {
   var res : vec4<f32> = textureSampleGrad(arg_0, arg_1, vec2<f32>(), 1, vec2<f32>(), vec2<f32>(), vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleGrad_872f00();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleGrad_872f00();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleGrad_872f00();
 }
diff --git a/test/intrinsics/gen/textureSampleGrad/e383db.wgsl b/test/intrinsics/gen/textureSampleGrad/e383db.wgsl
index 20546aa..e2f4c94 100644
--- a/test/intrinsics/gen/textureSampleGrad/e383db.wgsl
+++ b/test/intrinsics/gen/textureSampleGrad/e383db.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube_array<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleGrad(texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: i32, ddx: vec3<f32>, ddy: vec3<f32>) -> vec4<f32>
 fn textureSampleGrad_e383db() {
   var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec3<f32>(), 1, vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleGrad_e383db();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleGrad_e383db();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleGrad_e383db();
 }
diff --git a/test/intrinsics/gen/textureSampleGrad/e383db.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleGrad/e383db.wgsl.expected.wgsl
index b846790..dad5f7f 100644
--- a/test/intrinsics/gen/textureSampleGrad/e383db.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleGrad/e383db.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube_array<f32>;
+@group(1) @binding(0) var arg_0 : texture_cube_array<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleGrad_e383db() {
   var res : vec4<f32> = textureSampleGrad(arg_0, arg_1, vec3<f32>(), 1, vec3<f32>(), vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleGrad_e383db();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleGrad_e383db();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleGrad_e383db();
 }
diff --git a/test/intrinsics/gen/textureSampleGrad/e9a2f7.wgsl b/test/intrinsics/gen/textureSampleGrad/e9a2f7.wgsl
index 831a72e..aa909fa 100644
--- a/test/intrinsics/gen/textureSampleGrad/e9a2f7.wgsl
+++ b/test/intrinsics/gen/textureSampleGrad/e9a2f7.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_3d<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleGrad(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, ddx: vec3<f32>, ddy: vec3<f32>, offset: vec3<i32>) -> vec4<f32>
 fn textureSampleGrad_e9a2f7() {
   var res: vec4<f32> = textureSampleGrad(arg_0, arg_1, vec3<f32>(), vec3<f32>(), vec3<f32>(), vec3<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleGrad_e9a2f7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleGrad_e9a2f7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleGrad_e9a2f7();
 }
diff --git a/test/intrinsics/gen/textureSampleGrad/e9a2f7.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleGrad/e9a2f7.wgsl.expected.wgsl
index cbff0fa..4336d02 100644
--- a/test/intrinsics/gen/textureSampleGrad/e9a2f7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleGrad/e9a2f7.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_3d<f32>;
+@group(1) @binding(0) var arg_0 : texture_3d<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleGrad_e9a2f7() {
   var res : vec4<f32> = textureSampleGrad(arg_0, arg_1, vec3<f32>(), vec3<f32>(), vec3<f32>(), vec3<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleGrad_e9a2f7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleGrad_e9a2f7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleGrad_e9a2f7();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/02be59.wgsl b/test/intrinsics/gen/textureSampleLevel/02be59.wgsl
index 5cb8e08..421b596 100644
--- a/test/intrinsics/gen/textureSampleLevel/02be59.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/02be59.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleLevel(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, level: i32) -> f32
 fn textureSampleLevel_02be59() {
   var res: f32 = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_02be59();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_02be59();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_02be59();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/02be59.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleLevel/02be59.wgsl.expected.wgsl
index a106167..e5eb1c6 100644
--- a/test/intrinsics/gen/textureSampleLevel/02be59.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/02be59.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_2d;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleLevel_02be59() {
   var res : f32 = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_02be59();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_02be59();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_02be59();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/0bdd9a.wgsl b/test/intrinsics/gen/textureSampleLevel/0bdd9a.wgsl
index 764c0a2..c8a3064 100644
--- a/test/intrinsics/gen/textureSampleLevel/0bdd9a.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/0bdd9a.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube_array<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_cube_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleLevel(texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: i32, level: f32) -> vec4<f32>
 fn textureSampleLevel_0bdd9a() {
   var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 1, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_0bdd9a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_0bdd9a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_0bdd9a();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/0bdd9a.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleLevel/0bdd9a.wgsl.expected.wgsl
index 8e83754..432273c 100644
--- a/test/intrinsics/gen/textureSampleLevel/0bdd9a.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/0bdd9a.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube_array<f32>;
+@group(1) @binding(0) var arg_0 : texture_cube_array<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleLevel_0bdd9a() {
   var res : vec4<f32> = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 1, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_0bdd9a();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_0bdd9a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_0bdd9a();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/1b0291.wgsl b/test/intrinsics/gen/textureSampleLevel/1b0291.wgsl
index 2c5bbe1..c7a2186 100644
--- a/test/intrinsics/gen/textureSampleLevel/1b0291.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/1b0291.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_cube;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_depth_cube;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleLevel(texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>, level: i32) -> f32
 fn textureSampleLevel_1b0291() {
   var res: f32 = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_1b0291();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_1b0291();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_1b0291();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/1b0291.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleLevel/1b0291.wgsl.expected.wgsl
index 3699406..8ce844e 100644
--- a/test/intrinsics/gen/textureSampleLevel/1b0291.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/1b0291.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_cube;
+@group(1) @binding(0) var arg_0 : texture_depth_cube;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleLevel_1b0291() {
   var res : f32 = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_1b0291();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_1b0291();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_1b0291();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/1bf73e.wgsl b/test/intrinsics/gen/textureSampleLevel/1bf73e.wgsl
index 7ddc6dc..c7a13c2 100644
--- a/test/intrinsics/gen/textureSampleLevel/1bf73e.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/1bf73e.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d_array;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleLevel(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: i32, level: i32) -> f32
 fn textureSampleLevel_1bf73e() {
   var res: f32 = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_1bf73e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_1bf73e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_1bf73e();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/1bf73e.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleLevel/1bf73e.wgsl.expected.wgsl
index dfd0fff..ff739ce 100644
--- a/test/intrinsics/gen/textureSampleLevel/1bf73e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/1bf73e.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d_array;
+@group(1) @binding(0) var arg_0 : texture_depth_2d_array;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleLevel_1bf73e() {
   var res : f32 = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_1bf73e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_1bf73e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_1bf73e();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/302be4.wgsl b/test/intrinsics/gen/textureSampleLevel/302be4.wgsl
index 7f57f11..a1c1612 100644
--- a/test/intrinsics/gen/textureSampleLevel/302be4.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/302be4.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d_array<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleLevel(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, level: f32) -> vec4<f32>
 fn textureSampleLevel_302be4() {
   var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_302be4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_302be4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_302be4();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/302be4.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleLevel/302be4.wgsl.expected.wgsl
index 1fd7e8e..15af8c6 100644
--- a/test/intrinsics/gen/textureSampleLevel/302be4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/302be4.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d_array<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d_array<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleLevel_302be4() {
   var res : vec4<f32> = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1, 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_302be4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_302be4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_302be4();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/47daa4.wgsl b/test/intrinsics/gen/textureSampleLevel/47daa4.wgsl
index 5cdb1b7..bda5904 100644
--- a/test/intrinsics/gen/textureSampleLevel/47daa4.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/47daa4.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_depth_2d;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleLevel(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, level: i32, offset: vec2<i32>) -> f32
 fn textureSampleLevel_47daa4() {
   var res: f32 = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 0, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_47daa4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_47daa4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_47daa4();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/47daa4.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleLevel/47daa4.wgsl.expected.wgsl
index 2a7967f..28ee908 100644
--- a/test/intrinsics/gen/textureSampleLevel/47daa4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/47daa4.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_2d;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleLevel_47daa4() {
   var res : f32 = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 0, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_47daa4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_47daa4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_47daa4();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/690d95.wgsl b/test/intrinsics/gen/textureSampleLevel/690d95.wgsl
index d478f65..d748cdc 100644
--- a/test/intrinsics/gen/textureSampleLevel/690d95.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/690d95.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleLevel(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, level: f32, offset: vec2<i32>) -> vec4<f32>
 fn textureSampleLevel_690d95() {
   var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1.0, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_690d95();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_690d95();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_690d95();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/690d95.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleLevel/690d95.wgsl.expected.wgsl
index be08453..6584e46 100644
--- a/test/intrinsics/gen/textureSampleLevel/690d95.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/690d95.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleLevel_690d95() {
   var res : vec4<f32> = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1.0, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_690d95();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_690d95();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_690d95();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/979816.wgsl b/test/intrinsics/gen/textureSampleLevel/979816.wgsl
index 8de5d5e..4636091 100644
--- a/test/intrinsics/gen/textureSampleLevel/979816.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/979816.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_external;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_external;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleLevel(texture: texture_external, sampler: sampler, coords: vec2<f32>) -> vec4<f32>
 fn textureSampleLevel_979816() {
   var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_979816();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_979816();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_979816();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/979816.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleLevel/979816.wgsl.expected.wgsl
index eef21a3..3d1980f 100644
--- a/test/intrinsics/gen/textureSampleLevel/979816.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/979816.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_external;
+@group(1) @binding(0) var arg_0 : texture_external;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleLevel_979816() {
   var res : vec4<f32> = textureSampleLevel(arg_0, arg_1, vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_979816();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_979816();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_979816();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/9bd37b.wgsl b/test/intrinsics/gen/textureSampleLevel/9bd37b.wgsl
index 1d3a8b4..18304c8 100644
--- a/test/intrinsics/gen/textureSampleLevel/9bd37b.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/9bd37b.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_3d<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleLevel(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, level: f32, offset: vec3<i32>) -> vec4<f32>
 fn textureSampleLevel_9bd37b() {
   var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 1.0, vec3<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_9bd37b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_9bd37b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_9bd37b();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/9bd37b.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleLevel/9bd37b.wgsl.expected.wgsl
index ee5d006..081f0c3 100644
--- a/test/intrinsics/gen/textureSampleLevel/9bd37b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/9bd37b.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_3d<f32>;
+@group(1) @binding(0) var arg_0 : texture_3d<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleLevel_9bd37b() {
   var res : vec4<f32> = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 1.0, vec3<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_9bd37b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_9bd37b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_9bd37b();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/a4af26.wgsl b/test/intrinsics/gen/textureSampleLevel/a4af26.wgsl
index ac3e45a..ffb83eb 100644
--- a/test/intrinsics/gen/textureSampleLevel/a4af26.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/a4af26.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d_array<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_2d_array<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleLevel(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: i32, level: f32, offset: vec2<i32>) -> vec4<f32>
 fn textureSampleLevel_a4af26() {
   var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1, 1.0, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_a4af26();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_a4af26();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_a4af26();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/a4af26.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleLevel/a4af26.wgsl.expected.wgsl
index 7d4bfb0..69f8f80 100644
--- a/test/intrinsics/gen/textureSampleLevel/a4af26.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/a4af26.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d_array<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d_array<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleLevel_a4af26() {
   var res : vec4<f32> = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1, 1.0, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_a4af26();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_a4af26();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_a4af26();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/abfcc0.wgsl b/test/intrinsics/gen/textureSampleLevel/abfcc0.wgsl
index dede1e3..3cf621a 100644
--- a/test/intrinsics/gen/textureSampleLevel/abfcc0.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/abfcc0.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_3d<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_3d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleLevel(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, level: f32) -> vec4<f32>
 fn textureSampleLevel_abfcc0() {
   var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_abfcc0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_abfcc0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_abfcc0();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/abfcc0.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleLevel/abfcc0.wgsl.expected.wgsl
index a8af47d..f8f6faf 100644
--- a/test/intrinsics/gen/textureSampleLevel/abfcc0.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/abfcc0.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_3d<f32>;
+@group(1) @binding(0) var arg_0 : texture_3d<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleLevel_abfcc0() {
   var res : vec4<f32> = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_abfcc0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_abfcc0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_abfcc0();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/ae5e39.wgsl b/test/intrinsics/gen/textureSampleLevel/ae5e39.wgsl
index 67bb4b6..bca3189 100644
--- a/test/intrinsics/gen/textureSampleLevel/ae5e39.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/ae5e39.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_cube_array;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_depth_cube_array;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleLevel(texture: texture_depth_cube_array, sampler: sampler, coords: vec3<f32>, array_index: i32, level: i32) -> f32
 fn textureSampleLevel_ae5e39() {
   var res: f32 = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 1, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_ae5e39();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_ae5e39();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_ae5e39();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/ae5e39.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleLevel/ae5e39.wgsl.expected.wgsl
index de37db1..4fc5ac8 100644
--- a/test/intrinsics/gen/textureSampleLevel/ae5e39.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/ae5e39.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_cube_array;
+@group(1) @binding(0) var arg_0 : texture_depth_cube_array;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleLevel_ae5e39() {
   var res : f32 = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 1, 0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_ae5e39();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_ae5e39();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_ae5e39();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/ba93b3.wgsl b/test/intrinsics/gen/textureSampleLevel/ba93b3.wgsl
index d1b9b7b..07958ef 100644
--- a/test/intrinsics/gen/textureSampleLevel/ba93b3.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/ba93b3.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_depth_2d_array;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_depth_2d_array;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleLevel(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: i32, level: i32, offset: vec2<i32>) -> f32
 fn textureSampleLevel_ba93b3() {
   var res: f32 = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1, 0, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_ba93b3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_ba93b3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_ba93b3();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/ba93b3.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleLevel/ba93b3.wgsl.expected.wgsl
index 927d4c8..954891c 100644
--- a/test/intrinsics/gen/textureSampleLevel/ba93b3.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/ba93b3.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_2d_array;
+@group(1) @binding(0) var arg_0 : texture_depth_2d_array;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleLevel_ba93b3() {
   var res : f32 = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1, 0, vec2<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_ba93b3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_ba93b3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_ba93b3();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/c32df7.wgsl b/test/intrinsics/gen/textureSampleLevel/c32df7.wgsl
index 01c67ac..9dc6e15 100644
--- a/test/intrinsics/gen/textureSampleLevel/c32df7.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/c32df7.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_cube<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_cube<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleLevel(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>, level: f32) -> vec4<f32>
 fn textureSampleLevel_c32df7() {
   var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_c32df7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_c32df7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_c32df7();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/c32df7.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleLevel/c32df7.wgsl.expected.wgsl
index e9fb633..2f2df13 100644
--- a/test/intrinsics/gen/textureSampleLevel/c32df7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/c32df7.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_cube<f32>;
+@group(1) @binding(0) var arg_0 : texture_cube<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleLevel_c32df7() {
   var res : vec4<f32> = textureSampleLevel(arg_0, arg_1, vec3<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_c32df7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_c32df7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_c32df7();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/c6aca6.wgsl b/test/intrinsics/gen/textureSampleLevel/c6aca6.wgsl
index 84b92c4..f58dfd1 100644
--- a/test/intrinsics/gen/textureSampleLevel/c6aca6.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/c6aca6.wgsl
@@ -22,26 +22,26 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_2d<f32>;
-[[group(1), binding(1)]] var arg_1: sampler;
+@group(1) @binding(0) var arg_0: texture_2d<f32>;
+@group(1) @binding(1) var arg_1: sampler;
 
 // fn textureSampleLevel(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, level: f32) -> vec4<f32>
 fn textureSampleLevel_c6aca6() {
   var res: vec4<f32> = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_c6aca6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_c6aca6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_c6aca6();
 }
diff --git a/test/intrinsics/gen/textureSampleLevel/c6aca6.wgsl.expected.wgsl b/test/intrinsics/gen/textureSampleLevel/c6aca6.wgsl.expected.wgsl
index 841a155..35dc735 100644
--- a/test/intrinsics/gen/textureSampleLevel/c6aca6.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureSampleLevel/c6aca6.wgsl.expected.wgsl
@@ -1,23 +1,23 @@
-[[group(1), binding(0)]] var arg_0 : texture_2d<f32>;
+@group(1) @binding(0) var arg_0 : texture_2d<f32>;
 
-[[group(1), binding(1)]] var arg_1 : sampler;
+@group(1) @binding(1) var arg_1 : sampler;
 
 fn textureSampleLevel_c6aca6() {
   var res : vec4<f32> = textureSampleLevel(arg_0, arg_1, vec2<f32>(), 1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureSampleLevel_c6aca6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureSampleLevel_c6aca6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureSampleLevel_c6aca6();
 }
diff --git a/test/intrinsics/gen/textureStore/05ce15.wgsl b/test/intrinsics/gen/textureStore/05ce15.wgsl
index 9529592..8bccc96 100644
--- a/test/intrinsics/gen/textureStore/05ce15.wgsl
+++ b/test/intrinsics/gen/textureStore/05ce15.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rgba32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba32float, write>;
 
 // fn textureStore(texture: texture_storage_2d<rgba32float, write>, coords: vec2<i32>, value: vec4<f32>)
 fn textureStore_05ce15() {
   textureStore(arg_0, vec2<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_05ce15();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_05ce15();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_05ce15();
 }
diff --git a/test/intrinsics/gen/textureStore/05ce15.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/05ce15.wgsl.expected.wgsl
index 17e60e2..2627d0e 100644
--- a/test/intrinsics/gen/textureStore/05ce15.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/05ce15.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rgba32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rgba32float, write>;
 
 fn textureStore_05ce15() {
   textureStore(arg_0, vec2<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_05ce15();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_05ce15();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_05ce15();
 }
diff --git a/test/intrinsics/gen/textureStore/064c7f.wgsl b/test/intrinsics/gen/textureStore/064c7f.wgsl
index 3681bb3..71130e4 100644
--- a/test/intrinsics/gen/textureStore/064c7f.wgsl
+++ b/test/intrinsics/gen/textureStore/064c7f.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rg32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rg32float, write>;
 
 // fn textureStore(texture: texture_storage_2d<rg32float, write>, coords: vec2<i32>, value: vec4<f32>)
 fn textureStore_064c7f() {
   textureStore(arg_0, vec2<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_064c7f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_064c7f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_064c7f();
 }
diff --git a/test/intrinsics/gen/textureStore/064c7f.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/064c7f.wgsl.expected.wgsl
index 126b43c..042b3af 100644
--- a/test/intrinsics/gen/textureStore/064c7f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/064c7f.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rg32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rg32float, write>;
 
 fn textureStore_064c7f() {
   textureStore(arg_0, vec2<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_064c7f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_064c7f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_064c7f();
 }
diff --git a/test/intrinsics/gen/textureStore/068641.wgsl b/test/intrinsics/gen/textureStore/068641.wgsl
index 7b5aa2a..7b10529 100644
--- a/test/intrinsics/gen/textureStore/068641.wgsl
+++ b/test/intrinsics/gen/textureStore/068641.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rgba16uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba16uint, write>;
 
 // fn textureStore(texture: texture_storage_3d<rgba16uint, write>, coords: vec3<i32>, value: vec4<u32>)
 fn textureStore_068641() {
   textureStore(arg_0, vec3<i32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_068641();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_068641();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_068641();
 }
diff --git a/test/intrinsics/gen/textureStore/068641.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/068641.wgsl.expected.wgsl
index 39b2602..5b3279a 100644
--- a/test/intrinsics/gen/textureStore/068641.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/068641.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rgba16uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rgba16uint, write>;
 
 fn textureStore_068641() {
   textureStore(arg_0, vec3<i32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_068641();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_068641();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_068641();
 }
diff --git a/test/intrinsics/gen/textureStore/0af6b5.wgsl b/test/intrinsics/gen/textureStore/0af6b5.wgsl
index a87fa55..d66614e 100644
--- a/test/intrinsics/gen/textureStore/0af6b5.wgsl
+++ b/test/intrinsics/gen/textureStore/0af6b5.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<r32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<r32float, write>;
 
 // fn textureStore(texture: texture_storage_2d<r32float, write>, coords: vec2<i32>, value: vec4<f32>)
 fn textureStore_0af6b5() {
   textureStore(arg_0, vec2<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_0af6b5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_0af6b5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_0af6b5();
 }
diff --git a/test/intrinsics/gen/textureStore/0af6b5.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/0af6b5.wgsl.expected.wgsl
index 33ce448..1e67b08 100644
--- a/test/intrinsics/gen/textureStore/0af6b5.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/0af6b5.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<r32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<r32float, write>;
 
 fn textureStore_0af6b5() {
   textureStore(arg_0, vec2<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_0af6b5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_0af6b5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_0af6b5();
 }
diff --git a/test/intrinsics/gen/textureStore/0c3dff.wgsl b/test/intrinsics/gen/textureStore/0c3dff.wgsl
index c20ffd6..4ace9a9 100644
--- a/test/intrinsics/gen/textureStore/0c3dff.wgsl
+++ b/test/intrinsics/gen/textureStore/0c3dff.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rgba16uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba16uint, write>;
 
 // fn textureStore(texture: texture_storage_2d<rgba16uint, write>, coords: vec2<i32>, value: vec4<u32>)
 fn textureStore_0c3dff() {
   textureStore(arg_0, vec2<i32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_0c3dff();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_0c3dff();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_0c3dff();
 }
diff --git a/test/intrinsics/gen/textureStore/0c3dff.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/0c3dff.wgsl.expected.wgsl
index ca12685..b115e07 100644
--- a/test/intrinsics/gen/textureStore/0c3dff.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/0c3dff.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rgba16uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rgba16uint, write>;
 
 fn textureStore_0c3dff() {
   textureStore(arg_0, vec2<i32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_0c3dff();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_0c3dff();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_0c3dff();
 }
diff --git a/test/intrinsics/gen/textureStore/102722.wgsl b/test/intrinsics/gen/textureStore/102722.wgsl
index cd6394d..a096321 100644
--- a/test/intrinsics/gen/textureStore/102722.wgsl
+++ b/test/intrinsics/gen/textureStore/102722.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<r32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<r32uint, write>;
 
 // fn textureStore(texture: texture_storage_1d<r32uint, write>, coords: i32, value: vec4<u32>)
 fn textureStore_102722() {
   textureStore(arg_0, 1, vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_102722();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_102722();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_102722();
 }
diff --git a/test/intrinsics/gen/textureStore/102722.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/102722.wgsl.expected.wgsl
index cf2500f..593c342 100644
--- a/test/intrinsics/gen/textureStore/102722.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/102722.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<r32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<r32uint, write>;
 
 fn textureStore_102722() {
   textureStore(arg_0, 1, vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_102722();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_102722();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_102722();
 }
diff --git a/test/intrinsics/gen/textureStore/1bbd08.wgsl b/test/intrinsics/gen/textureStore/1bbd08.wgsl
index 6f05f8b..922921b 100644
--- a/test/intrinsics/gen/textureStore/1bbd08.wgsl
+++ b/test/intrinsics/gen/textureStore/1bbd08.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rgba8unorm, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8unorm, write>;
 
 // fn textureStore(texture: texture_storage_3d<rgba8unorm, write>, coords: vec3<i32>, value: vec4<f32>)
 fn textureStore_1bbd08() {
   textureStore(arg_0, vec3<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_1bbd08();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_1bbd08();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_1bbd08();
 }
diff --git a/test/intrinsics/gen/textureStore/1bbd08.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/1bbd08.wgsl.expected.wgsl
index 5a618ea..a775be7 100644
--- a/test/intrinsics/gen/textureStore/1bbd08.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/1bbd08.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rgba8unorm, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rgba8unorm, write>;
 
 fn textureStore_1bbd08() {
   textureStore(arg_0, vec3<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_1bbd08();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_1bbd08();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_1bbd08();
 }
diff --git a/test/intrinsics/gen/textureStore/1c02e7.wgsl b/test/intrinsics/gen/textureStore/1c02e7.wgsl
index 465f6f3..df6bca8 100644
--- a/test/intrinsics/gen/textureStore/1c02e7.wgsl
+++ b/test/intrinsics/gen/textureStore/1c02e7.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<r32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32sint, write>;
 
 // fn textureStore(texture: texture_storage_2d_array<r32sint, write>, coords: vec2<i32>, array_index: i32, value: vec4<i32>)
 fn textureStore_1c02e7() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_1c02e7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_1c02e7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_1c02e7();
 }
diff --git a/test/intrinsics/gen/textureStore/1c02e7.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/1c02e7.wgsl.expected.wgsl
index f24449e..732759f 100644
--- a/test/intrinsics/gen/textureStore/1c02e7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/1c02e7.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<r32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<r32sint, write>;
 
 fn textureStore_1c02e7() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_1c02e7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_1c02e7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_1c02e7();
 }
diff --git a/test/intrinsics/gen/textureStore/22d955.wgsl b/test/intrinsics/gen/textureStore/22d955.wgsl
index cfd3c59..716aa42 100644
--- a/test/intrinsics/gen/textureStore/22d955.wgsl
+++ b/test/intrinsics/gen/textureStore/22d955.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba8uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8uint, write>;
 
 // fn textureStore(texture: texture_storage_2d_array<rgba8uint, write>, coords: vec2<i32>, array_index: i32, value: vec4<u32>)
 fn textureStore_22d955() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_22d955();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_22d955();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_22d955();
 }
diff --git a/test/intrinsics/gen/textureStore/22d955.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/22d955.wgsl.expected.wgsl
index c6f0cc4..b9fe255 100644
--- a/test/intrinsics/gen/textureStore/22d955.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/22d955.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba8uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8uint, write>;
 
 fn textureStore_22d955() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_22d955();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_22d955();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_22d955();
 }
diff --git a/test/intrinsics/gen/textureStore/26bf70.wgsl b/test/intrinsics/gen/textureStore/26bf70.wgsl
index 3bff728..083e62a 100644
--- a/test/intrinsics/gen/textureStore/26bf70.wgsl
+++ b/test/intrinsics/gen/textureStore/26bf70.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rgba32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba32uint, write>;
 
 // fn textureStore(texture: texture_storage_2d<rgba32uint, write>, coords: vec2<i32>, value: vec4<u32>)
 fn textureStore_26bf70() {
   textureStore(arg_0, vec2<i32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_26bf70();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_26bf70();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_26bf70();
 }
diff --git a/test/intrinsics/gen/textureStore/26bf70.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/26bf70.wgsl.expected.wgsl
index 9953134..896b4f7 100644
--- a/test/intrinsics/gen/textureStore/26bf70.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/26bf70.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rgba32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rgba32uint, write>;
 
 fn textureStore_26bf70() {
   textureStore(arg_0, vec2<i32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_26bf70();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_26bf70();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_26bf70();
 }
diff --git a/test/intrinsics/gen/textureStore/2796b4.wgsl b/test/intrinsics/gen/textureStore/2796b4.wgsl
index c7e6cde..dce9df6 100644
--- a/test/intrinsics/gen/textureStore/2796b4.wgsl
+++ b/test/intrinsics/gen/textureStore/2796b4.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rg32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rg32sint, write>;
 
 // fn textureStore(texture: texture_storage_3d<rg32sint, write>, coords: vec3<i32>, value: vec4<i32>)
 fn textureStore_2796b4() {
   textureStore(arg_0, vec3<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_2796b4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_2796b4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_2796b4();
 }
diff --git a/test/intrinsics/gen/textureStore/2796b4.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/2796b4.wgsl.expected.wgsl
index 1bf6571..3fcb394 100644
--- a/test/intrinsics/gen/textureStore/2796b4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/2796b4.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rg32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rg32sint, write>;
 
 fn textureStore_2796b4() {
   textureStore(arg_0, vec3<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_2796b4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_2796b4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_2796b4();
 }
diff --git a/test/intrinsics/gen/textureStore/2ac6c7.wgsl b/test/intrinsics/gen/textureStore/2ac6c7.wgsl
index 7480d58..35cec99 100644
--- a/test/intrinsics/gen/textureStore/2ac6c7.wgsl
+++ b/test/intrinsics/gen/textureStore/2ac6c7.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<r32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<r32float, write>;
 
 // fn textureStore(texture: texture_storage_1d<r32float, write>, coords: i32, value: vec4<f32>)
 fn textureStore_2ac6c7() {
   textureStore(arg_0, 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_2ac6c7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_2ac6c7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_2ac6c7();
 }
diff --git a/test/intrinsics/gen/textureStore/2ac6c7.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/2ac6c7.wgsl.expected.wgsl
index 1e8abb2..2786ca4 100644
--- a/test/intrinsics/gen/textureStore/2ac6c7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/2ac6c7.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<r32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<r32float, write>;
 
 fn textureStore_2ac6c7() {
   textureStore(arg_0, 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_2ac6c7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_2ac6c7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_2ac6c7();
 }
diff --git a/test/intrinsics/gen/textureStore/2eb2a4.wgsl b/test/intrinsics/gen/textureStore/2eb2a4.wgsl
index e8ab6c1..ad1ccd5 100644
--- a/test/intrinsics/gen/textureStore/2eb2a4.wgsl
+++ b/test/intrinsics/gen/textureStore/2eb2a4.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rgba16uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba16uint, write>;
 
 // fn textureStore(texture: texture_storage_1d<rgba16uint, write>, coords: i32, value: vec4<u32>)
 fn textureStore_2eb2a4() {
   textureStore(arg_0, 1, vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_2eb2a4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_2eb2a4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_2eb2a4();
 }
diff --git a/test/intrinsics/gen/textureStore/2eb2a4.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/2eb2a4.wgsl.expected.wgsl
index 038994e..51c5cd9 100644
--- a/test/intrinsics/gen/textureStore/2eb2a4.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/2eb2a4.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rgba16uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rgba16uint, write>;
 
 fn textureStore_2eb2a4() {
   textureStore(arg_0, 1, vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_2eb2a4();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_2eb2a4();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_2eb2a4();
 }
diff --git a/test/intrinsics/gen/textureStore/2ed2a3.wgsl b/test/intrinsics/gen/textureStore/2ed2a3.wgsl
index 0fea47b..bcf4113 100644
--- a/test/intrinsics/gen/textureStore/2ed2a3.wgsl
+++ b/test/intrinsics/gen/textureStore/2ed2a3.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rgba8snorm, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8snorm, write>;
 
 // fn textureStore(texture: texture_storage_1d<rgba8snorm, write>, coords: i32, value: vec4<f32>)
 fn textureStore_2ed2a3() {
   textureStore(arg_0, 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_2ed2a3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_2ed2a3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_2ed2a3();
 }
diff --git a/test/intrinsics/gen/textureStore/2ed2a3.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/2ed2a3.wgsl.expected.wgsl
index cc582b3..c415d58 100644
--- a/test/intrinsics/gen/textureStore/2ed2a3.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/2ed2a3.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rgba8snorm, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rgba8snorm, write>;
 
 fn textureStore_2ed2a3() {
   textureStore(arg_0, 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_2ed2a3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_2ed2a3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_2ed2a3();
 }
diff --git a/test/intrinsics/gen/textureStore/31745b.wgsl b/test/intrinsics/gen/textureStore/31745b.wgsl
index 49bb0c1..5dea4e1 100644
--- a/test/intrinsics/gen/textureStore/31745b.wgsl
+++ b/test/intrinsics/gen/textureStore/31745b.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rg32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rg32sint, write>;
 
 // fn textureStore(texture: texture_storage_2d<rg32sint, write>, coords: vec2<i32>, value: vec4<i32>)
 fn textureStore_31745b() {
   textureStore(arg_0, vec2<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_31745b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_31745b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_31745b();
 }
diff --git a/test/intrinsics/gen/textureStore/31745b.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/31745b.wgsl.expected.wgsl
index 41e5f93..4288434 100644
--- a/test/intrinsics/gen/textureStore/31745b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/31745b.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rg32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rg32sint, write>;
 
 fn textureStore_31745b() {
   textureStore(arg_0, vec2<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_31745b();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_31745b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_31745b();
 }
diff --git a/test/intrinsics/gen/textureStore/32f368.wgsl b/test/intrinsics/gen/textureStore/32f368.wgsl
index 30aef60..50f4e66 100644
--- a/test/intrinsics/gen/textureStore/32f368.wgsl
+++ b/test/intrinsics/gen/textureStore/32f368.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba16float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16float, write>;
 
 // fn textureStore(texture: texture_storage_2d_array<rgba16float, write>, coords: vec2<i32>, array_index: i32, value: vec4<f32>)
 fn textureStore_32f368() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_32f368();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_32f368();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_32f368();
 }
diff --git a/test/intrinsics/gen/textureStore/32f368.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/32f368.wgsl.expected.wgsl
index 5a83522..a747822 100644
--- a/test/intrinsics/gen/textureStore/32f368.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/32f368.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba16float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba16float, write>;
 
 fn textureStore_32f368() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_32f368();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_32f368();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_32f368();
 }
diff --git a/test/intrinsics/gen/textureStore/331aee.wgsl b/test/intrinsics/gen/textureStore/331aee.wgsl
index 71b0f26..4bc9a4d 100644
--- a/test/intrinsics/gen/textureStore/331aee.wgsl
+++ b/test/intrinsics/gen/textureStore/331aee.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rgba32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba32float, write>;
 
 // fn textureStore(texture: texture_storage_3d<rgba32float, write>, coords: vec3<i32>, value: vec4<f32>)
 fn textureStore_331aee() {
   textureStore(arg_0, vec3<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_331aee();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_331aee();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_331aee();
 }
diff --git a/test/intrinsics/gen/textureStore/331aee.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/331aee.wgsl.expected.wgsl
index bf5acd4..0363260 100644
--- a/test/intrinsics/gen/textureStore/331aee.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/331aee.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rgba32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rgba32float, write>;
 
 fn textureStore_331aee() {
   textureStore(arg_0, vec3<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_331aee();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_331aee();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_331aee();
 }
diff --git a/test/intrinsics/gen/textureStore/38e8d7.wgsl b/test/intrinsics/gen/textureStore/38e8d7.wgsl
index e54b18b..6cfe7a0 100644
--- a/test/intrinsics/gen/textureStore/38e8d7.wgsl
+++ b/test/intrinsics/gen/textureStore/38e8d7.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<r32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32uint, write>;
 
 // fn textureStore(texture: texture_storage_2d_array<r32uint, write>, coords: vec2<i32>, array_index: i32, value: vec4<u32>)
 fn textureStore_38e8d7() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_38e8d7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_38e8d7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_38e8d7();
 }
diff --git a/test/intrinsics/gen/textureStore/38e8d7.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/38e8d7.wgsl.expected.wgsl
index de4dbd6..28d1791 100644
--- a/test/intrinsics/gen/textureStore/38e8d7.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/38e8d7.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<r32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<r32uint, write>;
 
 fn textureStore_38e8d7() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_38e8d7();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_38e8d7();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_38e8d7();
 }
diff --git a/test/intrinsics/gen/textureStore/3a52ac.wgsl b/test/intrinsics/gen/textureStore/3a52ac.wgsl
index 169d963..92cb0bb 100644
--- a/test/intrinsics/gen/textureStore/3a52ac.wgsl
+++ b/test/intrinsics/gen/textureStore/3a52ac.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba16sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16sint, write>;
 
 // fn textureStore(texture: texture_storage_2d_array<rgba16sint, write>, coords: vec2<i32>, array_index: i32, value: vec4<i32>)
 fn textureStore_3a52ac() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_3a52ac();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_3a52ac();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_3a52ac();
 }
diff --git a/test/intrinsics/gen/textureStore/3a52ac.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/3a52ac.wgsl.expected.wgsl
index 07d0a6f..6fbbab0 100644
--- a/test/intrinsics/gen/textureStore/3a52ac.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/3a52ac.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba16sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba16sint, write>;
 
 fn textureStore_3a52ac() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_3a52ac();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_3a52ac();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_3a52ac();
 }
diff --git a/test/intrinsics/gen/textureStore/3bb7a1.wgsl b/test/intrinsics/gen/textureStore/3bb7a1.wgsl
index 6f59945..c665a5b 100644
--- a/test/intrinsics/gen/textureStore/3bb7a1.wgsl
+++ b/test/intrinsics/gen/textureStore/3bb7a1.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<r32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<r32float, write>;
 
 // fn textureStore(texture: texture_storage_2d_array<r32float, write>, coords: vec2<i32>, array_index: i32, value: vec4<f32>)
 fn textureStore_3bb7a1() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_3bb7a1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_3bb7a1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_3bb7a1();
 }
diff --git a/test/intrinsics/gen/textureStore/3bb7a1.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/3bb7a1.wgsl.expected.wgsl
index 10d2109..ccb304d 100644
--- a/test/intrinsics/gen/textureStore/3bb7a1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/3bb7a1.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<r32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<r32float, write>;
 
 fn textureStore_3bb7a1() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_3bb7a1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_3bb7a1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_3bb7a1();
 }
diff --git a/test/intrinsics/gen/textureStore/3bec15.wgsl b/test/intrinsics/gen/textureStore/3bec15.wgsl
index e87e1de..b56de8d 100644
--- a/test/intrinsics/gen/textureStore/3bec15.wgsl
+++ b/test/intrinsics/gen/textureStore/3bec15.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rgba8uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8uint, write>;
 
 // fn textureStore(texture: texture_storage_1d<rgba8uint, write>, coords: i32, value: vec4<u32>)
 fn textureStore_3bec15() {
   textureStore(arg_0, 1, vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_3bec15();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_3bec15();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_3bec15();
 }
diff --git a/test/intrinsics/gen/textureStore/3bec15.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/3bec15.wgsl.expected.wgsl
index fe5a5ea..c594be0 100644
--- a/test/intrinsics/gen/textureStore/3bec15.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/3bec15.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rgba8uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rgba8uint, write>;
 
 fn textureStore_3bec15() {
   textureStore(arg_0, 1, vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_3bec15();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_3bec15();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_3bec15();
 }
diff --git a/test/intrinsics/gen/textureStore/441ba8.wgsl b/test/intrinsics/gen/textureStore/441ba8.wgsl
index c39592d..a110f0c 100644
--- a/test/intrinsics/gen/textureStore/441ba8.wgsl
+++ b/test/intrinsics/gen/textureStore/441ba8.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rgba32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba32uint, write>;
 
 // fn textureStore(texture: texture_storage_3d<rgba32uint, write>, coords: vec3<i32>, value: vec4<u32>)
 fn textureStore_441ba8() {
   textureStore(arg_0, vec3<i32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_441ba8();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_441ba8();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_441ba8();
 }
diff --git a/test/intrinsics/gen/textureStore/441ba8.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/441ba8.wgsl.expected.wgsl
index dfa88ea..b59255a 100644
--- a/test/intrinsics/gen/textureStore/441ba8.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/441ba8.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rgba32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rgba32uint, write>;
 
 fn textureStore_441ba8() {
   textureStore(arg_0, vec3<i32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_441ba8();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_441ba8();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_441ba8();
 }
diff --git a/test/intrinsics/gen/textureStore/4fc057.wgsl b/test/intrinsics/gen/textureStore/4fc057.wgsl
index 9f83f23..b746370 100644
--- a/test/intrinsics/gen/textureStore/4fc057.wgsl
+++ b/test/intrinsics/gen/textureStore/4fc057.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba8snorm, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8snorm, write>;
 
 // fn textureStore(texture: texture_storage_2d_array<rgba8snorm, write>, coords: vec2<i32>, array_index: i32, value: vec4<f32>)
 fn textureStore_4fc057() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_4fc057();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_4fc057();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_4fc057();
 }
diff --git a/test/intrinsics/gen/textureStore/4fc057.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/4fc057.wgsl.expected.wgsl
index 38fef89..26a0018 100644
--- a/test/intrinsics/gen/textureStore/4fc057.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/4fc057.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba8snorm, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8snorm, write>;
 
 fn textureStore_4fc057() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_4fc057();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_4fc057();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_4fc057();
 }
diff --git a/test/intrinsics/gen/textureStore/5a2f8f.wgsl b/test/intrinsics/gen/textureStore/5a2f8f.wgsl
index 2273a88..b9fc23d 100644
--- a/test/intrinsics/gen/textureStore/5a2f8f.wgsl
+++ b/test/intrinsics/gen/textureStore/5a2f8f.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rgba16sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba16sint, write>;
 
 // fn textureStore(texture: texture_storage_1d<rgba16sint, write>, coords: i32, value: vec4<i32>)
 fn textureStore_5a2f8f() {
   textureStore(arg_0, 1, vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_5a2f8f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_5a2f8f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_5a2f8f();
 }
diff --git a/test/intrinsics/gen/textureStore/5a2f8f.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/5a2f8f.wgsl.expected.wgsl
index c2711ee..13d97f4 100644
--- a/test/intrinsics/gen/textureStore/5a2f8f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/5a2f8f.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rgba16sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rgba16sint, write>;
 
 fn textureStore_5a2f8f() {
   textureStore(arg_0, 1, vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_5a2f8f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_5a2f8f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_5a2f8f();
 }
diff --git a/test/intrinsics/gen/textureStore/60975f.wgsl b/test/intrinsics/gen/textureStore/60975f.wgsl
index 6a3b0f1..3408855 100644
--- a/test/intrinsics/gen/textureStore/60975f.wgsl
+++ b/test/intrinsics/gen/textureStore/60975f.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba8unorm, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8unorm, write>;
 
 // fn textureStore(texture: texture_storage_2d_array<rgba8unorm, write>, coords: vec2<i32>, array_index: i32, value: vec4<f32>)
 fn textureStore_60975f() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_60975f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_60975f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_60975f();
 }
diff --git a/test/intrinsics/gen/textureStore/60975f.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/60975f.wgsl.expected.wgsl
index 539a6fc..47cdd34 100644
--- a/test/intrinsics/gen/textureStore/60975f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/60975f.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba8unorm, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8unorm, write>;
 
 fn textureStore_60975f() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_60975f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_60975f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_60975f();
 }
diff --git a/test/intrinsics/gen/textureStore/682fd6.wgsl b/test/intrinsics/gen/textureStore/682fd6.wgsl
index e8f48ce..7d74607 100644
--- a/test/intrinsics/gen/textureStore/682fd6.wgsl
+++ b/test/intrinsics/gen/textureStore/682fd6.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rg32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rg32uint, write>;
 
 // fn textureStore(texture: texture_storage_2d<rg32uint, write>, coords: vec2<i32>, value: vec4<u32>)
 fn textureStore_682fd6() {
   textureStore(arg_0, vec2<i32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_682fd6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_682fd6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_682fd6();
 }
diff --git a/test/intrinsics/gen/textureStore/682fd6.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/682fd6.wgsl.expected.wgsl
index 42bad33..20603cc 100644
--- a/test/intrinsics/gen/textureStore/682fd6.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/682fd6.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rg32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rg32uint, write>;
 
 fn textureStore_682fd6() {
   textureStore(arg_0, vec2<i32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_682fd6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_682fd6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_682fd6();
 }
diff --git a/test/intrinsics/gen/textureStore/6b75c3.wgsl b/test/intrinsics/gen/textureStore/6b75c3.wgsl
index 49514f2..16dc47d 100644
--- a/test/intrinsics/gen/textureStore/6b75c3.wgsl
+++ b/test/intrinsics/gen/textureStore/6b75c3.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rgba32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba32float, write>;
 
 // fn textureStore(texture: texture_storage_1d<rgba32float, write>, coords: i32, value: vec4<f32>)
 fn textureStore_6b75c3() {
   textureStore(arg_0, 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_6b75c3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_6b75c3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_6b75c3();
 }
diff --git a/test/intrinsics/gen/textureStore/6b75c3.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/6b75c3.wgsl.expected.wgsl
index fbaf5e4..cd827a3 100644
--- a/test/intrinsics/gen/textureStore/6b75c3.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/6b75c3.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rgba32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rgba32float, write>;
 
 fn textureStore_6b75c3() {
   textureStore(arg_0, 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_6b75c3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_6b75c3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_6b75c3();
 }
diff --git a/test/intrinsics/gen/textureStore/6b80d2.wgsl b/test/intrinsics/gen/textureStore/6b80d2.wgsl
index bf79a72..95535c4 100644
--- a/test/intrinsics/gen/textureStore/6b80d2.wgsl
+++ b/test/intrinsics/gen/textureStore/6b80d2.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<r32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<r32sint, write>;
 
 // fn textureStore(texture: texture_storage_1d<r32sint, write>, coords: i32, value: vec4<i32>)
 fn textureStore_6b80d2() {
   textureStore(arg_0, 1, vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_6b80d2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_6b80d2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_6b80d2();
 }
diff --git a/test/intrinsics/gen/textureStore/6b80d2.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/6b80d2.wgsl.expected.wgsl
index 8857fdc..e7efff2 100644
--- a/test/intrinsics/gen/textureStore/6b80d2.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/6b80d2.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<r32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<r32sint, write>;
 
 fn textureStore_6b80d2() {
   textureStore(arg_0, 1, vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_6b80d2();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_6b80d2();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_6b80d2();
 }
diff --git a/test/intrinsics/gen/textureStore/6cff2e.wgsl b/test/intrinsics/gen/textureStore/6cff2e.wgsl
index c20185f..26320a2 100644
--- a/test/intrinsics/gen/textureStore/6cff2e.wgsl
+++ b/test/intrinsics/gen/textureStore/6cff2e.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<r32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<r32uint, write>;
 
 // fn textureStore(texture: texture_storage_2d<r32uint, write>, coords: vec2<i32>, value: vec4<u32>)
 fn textureStore_6cff2e() {
   textureStore(arg_0, vec2<i32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_6cff2e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_6cff2e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_6cff2e();
 }
diff --git a/test/intrinsics/gen/textureStore/6cff2e.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/6cff2e.wgsl.expected.wgsl
index cae9ed9..4f43b98 100644
--- a/test/intrinsics/gen/textureStore/6cff2e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/6cff2e.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<r32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<r32uint, write>;
 
 fn textureStore_6cff2e() {
   textureStore(arg_0, vec2<i32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_6cff2e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_6cff2e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_6cff2e();
 }
diff --git a/test/intrinsics/gen/textureStore/6da692.wgsl b/test/intrinsics/gen/textureStore/6da692.wgsl
index 7b5727a..dd40882 100644
--- a/test/intrinsics/gen/textureStore/6da692.wgsl
+++ b/test/intrinsics/gen/textureStore/6da692.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba16uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba16uint, write>;
 
 // fn textureStore(texture: texture_storage_2d_array<rgba16uint, write>, coords: vec2<i32>, array_index: i32, value: vec4<u32>)
 fn textureStore_6da692() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_6da692();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_6da692();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_6da692();
 }
diff --git a/test/intrinsics/gen/textureStore/6da692.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/6da692.wgsl.expected.wgsl
index 2b21df2..2497a69 100644
--- a/test/intrinsics/gen/textureStore/6da692.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/6da692.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba16uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba16uint, write>;
 
 fn textureStore_6da692() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_6da692();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_6da692();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_6da692();
 }
diff --git a/test/intrinsics/gen/textureStore/731349.wgsl b/test/intrinsics/gen/textureStore/731349.wgsl
index f7f132a..ca0d0ef 100644
--- a/test/intrinsics/gen/textureStore/731349.wgsl
+++ b/test/intrinsics/gen/textureStore/731349.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rgba8unorm, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8unorm, write>;
 
 // fn textureStore(texture: texture_storage_2d<rgba8unorm, write>, coords: vec2<i32>, value: vec4<f32>)
 fn textureStore_731349() {
   textureStore(arg_0, vec2<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_731349();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_731349();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_731349();
 }
diff --git a/test/intrinsics/gen/textureStore/731349.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/731349.wgsl.expected.wgsl
index 3488770..d5466d8 100644
--- a/test/intrinsics/gen/textureStore/731349.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/731349.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rgba8unorm, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rgba8unorm, write>;
 
 fn textureStore_731349() {
   textureStore(arg_0, vec2<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_731349();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_731349();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_731349();
 }
diff --git a/test/intrinsics/gen/textureStore/752da6.wgsl b/test/intrinsics/gen/textureStore/752da6.wgsl
index da2dca2..6310341 100644
--- a/test/intrinsics/gen/textureStore/752da6.wgsl
+++ b/test/intrinsics/gen/textureStore/752da6.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rgba32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba32sint, write>;
 
 // fn textureStore(texture: texture_storage_2d<rgba32sint, write>, coords: vec2<i32>, value: vec4<i32>)
 fn textureStore_752da6() {
   textureStore(arg_0, vec2<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_752da6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_752da6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_752da6();
 }
diff --git a/test/intrinsics/gen/textureStore/752da6.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/752da6.wgsl.expected.wgsl
index 53b1249..e029549 100644
--- a/test/intrinsics/gen/textureStore/752da6.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/752da6.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rgba32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rgba32sint, write>;
 
 fn textureStore_752da6() {
   textureStore(arg_0, vec2<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_752da6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_752da6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_752da6();
 }
diff --git a/test/intrinsics/gen/textureStore/77c0ae.wgsl b/test/intrinsics/gen/textureStore/77c0ae.wgsl
index b5e0ee6..f122e9f 100644
--- a/test/intrinsics/gen/textureStore/77c0ae.wgsl
+++ b/test/intrinsics/gen/textureStore/77c0ae.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rgba8uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8uint, write>;
 
 // fn textureStore(texture: texture_storage_2d<rgba8uint, write>, coords: vec2<i32>, value: vec4<u32>)
 fn textureStore_77c0ae() {
   textureStore(arg_0, vec2<i32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_77c0ae();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_77c0ae();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_77c0ae();
 }
diff --git a/test/intrinsics/gen/textureStore/77c0ae.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/77c0ae.wgsl.expected.wgsl
index d4a7597..56cf079 100644
--- a/test/intrinsics/gen/textureStore/77c0ae.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/77c0ae.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rgba8uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rgba8uint, write>;
 
 fn textureStore_77c0ae() {
   textureStore(arg_0, vec2<i32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_77c0ae();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_77c0ae();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_77c0ae();
 }
diff --git a/test/intrinsics/gen/textureStore/7cec8d.wgsl b/test/intrinsics/gen/textureStore/7cec8d.wgsl
index 1116e70..5b0f47b 100644
--- a/test/intrinsics/gen/textureStore/7cec8d.wgsl
+++ b/test/intrinsics/gen/textureStore/7cec8d.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32sint, write>;
 
 // fn textureStore(texture: texture_storage_2d_array<rgba32sint, write>, coords: vec2<i32>, array_index: i32, value: vec4<i32>)
 fn textureStore_7cec8d() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_7cec8d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_7cec8d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_7cec8d();
 }
diff --git a/test/intrinsics/gen/textureStore/7cec8d.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/7cec8d.wgsl.expected.wgsl
index 3a46878..89ed161 100644
--- a/test/intrinsics/gen/textureStore/7cec8d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/7cec8d.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba32sint, write>;
 
 fn textureStore_7cec8d() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_7cec8d();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_7cec8d();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_7cec8d();
 }
diff --git a/test/intrinsics/gen/textureStore/7f7fae.wgsl b/test/intrinsics/gen/textureStore/7f7fae.wgsl
index 343897b..d1d8004 100644
--- a/test/intrinsics/gen/textureStore/7f7fae.wgsl
+++ b/test/intrinsics/gen/textureStore/7f7fae.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rgba8unorm, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8unorm, write>;
 
 // fn textureStore(texture: texture_storage_1d<rgba8unorm, write>, coords: i32, value: vec4<f32>)
 fn textureStore_7f7fae() {
   textureStore(arg_0, 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_7f7fae();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_7f7fae();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_7f7fae();
 }
diff --git a/test/intrinsics/gen/textureStore/7f7fae.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/7f7fae.wgsl.expected.wgsl
index abe303f..438123c 100644
--- a/test/intrinsics/gen/textureStore/7f7fae.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/7f7fae.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rgba8unorm, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rgba8unorm, write>;
 
 fn textureStore_7f7fae() {
   textureStore(arg_0, 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_7f7fae();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_7f7fae();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_7f7fae();
 }
diff --git a/test/intrinsics/gen/textureStore/804942.wgsl b/test/intrinsics/gen/textureStore/804942.wgsl
index be1fdb6..6c76b00 100644
--- a/test/intrinsics/gen/textureStore/804942.wgsl
+++ b/test/intrinsics/gen/textureStore/804942.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<r32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<r32sint, write>;
 
 // fn textureStore(texture: texture_storage_2d<r32sint, write>, coords: vec2<i32>, value: vec4<i32>)
 fn textureStore_804942() {
   textureStore(arg_0, vec2<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_804942();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_804942();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_804942();
 }
diff --git a/test/intrinsics/gen/textureStore/804942.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/804942.wgsl.expected.wgsl
index 5a76cea..f4a325c 100644
--- a/test/intrinsics/gen/textureStore/804942.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/804942.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<r32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<r32sint, write>;
 
 fn textureStore_804942() {
   textureStore(arg_0, vec2<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_804942();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_804942();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_804942();
 }
diff --git a/test/intrinsics/gen/textureStore/805dae.wgsl b/test/intrinsics/gen/textureStore/805dae.wgsl
index 489a93d..962a3ff 100644
--- a/test/intrinsics/gen/textureStore/805dae.wgsl
+++ b/test/intrinsics/gen/textureStore/805dae.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rgba8snorm, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8snorm, write>;
 
 // fn textureStore(texture: texture_storage_2d<rgba8snorm, write>, coords: vec2<i32>, value: vec4<f32>)
 fn textureStore_805dae() {
   textureStore(arg_0, vec2<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_805dae();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_805dae();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_805dae();
 }
diff --git a/test/intrinsics/gen/textureStore/805dae.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/805dae.wgsl.expected.wgsl
index 00270ab..667452d 100644
--- a/test/intrinsics/gen/textureStore/805dae.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/805dae.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rgba8snorm, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rgba8snorm, write>;
 
 fn textureStore_805dae() {
   textureStore(arg_0, vec2<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_805dae();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_805dae();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_805dae();
 }
diff --git a/test/intrinsics/gen/textureStore/83bcc1.wgsl b/test/intrinsics/gen/textureStore/83bcc1.wgsl
index d59c929..657a679 100644
--- a/test/intrinsics/gen/textureStore/83bcc1.wgsl
+++ b/test/intrinsics/gen/textureStore/83bcc1.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rg32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rg32uint, write>;
 
 // fn textureStore(texture: texture_storage_1d<rg32uint, write>, coords: i32, value: vec4<u32>)
 fn textureStore_83bcc1() {
   textureStore(arg_0, 1, vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_83bcc1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_83bcc1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_83bcc1();
 }
diff --git a/test/intrinsics/gen/textureStore/83bcc1.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/83bcc1.wgsl.expected.wgsl
index 1fbb4cf..f0ee863 100644
--- a/test/intrinsics/gen/textureStore/83bcc1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/83bcc1.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rg32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rg32uint, write>;
 
 fn textureStore_83bcc1() {
   textureStore(arg_0, 1, vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_83bcc1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_83bcc1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_83bcc1();
 }
diff --git a/test/intrinsics/gen/textureStore/872747.wgsl b/test/intrinsics/gen/textureStore/872747.wgsl
index 8d11122..cbb964b 100644
--- a/test/intrinsics/gen/textureStore/872747.wgsl
+++ b/test/intrinsics/gen/textureStore/872747.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rg32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rg32float, write>;
 
 // fn textureStore(texture: texture_storage_1d<rg32float, write>, coords: i32, value: vec4<f32>)
 fn textureStore_872747() {
   textureStore(arg_0, 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_872747();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_872747();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_872747();
 }
diff --git a/test/intrinsics/gen/textureStore/872747.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/872747.wgsl.expected.wgsl
index 94bbebc..b5c2914 100644
--- a/test/intrinsics/gen/textureStore/872747.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/872747.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rg32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rg32float, write>;
 
 fn textureStore_872747() {
   textureStore(arg_0, 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_872747();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_872747();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_872747();
 }
diff --git a/test/intrinsics/gen/textureStore/8e0479.wgsl b/test/intrinsics/gen/textureStore/8e0479.wgsl
index b40e3fa..98b7f8c 100644
--- a/test/intrinsics/gen/textureStore/8e0479.wgsl
+++ b/test/intrinsics/gen/textureStore/8e0479.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32uint, write>;
 
 // fn textureStore(texture: texture_storage_2d_array<rgba32uint, write>, coords: vec2<i32>, array_index: i32, value: vec4<u32>)
 fn textureStore_8e0479() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_8e0479();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_8e0479();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_8e0479();
 }
diff --git a/test/intrinsics/gen/textureStore/8e0479.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/8e0479.wgsl.expected.wgsl
index 42d3326..07408ae 100644
--- a/test/intrinsics/gen/textureStore/8e0479.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/8e0479.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba32uint, write>;
 
 fn textureStore_8e0479() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_8e0479();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_8e0479();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_8e0479();
 }
diff --git a/test/intrinsics/gen/textureStore/8f71a1.wgsl b/test/intrinsics/gen/textureStore/8f71a1.wgsl
index f15b4db..a1298a4 100644
--- a/test/intrinsics/gen/textureStore/8f71a1.wgsl
+++ b/test/intrinsics/gen/textureStore/8f71a1.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rgba16sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba16sint, write>;
 
 // fn textureStore(texture: texture_storage_3d<rgba16sint, write>, coords: vec3<i32>, value: vec4<i32>)
 fn textureStore_8f71a1() {
   textureStore(arg_0, vec3<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_8f71a1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_8f71a1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_8f71a1();
 }
diff --git a/test/intrinsics/gen/textureStore/8f71a1.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/8f71a1.wgsl.expected.wgsl
index 3b5e2ec..9bacd31 100644
--- a/test/intrinsics/gen/textureStore/8f71a1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/8f71a1.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rgba16sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rgba16sint, write>;
 
 fn textureStore_8f71a1() {
   textureStore(arg_0, vec3<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_8f71a1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_8f71a1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_8f71a1();
 }
diff --git a/test/intrinsics/gen/textureStore/969534.wgsl b/test/intrinsics/gen/textureStore/969534.wgsl
index 55e0153..d87249f 100644
--- a/test/intrinsics/gen/textureStore/969534.wgsl
+++ b/test/intrinsics/gen/textureStore/969534.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rgba32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba32sint, write>;
 
 // fn textureStore(texture: texture_storage_1d<rgba32sint, write>, coords: i32, value: vec4<i32>)
 fn textureStore_969534() {
   textureStore(arg_0, 1, vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_969534();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_969534();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_969534();
 }
diff --git a/test/intrinsics/gen/textureStore/969534.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/969534.wgsl.expected.wgsl
index 2890165..467cbda 100644
--- a/test/intrinsics/gen/textureStore/969534.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/969534.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rgba32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rgba32sint, write>;
 
 fn textureStore_969534() {
   textureStore(arg_0, 1, vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_969534();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_969534();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_969534();
 }
diff --git a/test/intrinsics/gen/textureStore/9a3ecc.wgsl b/test/intrinsics/gen/textureStore/9a3ecc.wgsl
index 3698b8f..0bfd6b0 100644
--- a/test/intrinsics/gen/textureStore/9a3ecc.wgsl
+++ b/test/intrinsics/gen/textureStore/9a3ecc.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rgba32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba32sint, write>;
 
 // fn textureStore(texture: texture_storage_3d<rgba32sint, write>, coords: vec3<i32>, value: vec4<i32>)
 fn textureStore_9a3ecc() {
   textureStore(arg_0, vec3<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_9a3ecc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_9a3ecc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_9a3ecc();
 }
diff --git a/test/intrinsics/gen/textureStore/9a3ecc.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/9a3ecc.wgsl.expected.wgsl
index 701e3d8..6fe66cb 100644
--- a/test/intrinsics/gen/textureStore/9a3ecc.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/9a3ecc.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rgba32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rgba32sint, write>;
 
 fn textureStore_9a3ecc() {
   textureStore(arg_0, vec3<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_9a3ecc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_9a3ecc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_9a3ecc();
 }
diff --git a/test/intrinsics/gen/textureStore/9d9cd5.wgsl b/test/intrinsics/gen/textureStore/9d9cd5.wgsl
index 8d4d10f..776ac7c 100644
--- a/test/intrinsics/gen/textureStore/9d9cd5.wgsl
+++ b/test/intrinsics/gen/textureStore/9d9cd5.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba32float, write>;
 
 // fn textureStore(texture: texture_storage_2d_array<rgba32float, write>, coords: vec2<i32>, array_index: i32, value: vec4<f32>)
 fn textureStore_9d9cd5() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_9d9cd5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_9d9cd5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_9d9cd5();
 }
diff --git a/test/intrinsics/gen/textureStore/9d9cd5.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/9d9cd5.wgsl.expected.wgsl
index 991b513..346f010 100644
--- a/test/intrinsics/gen/textureStore/9d9cd5.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/9d9cd5.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba32float, write>;
 
 fn textureStore_9d9cd5() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_9d9cd5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_9d9cd5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_9d9cd5();
 }
diff --git a/test/intrinsics/gen/textureStore/9e3ec5.wgsl b/test/intrinsics/gen/textureStore/9e3ec5.wgsl
index 3e42b1a..7b643ca 100644
--- a/test/intrinsics/gen/textureStore/9e3ec5.wgsl
+++ b/test/intrinsics/gen/textureStore/9e3ec5.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rgba16sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba16sint, write>;
 
 // fn textureStore(texture: texture_storage_2d<rgba16sint, write>, coords: vec2<i32>, value: vec4<i32>)
 fn textureStore_9e3ec5() {
   textureStore(arg_0, vec2<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_9e3ec5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_9e3ec5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_9e3ec5();
 }
diff --git a/test/intrinsics/gen/textureStore/9e3ec5.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/9e3ec5.wgsl.expected.wgsl
index f4e180f..aaa8bf6 100644
--- a/test/intrinsics/gen/textureStore/9e3ec5.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/9e3ec5.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rgba16sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rgba16sint, write>;
 
 fn textureStore_9e3ec5() {
   textureStore(arg_0, vec2<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_9e3ec5();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_9e3ec5();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_9e3ec5();
 }
diff --git a/test/intrinsics/gen/textureStore/ac67aa.wgsl b/test/intrinsics/gen/textureStore/ac67aa.wgsl
index e973b1b..19bbe72 100644
--- a/test/intrinsics/gen/textureStore/ac67aa.wgsl
+++ b/test/intrinsics/gen/textureStore/ac67aa.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rg32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rg32uint, write>;
 
 // fn textureStore(texture: texture_storage_3d<rg32uint, write>, coords: vec3<i32>, value: vec4<u32>)
 fn textureStore_ac67aa() {
   textureStore(arg_0, vec3<i32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_ac67aa();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_ac67aa();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_ac67aa();
 }
diff --git a/test/intrinsics/gen/textureStore/ac67aa.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/ac67aa.wgsl.expected.wgsl
index e382854..21d0d22 100644
--- a/test/intrinsics/gen/textureStore/ac67aa.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/ac67aa.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rg32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rg32uint, write>;
 
 fn textureStore_ac67aa() {
   textureStore(arg_0, vec3<i32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_ac67aa();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_ac67aa();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_ac67aa();
 }
diff --git a/test/intrinsics/gen/textureStore/b706b1.wgsl b/test/intrinsics/gen/textureStore/b706b1.wgsl
index ca942b2..6eb9f07 100644
--- a/test/intrinsics/gen/textureStore/b706b1.wgsl
+++ b/test/intrinsics/gen/textureStore/b706b1.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rgba8sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8sint, write>;
 
 // fn textureStore(texture: texture_storage_3d<rgba8sint, write>, coords: vec3<i32>, value: vec4<i32>)
 fn textureStore_b706b1() {
   textureStore(arg_0, vec3<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_b706b1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_b706b1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_b706b1();
 }
diff --git a/test/intrinsics/gen/textureStore/b706b1.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/b706b1.wgsl.expected.wgsl
index a307e66..7b77dc8 100644
--- a/test/intrinsics/gen/textureStore/b706b1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/b706b1.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rgba8sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rgba8sint, write>;
 
 fn textureStore_b706b1() {
   textureStore(arg_0, vec3<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_b706b1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_b706b1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_b706b1();
 }
diff --git a/test/intrinsics/gen/textureStore/bbcb7f.wgsl b/test/intrinsics/gen/textureStore/bbcb7f.wgsl
index 19fb864..fc16ac9 100644
--- a/test/intrinsics/gen/textureStore/bbcb7f.wgsl
+++ b/test/intrinsics/gen/textureStore/bbcb7f.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rgba8sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba8sint, write>;
 
 // fn textureStore(texture: texture_storage_2d<rgba8sint, write>, coords: vec2<i32>, value: vec4<i32>)
 fn textureStore_bbcb7f() {
   textureStore(arg_0, vec2<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_bbcb7f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_bbcb7f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_bbcb7f();
 }
diff --git a/test/intrinsics/gen/textureStore/bbcb7f.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/bbcb7f.wgsl.expected.wgsl
index cc509cf..8c4bb4d 100644
--- a/test/intrinsics/gen/textureStore/bbcb7f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/bbcb7f.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rgba8sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rgba8sint, write>;
 
 fn textureStore_bbcb7f() {
   textureStore(arg_0, vec2<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_bbcb7f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_bbcb7f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_bbcb7f();
 }
diff --git a/test/intrinsics/gen/textureStore/be6e30.wgsl b/test/intrinsics/gen/textureStore/be6e30.wgsl
index ab35064..4cd6834 100644
--- a/test/intrinsics/gen/textureStore/be6e30.wgsl
+++ b/test/intrinsics/gen/textureStore/be6e30.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d<rgba16float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d<rgba16float, write>;
 
 // fn textureStore(texture: texture_storage_2d<rgba16float, write>, coords: vec2<i32>, value: vec4<f32>)
 fn textureStore_be6e30() {
   textureStore(arg_0, vec2<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_be6e30();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_be6e30();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_be6e30();
 }
diff --git a/test/intrinsics/gen/textureStore/be6e30.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/be6e30.wgsl.expected.wgsl
index 0b92506..3a4c747 100644
--- a/test/intrinsics/gen/textureStore/be6e30.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/be6e30.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d<rgba16float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d<rgba16float, write>;
 
 fn textureStore_be6e30() {
   textureStore(arg_0, vec2<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_be6e30();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_be6e30();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_be6e30();
 }
diff --git a/test/intrinsics/gen/textureStore/bf775c.wgsl b/test/intrinsics/gen/textureStore/bf775c.wgsl
index 7f23172..b367132 100644
--- a/test/intrinsics/gen/textureStore/bf775c.wgsl
+++ b/test/intrinsics/gen/textureStore/bf775c.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rgba8sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba8sint, write>;
 
 // fn textureStore(texture: texture_storage_1d<rgba8sint, write>, coords: i32, value: vec4<i32>)
 fn textureStore_bf775c() {
   textureStore(arg_0, 1, vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_bf775c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_bf775c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_bf775c();
 }
diff --git a/test/intrinsics/gen/textureStore/bf775c.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/bf775c.wgsl.expected.wgsl
index c93ab8e..db5d80e 100644
--- a/test/intrinsics/gen/textureStore/bf775c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/bf775c.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rgba8sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rgba8sint, write>;
 
 fn textureStore_bf775c() {
   textureStore(arg_0, 1, vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_bf775c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_bf775c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_bf775c();
 }
diff --git a/test/intrinsics/gen/textureStore/c5af1e.wgsl b/test/intrinsics/gen/textureStore/c5af1e.wgsl
index 205da55..e4cbfa9 100644
--- a/test/intrinsics/gen/textureStore/c5af1e.wgsl
+++ b/test/intrinsics/gen/textureStore/c5af1e.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rgba16float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba16float, write>;
 
 // fn textureStore(texture: texture_storage_3d<rgba16float, write>, coords: vec3<i32>, value: vec4<f32>)
 fn textureStore_c5af1e() {
   textureStore(arg_0, vec3<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_c5af1e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_c5af1e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_c5af1e();
 }
diff --git a/test/intrinsics/gen/textureStore/c5af1e.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/c5af1e.wgsl.expected.wgsl
index 0d46ada..02c2ef8 100644
--- a/test/intrinsics/gen/textureStore/c5af1e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/c5af1e.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rgba16float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rgba16float, write>;
 
 fn textureStore_c5af1e() {
   textureStore(arg_0, vec3<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_c5af1e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_c5af1e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_c5af1e();
 }
diff --git a/test/intrinsics/gen/textureStore/c863be.wgsl b/test/intrinsics/gen/textureStore/c863be.wgsl
index 456fafc..b3d05f8 100644
--- a/test/intrinsics/gen/textureStore/c863be.wgsl
+++ b/test/intrinsics/gen/textureStore/c863be.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rg32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32float, write>;
 
 // fn textureStore(texture: texture_storage_2d_array<rg32float, write>, coords: vec2<i32>, array_index: i32, value: vec4<f32>)
 fn textureStore_c863be() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_c863be();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_c863be();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_c863be();
 }
diff --git a/test/intrinsics/gen/textureStore/c863be.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/c863be.wgsl.expected.wgsl
index 147d8be..46b5a69 100644
--- a/test/intrinsics/gen/textureStore/c863be.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/c863be.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rg32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rg32float, write>;
 
 fn textureStore_c863be() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_c863be();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_c863be();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_c863be();
 }
diff --git a/test/intrinsics/gen/textureStore/d73b5c.wgsl b/test/intrinsics/gen/textureStore/d73b5c.wgsl
index b91a45f..29a764d 100644
--- a/test/intrinsics/gen/textureStore/d73b5c.wgsl
+++ b/test/intrinsics/gen/textureStore/d73b5c.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rg32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rg32sint, write>;
 
 // fn textureStore(texture: texture_storage_1d<rg32sint, write>, coords: i32, value: vec4<i32>)
 fn textureStore_d73b5c() {
   textureStore(arg_0, 1, vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_d73b5c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_d73b5c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_d73b5c();
 }
diff --git a/test/intrinsics/gen/textureStore/d73b5c.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/d73b5c.wgsl.expected.wgsl
index 38b9a97..2b09cbc 100644
--- a/test/intrinsics/gen/textureStore/d73b5c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/d73b5c.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rg32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rg32sint, write>;
 
 fn textureStore_d73b5c() {
   textureStore(arg_0, 1, vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_d73b5c();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_d73b5c();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_d73b5c();
 }
diff --git a/test/intrinsics/gen/textureStore/dd7d81.wgsl b/test/intrinsics/gen/textureStore/dd7d81.wgsl
index f0f0039..4730c2e 100644
--- a/test/intrinsics/gen/textureStore/dd7d81.wgsl
+++ b/test/intrinsics/gen/textureStore/dd7d81.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rgba8snorm, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8snorm, write>;
 
 // fn textureStore(texture: texture_storage_3d<rgba8snorm, write>, coords: vec3<i32>, value: vec4<f32>)
 fn textureStore_dd7d81() {
   textureStore(arg_0, vec3<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_dd7d81();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_dd7d81();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_dd7d81();
 }
diff --git a/test/intrinsics/gen/textureStore/dd7d81.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/dd7d81.wgsl.expected.wgsl
index e99a25f..f7f4bc1 100644
--- a/test/intrinsics/gen/textureStore/dd7d81.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/dd7d81.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rgba8snorm, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rgba8snorm, write>;
 
 fn textureStore_dd7d81() {
   textureStore(arg_0, vec3<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_dd7d81();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_dd7d81();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_dd7d81();
 }
diff --git a/test/intrinsics/gen/textureStore/dde364.wgsl b/test/intrinsics/gen/textureStore/dde364.wgsl
index b9f429d..7050247 100644
--- a/test/intrinsics/gen/textureStore/dde364.wgsl
+++ b/test/intrinsics/gen/textureStore/dde364.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rg32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32uint, write>;
 
 // fn textureStore(texture: texture_storage_2d_array<rg32uint, write>, coords: vec2<i32>, array_index: i32, value: vec4<u32>)
 fn textureStore_dde364() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_dde364();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_dde364();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_dde364();
 }
diff --git a/test/intrinsics/gen/textureStore/dde364.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/dde364.wgsl.expected.wgsl
index 87583fd..044b09d 100644
--- a/test/intrinsics/gen/textureStore/dde364.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/dde364.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rg32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rg32uint, write>;
 
 fn textureStore_dde364() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_dde364();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_dde364();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_dde364();
 }
diff --git a/test/intrinsics/gen/textureStore/e885e8.wgsl b/test/intrinsics/gen/textureStore/e885e8.wgsl
index c1ca56a..fd0c31c 100644
--- a/test/intrinsics/gen/textureStore/e885e8.wgsl
+++ b/test/intrinsics/gen/textureStore/e885e8.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rgba16float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba16float, write>;
 
 // fn textureStore(texture: texture_storage_1d<rgba16float, write>, coords: i32, value: vec4<f32>)
 fn textureStore_e885e8() {
   textureStore(arg_0, 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_e885e8();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_e885e8();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_e885e8();
 }
diff --git a/test/intrinsics/gen/textureStore/e885e8.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/e885e8.wgsl.expected.wgsl
index f8dbae5..eac4ea6 100644
--- a/test/intrinsics/gen/textureStore/e885e8.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/e885e8.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rgba16float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rgba16float, write>;
 
 fn textureStore_e885e8() {
   textureStore(arg_0, 1, vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_e885e8();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_e885e8();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_e885e8();
 }
diff --git a/test/intrinsics/gen/textureStore/eb702f.wgsl b/test/intrinsics/gen/textureStore/eb702f.wgsl
index a0410f9..283888d 100644
--- a/test/intrinsics/gen/textureStore/eb702f.wgsl
+++ b/test/intrinsics/gen/textureStore/eb702f.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<r32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<r32float, write>;
 
 // fn textureStore(texture: texture_storage_3d<r32float, write>, coords: vec3<i32>, value: vec4<f32>)
 fn textureStore_eb702f() {
   textureStore(arg_0, vec3<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_eb702f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_eb702f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_eb702f();
 }
diff --git a/test/intrinsics/gen/textureStore/eb702f.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/eb702f.wgsl.expected.wgsl
index 43e39be..c2b8653 100644
--- a/test/intrinsics/gen/textureStore/eb702f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/eb702f.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<r32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<r32float, write>;
 
 fn textureStore_eb702f() {
   textureStore(arg_0, vec3<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_eb702f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_eb702f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_eb702f();
 }
diff --git a/test/intrinsics/gen/textureStore/eb78b9.wgsl b/test/intrinsics/gen/textureStore/eb78b9.wgsl
index 16711fe..db051b1 100644
--- a/test/intrinsics/gen/textureStore/eb78b9.wgsl
+++ b/test/intrinsics/gen/textureStore/eb78b9.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<r32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<r32sint, write>;
 
 // fn textureStore(texture: texture_storage_3d<r32sint, write>, coords: vec3<i32>, value: vec4<i32>)
 fn textureStore_eb78b9() {
   textureStore(arg_0, vec3<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_eb78b9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_eb78b9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_eb78b9();
 }
diff --git a/test/intrinsics/gen/textureStore/eb78b9.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/eb78b9.wgsl.expected.wgsl
index b5f9092..09472ae 100644
--- a/test/intrinsics/gen/textureStore/eb78b9.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/eb78b9.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<r32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<r32sint, write>;
 
 fn textureStore_eb78b9() {
   textureStore(arg_0, vec3<i32>(), vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_eb78b9();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_eb78b9();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_eb78b9();
 }
diff --git a/test/intrinsics/gen/textureStore/ee6acc.wgsl b/test/intrinsics/gen/textureStore/ee6acc.wgsl
index 3f431a4..b6db2d0 100644
--- a/test/intrinsics/gen/textureStore/ee6acc.wgsl
+++ b/test/intrinsics/gen/textureStore/ee6acc.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rg32float, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rg32float, write>;
 
 // fn textureStore(texture: texture_storage_3d<rg32float, write>, coords: vec3<i32>, value: vec4<f32>)
 fn textureStore_ee6acc() {
   textureStore(arg_0, vec3<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_ee6acc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_ee6acc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_ee6acc();
 }
diff --git a/test/intrinsics/gen/textureStore/ee6acc.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/ee6acc.wgsl.expected.wgsl
index f3e5b9e..8b5b0ab 100644
--- a/test/intrinsics/gen/textureStore/ee6acc.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/ee6acc.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rg32float, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rg32float, write>;
 
 fn textureStore_ee6acc() {
   textureStore(arg_0, vec3<i32>(), vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_ee6acc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_ee6acc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_ee6acc();
 }
diff --git a/test/intrinsics/gen/textureStore/ef9f2f.wgsl b/test/intrinsics/gen/textureStore/ef9f2f.wgsl
index 4519ff9..51c8545 100644
--- a/test/intrinsics/gen/textureStore/ef9f2f.wgsl
+++ b/test/intrinsics/gen/textureStore/ef9f2f.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<r32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<r32uint, write>;
 
 // fn textureStore(texture: texture_storage_3d<r32uint, write>, coords: vec3<i32>, value: vec4<u32>)
 fn textureStore_ef9f2f() {
   textureStore(arg_0, vec3<i32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_ef9f2f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_ef9f2f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_ef9f2f();
 }
diff --git a/test/intrinsics/gen/textureStore/ef9f2f.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/ef9f2f.wgsl.expected.wgsl
index 8841b4f..72cb6d0 100644
--- a/test/intrinsics/gen/textureStore/ef9f2f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/ef9f2f.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<r32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<r32uint, write>;
 
 fn textureStore_ef9f2f() {
   textureStore(arg_0, vec3<i32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_ef9f2f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_ef9f2f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_ef9f2f();
 }
diff --git a/test/intrinsics/gen/textureStore/f8dead.wgsl b/test/intrinsics/gen/textureStore/f8dead.wgsl
index 171a951..8cd8a24 100644
--- a/test/intrinsics/gen/textureStore/f8dead.wgsl
+++ b/test/intrinsics/gen/textureStore/f8dead.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_3d<rgba8uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_3d<rgba8uint, write>;
 
 // fn textureStore(texture: texture_storage_3d<rgba8uint, write>, coords: vec3<i32>, value: vec4<u32>)
 fn textureStore_f8dead() {
   textureStore(arg_0, vec3<i32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_f8dead();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_f8dead();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_f8dead();
 }
diff --git a/test/intrinsics/gen/textureStore/f8dead.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/f8dead.wgsl.expected.wgsl
index a90cf4a..eabfbca 100644
--- a/test/intrinsics/gen/textureStore/f8dead.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/f8dead.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_3d<rgba8uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_3d<rgba8uint, write>;
 
 fn textureStore_f8dead() {
   textureStore(arg_0, vec3<i32>(), vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_f8dead();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_f8dead();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_f8dead();
 }
diff --git a/test/intrinsics/gen/textureStore/f9be83.wgsl b/test/intrinsics/gen/textureStore/f9be83.wgsl
index fb1da82..a5f5b60 100644
--- a/test/intrinsics/gen/textureStore/f9be83.wgsl
+++ b/test/intrinsics/gen/textureStore/f9be83.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rg32sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rg32sint, write>;
 
 // fn textureStore(texture: texture_storage_2d_array<rg32sint, write>, coords: vec2<i32>, array_index: i32, value: vec4<i32>)
 fn textureStore_f9be83() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_f9be83();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_f9be83();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_f9be83();
 }
diff --git a/test/intrinsics/gen/textureStore/f9be83.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/f9be83.wgsl.expected.wgsl
index 5aaf528..c6bb3c4 100644
--- a/test/intrinsics/gen/textureStore/f9be83.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/f9be83.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rg32sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rg32sint, write>;
 
 fn textureStore_f9be83() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_f9be83();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_f9be83();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_f9be83();
 }
diff --git a/test/intrinsics/gen/textureStore/fb9a8f.wgsl b/test/intrinsics/gen/textureStore/fb9a8f.wgsl
index 518c2fb..e8002d0 100644
--- a/test/intrinsics/gen/textureStore/fb9a8f.wgsl
+++ b/test/intrinsics/gen/textureStore/fb9a8f.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_1d<rgba32uint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_1d<rgba32uint, write>;
 
 // fn textureStore(texture: texture_storage_1d<rgba32uint, write>, coords: i32, value: vec4<u32>)
 fn textureStore_fb9a8f() {
   textureStore(arg_0, 1, vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_fb9a8f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_fb9a8f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_fb9a8f();
 }
diff --git a/test/intrinsics/gen/textureStore/fb9a8f.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/fb9a8f.wgsl.expected.wgsl
index 4c1a8a2..27aa300 100644
--- a/test/intrinsics/gen/textureStore/fb9a8f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/fb9a8f.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_1d<rgba32uint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_1d<rgba32uint, write>;
 
 fn textureStore_fb9a8f() {
   textureStore(arg_0, 1, vec4<u32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_fb9a8f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_fb9a8f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_fb9a8f();
 }
diff --git a/test/intrinsics/gen/textureStore/fbf53f.wgsl b/test/intrinsics/gen/textureStore/fbf53f.wgsl
index a1878e4..eefd540 100644
--- a/test/intrinsics/gen/textureStore/fbf53f.wgsl
+++ b/test/intrinsics/gen/textureStore/fbf53f.wgsl
@@ -22,25 +22,25 @@
 // Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-[[group(1), binding(0)]] var arg_0: texture_storage_2d_array<rgba8sint, write>;
+@group(1) @binding(0) var arg_0: texture_storage_2d_array<rgba8sint, write>;
 
 // fn textureStore(texture: texture_storage_2d_array<rgba8sint, write>, coords: vec2<i32>, array_index: i32, value: vec4<i32>)
 fn textureStore_fbf53f() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_fbf53f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_fbf53f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_fbf53f();
 }
diff --git a/test/intrinsics/gen/textureStore/fbf53f.wgsl.expected.wgsl b/test/intrinsics/gen/textureStore/fbf53f.wgsl.expected.wgsl
index 203bf52..8ee5316 100644
--- a/test/intrinsics/gen/textureStore/fbf53f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/textureStore/fbf53f.wgsl.expected.wgsl
@@ -1,21 +1,21 @@
-[[group(1), binding(0)]] var arg_0 : texture_storage_2d_array<rgba8sint, write>;
+@group(1) @binding(0) var arg_0 : texture_storage_2d_array<rgba8sint, write>;
 
 fn textureStore_fbf53f() {
   textureStore(arg_0, vec2<i32>(), 1, vec4<i32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   textureStore_fbf53f();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   textureStore_fbf53f();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   textureStore_fbf53f();
 }
diff --git a/test/intrinsics/gen/transpose/2585cd.wgsl b/test/intrinsics/gen/transpose/2585cd.wgsl
index ad87b72..d693d25 100644
--- a/test/intrinsics/gen/transpose/2585cd.wgsl
+++ b/test/intrinsics/gen/transpose/2585cd.wgsl
@@ -28,18 +28,18 @@
   var res: mat3x4<f32> = transpose(mat4x3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   transpose_2585cd();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   transpose_2585cd();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   transpose_2585cd();
 }
diff --git a/test/intrinsics/gen/transpose/2585cd.wgsl.expected.wgsl b/test/intrinsics/gen/transpose/2585cd.wgsl.expected.wgsl
index acb366c..e2bcbee 100644
--- a/test/intrinsics/gen/transpose/2585cd.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/transpose/2585cd.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : mat3x4<f32> = transpose(mat4x3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   transpose_2585cd();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   transpose_2585cd();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   transpose_2585cd();
 }
diff --git a/test/intrinsics/gen/transpose/31d679.wgsl b/test/intrinsics/gen/transpose/31d679.wgsl
index 7bfdcdc..2f5b72a 100644
--- a/test/intrinsics/gen/transpose/31d679.wgsl
+++ b/test/intrinsics/gen/transpose/31d679.wgsl
@@ -28,18 +28,18 @@
   var res: mat2x2<f32> = transpose(mat2x2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   transpose_31d679();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   transpose_31d679();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   transpose_31d679();
 }
diff --git a/test/intrinsics/gen/transpose/31d679.wgsl.expected.wgsl b/test/intrinsics/gen/transpose/31d679.wgsl.expected.wgsl
index 32d466c..f588cba 100644
--- a/test/intrinsics/gen/transpose/31d679.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/transpose/31d679.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : mat2x2<f32> = transpose(mat2x2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   transpose_31d679();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   transpose_31d679();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   transpose_31d679();
 }
diff --git a/test/intrinsics/gen/transpose/31e37e.wgsl b/test/intrinsics/gen/transpose/31e37e.wgsl
index 4896ecb..0246329 100644
--- a/test/intrinsics/gen/transpose/31e37e.wgsl
+++ b/test/intrinsics/gen/transpose/31e37e.wgsl
@@ -28,18 +28,18 @@
   var res: mat2x4<f32> = transpose(mat4x2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   transpose_31e37e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   transpose_31e37e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   transpose_31e37e();
 }
diff --git a/test/intrinsics/gen/transpose/31e37e.wgsl.expected.wgsl b/test/intrinsics/gen/transpose/31e37e.wgsl.expected.wgsl
index e603075..3462f91 100644
--- a/test/intrinsics/gen/transpose/31e37e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/transpose/31e37e.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : mat2x4<f32> = transpose(mat4x2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   transpose_31e37e();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   transpose_31e37e();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   transpose_31e37e();
 }
diff --git a/test/intrinsics/gen/transpose/4ce359.wgsl b/test/intrinsics/gen/transpose/4ce359.wgsl
index 4f0f9f0..5f8c9cc 100644
--- a/test/intrinsics/gen/transpose/4ce359.wgsl
+++ b/test/intrinsics/gen/transpose/4ce359.wgsl
@@ -28,18 +28,18 @@
   var res: mat4x2<f32> = transpose(mat2x4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   transpose_4ce359();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   transpose_4ce359();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   transpose_4ce359();
 }
diff --git a/test/intrinsics/gen/transpose/4ce359.wgsl.expected.wgsl b/test/intrinsics/gen/transpose/4ce359.wgsl.expected.wgsl
index 92bc18e..a4123d5 100644
--- a/test/intrinsics/gen/transpose/4ce359.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/transpose/4ce359.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : mat4x2<f32> = transpose(mat2x4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   transpose_4ce359();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   transpose_4ce359();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   transpose_4ce359();
 }
diff --git a/test/intrinsics/gen/transpose/4dc9a1.wgsl b/test/intrinsics/gen/transpose/4dc9a1.wgsl
index 492bef4..f98f9e2 100644
--- a/test/intrinsics/gen/transpose/4dc9a1.wgsl
+++ b/test/intrinsics/gen/transpose/4dc9a1.wgsl
@@ -28,18 +28,18 @@
   var res: mat3x2<f32> = transpose(mat2x3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   transpose_4dc9a1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   transpose_4dc9a1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   transpose_4dc9a1();
 }
diff --git a/test/intrinsics/gen/transpose/4dc9a1.wgsl.expected.wgsl b/test/intrinsics/gen/transpose/4dc9a1.wgsl.expected.wgsl
index 1c5ca70..9a579e0 100644
--- a/test/intrinsics/gen/transpose/4dc9a1.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/transpose/4dc9a1.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : mat3x2<f32> = transpose(mat2x3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   transpose_4dc9a1();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   transpose_4dc9a1();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   transpose_4dc9a1();
 }
diff --git a/test/intrinsics/gen/transpose/854336.wgsl b/test/intrinsics/gen/transpose/854336.wgsl
index 88838ca..9dccf31 100644
--- a/test/intrinsics/gen/transpose/854336.wgsl
+++ b/test/intrinsics/gen/transpose/854336.wgsl
@@ -28,18 +28,18 @@
   var res: mat3x3<f32> = transpose(mat3x3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   transpose_854336();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   transpose_854336();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   transpose_854336();
 }
diff --git a/test/intrinsics/gen/transpose/854336.wgsl.expected.wgsl b/test/intrinsics/gen/transpose/854336.wgsl.expected.wgsl
index f00a06d..9eac4c0 100644
--- a/test/intrinsics/gen/transpose/854336.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/transpose/854336.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : mat3x3<f32> = transpose(mat3x3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   transpose_854336();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   transpose_854336();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   transpose_854336();
 }
diff --git a/test/intrinsics/gen/transpose/c1b600.wgsl b/test/intrinsics/gen/transpose/c1b600.wgsl
index cbb790f..e0fc4fc 100644
--- a/test/intrinsics/gen/transpose/c1b600.wgsl
+++ b/test/intrinsics/gen/transpose/c1b600.wgsl
@@ -28,18 +28,18 @@
   var res: mat4x4<f32> = transpose(mat4x4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   transpose_c1b600();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   transpose_c1b600();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   transpose_c1b600();
 }
diff --git a/test/intrinsics/gen/transpose/c1b600.wgsl.expected.wgsl b/test/intrinsics/gen/transpose/c1b600.wgsl.expected.wgsl
index 5bf3104..f391f5c 100644
--- a/test/intrinsics/gen/transpose/c1b600.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/transpose/c1b600.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : mat4x4<f32> = transpose(mat4x4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   transpose_c1b600();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   transpose_c1b600();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   transpose_c1b600();
 }
diff --git a/test/intrinsics/gen/transpose/d8f8ba.wgsl b/test/intrinsics/gen/transpose/d8f8ba.wgsl
index ba8e6d8..a09be46 100644
--- a/test/intrinsics/gen/transpose/d8f8ba.wgsl
+++ b/test/intrinsics/gen/transpose/d8f8ba.wgsl
@@ -28,18 +28,18 @@
   var res: mat4x3<f32> = transpose(mat3x4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   transpose_d8f8ba();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   transpose_d8f8ba();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   transpose_d8f8ba();
 }
diff --git a/test/intrinsics/gen/transpose/d8f8ba.wgsl.expected.wgsl b/test/intrinsics/gen/transpose/d8f8ba.wgsl.expected.wgsl
index eef54bc..e5af1d4 100644
--- a/test/intrinsics/gen/transpose/d8f8ba.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/transpose/d8f8ba.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : mat4x3<f32> = transpose(mat3x4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   transpose_d8f8ba();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   transpose_d8f8ba();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   transpose_d8f8ba();
 }
diff --git a/test/intrinsics/gen/transpose/ed4bdc.wgsl b/test/intrinsics/gen/transpose/ed4bdc.wgsl
index 5b6c2ee..0ed170e 100644
--- a/test/intrinsics/gen/transpose/ed4bdc.wgsl
+++ b/test/intrinsics/gen/transpose/ed4bdc.wgsl
@@ -28,18 +28,18 @@
   var res: mat2x3<f32> = transpose(mat3x2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   transpose_ed4bdc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   transpose_ed4bdc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   transpose_ed4bdc();
 }
diff --git a/test/intrinsics/gen/transpose/ed4bdc.wgsl.expected.wgsl b/test/intrinsics/gen/transpose/ed4bdc.wgsl.expected.wgsl
index 85faea7..462a2cf 100644
--- a/test/intrinsics/gen/transpose/ed4bdc.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/transpose/ed4bdc.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : mat2x3<f32> = transpose(mat3x2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   transpose_ed4bdc();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   transpose_ed4bdc();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   transpose_ed4bdc();
 }
diff --git a/test/intrinsics/gen/trunc/562d05.wgsl b/test/intrinsics/gen/trunc/562d05.wgsl
index b58d624..65a0b42 100644
--- a/test/intrinsics/gen/trunc/562d05.wgsl
+++ b/test/intrinsics/gen/trunc/562d05.wgsl
@@ -28,18 +28,18 @@
   var res: vec3<f32> = trunc(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   trunc_562d05();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   trunc_562d05();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   trunc_562d05();
 }
diff --git a/test/intrinsics/gen/trunc/562d05.wgsl.expected.wgsl b/test/intrinsics/gen/trunc/562d05.wgsl.expected.wgsl
index bf15812..cef9697 100644
--- a/test/intrinsics/gen/trunc/562d05.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/trunc/562d05.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec3<f32> = trunc(vec3<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   trunc_562d05();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   trunc_562d05();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   trunc_562d05();
 }
diff --git a/test/intrinsics/gen/trunc/e183aa.wgsl b/test/intrinsics/gen/trunc/e183aa.wgsl
index 4193087..186a1e9 100644
--- a/test/intrinsics/gen/trunc/e183aa.wgsl
+++ b/test/intrinsics/gen/trunc/e183aa.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = trunc(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   trunc_e183aa();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   trunc_e183aa();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   trunc_e183aa();
 }
diff --git a/test/intrinsics/gen/trunc/e183aa.wgsl.expected.wgsl b/test/intrinsics/gen/trunc/e183aa.wgsl.expected.wgsl
index 9524479..94e505f 100644
--- a/test/intrinsics/gen/trunc/e183aa.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/trunc/e183aa.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = trunc(vec4<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   trunc_e183aa();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   trunc_e183aa();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   trunc_e183aa();
 }
diff --git a/test/intrinsics/gen/trunc/eb83df.wgsl b/test/intrinsics/gen/trunc/eb83df.wgsl
index 665f857..4da7b28 100644
--- a/test/intrinsics/gen/trunc/eb83df.wgsl
+++ b/test/intrinsics/gen/trunc/eb83df.wgsl
@@ -28,18 +28,18 @@
   var res: f32 = trunc(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   trunc_eb83df();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   trunc_eb83df();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   trunc_eb83df();
 }
diff --git a/test/intrinsics/gen/trunc/eb83df.wgsl.expected.wgsl b/test/intrinsics/gen/trunc/eb83df.wgsl.expected.wgsl
index d5c576f..7392b6c 100644
--- a/test/intrinsics/gen/trunc/eb83df.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/trunc/eb83df.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : f32 = trunc(1.0);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   trunc_eb83df();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   trunc_eb83df();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   trunc_eb83df();
 }
diff --git a/test/intrinsics/gen/trunc/f370d3.wgsl b/test/intrinsics/gen/trunc/f370d3.wgsl
index a46eb93..0587914 100644
--- a/test/intrinsics/gen/trunc/f370d3.wgsl
+++ b/test/intrinsics/gen/trunc/f370d3.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = trunc(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   trunc_f370d3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   trunc_f370d3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   trunc_f370d3();
 }
diff --git a/test/intrinsics/gen/trunc/f370d3.wgsl.expected.wgsl b/test/intrinsics/gen/trunc/f370d3.wgsl.expected.wgsl
index 11cb91b..8393d97 100644
--- a/test/intrinsics/gen/trunc/f370d3.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/trunc/f370d3.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = trunc(vec2<f32>());
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   trunc_f370d3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   trunc_f370d3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   trunc_f370d3();
 }
diff --git a/test/intrinsics/gen/unpack2x16float/32a5cf.wgsl b/test/intrinsics/gen/unpack2x16float/32a5cf.wgsl
index bd2aa9f..db4b36b 100644
--- a/test/intrinsics/gen/unpack2x16float/32a5cf.wgsl
+++ b/test/intrinsics/gen/unpack2x16float/32a5cf.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = unpack2x16float(1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   unpack2x16float_32a5cf();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   unpack2x16float_32a5cf();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   unpack2x16float_32a5cf();
 }
diff --git a/test/intrinsics/gen/unpack2x16float/32a5cf.wgsl.expected.wgsl b/test/intrinsics/gen/unpack2x16float/32a5cf.wgsl.expected.wgsl
index 768b0cd..fac9058 100644
--- a/test/intrinsics/gen/unpack2x16float/32a5cf.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/unpack2x16float/32a5cf.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = unpack2x16float(1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   unpack2x16float_32a5cf();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   unpack2x16float_32a5cf();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   unpack2x16float_32a5cf();
 }
diff --git a/test/intrinsics/gen/unpack2x16snorm/b4aea6.wgsl b/test/intrinsics/gen/unpack2x16snorm/b4aea6.wgsl
index 4292645..0ff4ddd 100644
--- a/test/intrinsics/gen/unpack2x16snorm/b4aea6.wgsl
+++ b/test/intrinsics/gen/unpack2x16snorm/b4aea6.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = unpack2x16snorm(1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   unpack2x16snorm_b4aea6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   unpack2x16snorm_b4aea6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   unpack2x16snorm_b4aea6();
 }
diff --git a/test/intrinsics/gen/unpack2x16snorm/b4aea6.wgsl.expected.wgsl b/test/intrinsics/gen/unpack2x16snorm/b4aea6.wgsl.expected.wgsl
index 144bba7..a97f875 100644
--- a/test/intrinsics/gen/unpack2x16snorm/b4aea6.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/unpack2x16snorm/b4aea6.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = unpack2x16snorm(1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   unpack2x16snorm_b4aea6();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   unpack2x16snorm_b4aea6();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   unpack2x16snorm_b4aea6();
 }
diff --git a/test/intrinsics/gen/unpack2x16unorm/7699c0.wgsl b/test/intrinsics/gen/unpack2x16unorm/7699c0.wgsl
index 0961fa6..7a5e3ad 100644
--- a/test/intrinsics/gen/unpack2x16unorm/7699c0.wgsl
+++ b/test/intrinsics/gen/unpack2x16unorm/7699c0.wgsl
@@ -28,18 +28,18 @@
   var res: vec2<f32> = unpack2x16unorm(1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   unpack2x16unorm_7699c0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   unpack2x16unorm_7699c0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   unpack2x16unorm_7699c0();
 }
diff --git a/test/intrinsics/gen/unpack2x16unorm/7699c0.wgsl.expected.wgsl b/test/intrinsics/gen/unpack2x16unorm/7699c0.wgsl.expected.wgsl
index b4ea311..784f95a 100644
--- a/test/intrinsics/gen/unpack2x16unorm/7699c0.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/unpack2x16unorm/7699c0.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec2<f32> = unpack2x16unorm(1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   unpack2x16unorm_7699c0();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   unpack2x16unorm_7699c0();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   unpack2x16unorm_7699c0();
 }
diff --git a/test/intrinsics/gen/unpack4x8snorm/523fb3.wgsl b/test/intrinsics/gen/unpack4x8snorm/523fb3.wgsl
index 5262a7a..0692bf2 100644
--- a/test/intrinsics/gen/unpack4x8snorm/523fb3.wgsl
+++ b/test/intrinsics/gen/unpack4x8snorm/523fb3.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = unpack4x8snorm(1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   unpack4x8snorm_523fb3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   unpack4x8snorm_523fb3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   unpack4x8snorm_523fb3();
 }
diff --git a/test/intrinsics/gen/unpack4x8snorm/523fb3.wgsl.expected.wgsl b/test/intrinsics/gen/unpack4x8snorm/523fb3.wgsl.expected.wgsl
index a2f5337..d3baad3 100644
--- a/test/intrinsics/gen/unpack4x8snorm/523fb3.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/unpack4x8snorm/523fb3.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = unpack4x8snorm(1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   unpack4x8snorm_523fb3();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   unpack4x8snorm_523fb3();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   unpack4x8snorm_523fb3();
 }
diff --git a/test/intrinsics/gen/unpack4x8unorm/750c74.wgsl b/test/intrinsics/gen/unpack4x8unorm/750c74.wgsl
index 2c95b9d..f0fcae3 100644
--- a/test/intrinsics/gen/unpack4x8unorm/750c74.wgsl
+++ b/test/intrinsics/gen/unpack4x8unorm/750c74.wgsl
@@ -28,18 +28,18 @@
   var res: vec4<f32> = unpack4x8unorm(1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   unpack4x8unorm_750c74();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   unpack4x8unorm_750c74();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   unpack4x8unorm_750c74();
 }
diff --git a/test/intrinsics/gen/unpack4x8unorm/750c74.wgsl.expected.wgsl b/test/intrinsics/gen/unpack4x8unorm/750c74.wgsl.expected.wgsl
index 45f934a..bfedafb 100644
--- a/test/intrinsics/gen/unpack4x8unorm/750c74.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/unpack4x8unorm/750c74.wgsl.expected.wgsl
@@ -2,18 +2,18 @@
   var res : vec4<f32> = unpack4x8unorm(1u);
 }
 
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   unpack4x8unorm_750c74();
   return vec4<f32>();
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   unpack4x8unorm_750c74();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   unpack4x8unorm_750c74();
 }
diff --git a/test/intrinsics/gen/workgroupBarrier/a17f7f.wgsl b/test/intrinsics/gen/workgroupBarrier/a17f7f.wgsl
index 983f114..a006547 100644
--- a/test/intrinsics/gen/workgroupBarrier/a17f7f.wgsl
+++ b/test/intrinsics/gen/workgroupBarrier/a17f7f.wgsl
@@ -28,7 +28,7 @@
   workgroupBarrier();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   workgroupBarrier_a17f7f();
 }
diff --git a/test/intrinsics/gen/workgroupBarrier/a17f7f.wgsl.expected.wgsl b/test/intrinsics/gen/workgroupBarrier/a17f7f.wgsl.expected.wgsl
index 771ed9a..34db6c8 100644
--- a/test/intrinsics/gen/workgroupBarrier/a17f7f.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/workgroupBarrier/a17f7f.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   workgroupBarrier();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   workgroupBarrier_a17f7f();
 }
diff --git a/test/intrinsics/ignore/call.wgsl b/test/intrinsics/ignore/call.wgsl
index b3ff386..f7c03df 100644
--- a/test/intrinsics/ignore/call.wgsl
+++ b/test/intrinsics/ignore/call.wgsl
@@ -2,7 +2,7 @@
     return a * b + c;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     ignore(f(1, 2, 3));
 }
diff --git a/test/intrinsics/ignore/call.wgsl.expected.wgsl b/test/intrinsics/ignore/call.wgsl.expected.wgsl
index 4ab9b94..49c50c7 100644
--- a/test/intrinsics/ignore/call.wgsl.expected.wgsl
+++ b/test/intrinsics/ignore/call.wgsl.expected.wgsl
@@ -6,7 +6,7 @@
   return ((a * b) + c);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   ignore(f(1, 2, 3));
 }
diff --git a/test/intrinsics/ignore/runtime_array.wgsl b/test/intrinsics/ignore/runtime_array.wgsl
index b7cc1e7..c76ba03 100644
--- a/test/intrinsics/ignore/runtime_array.wgsl
+++ b/test/intrinsics/ignore/runtime_array.wgsl
@@ -2,9 +2,9 @@
     arr : array<i32>;
 };
 
-[[binding(0), group(0)]] var<storage, read_write> s : S;
+@binding(0) @group(0) var<storage, read_write> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     ignore(s.arr);
 }
diff --git a/test/intrinsics/ignore/runtime_array.wgsl.expected.wgsl b/test/intrinsics/ignore/runtime_array.wgsl.expected.wgsl
index e58a70c..310405a 100644
--- a/test/intrinsics/ignore/runtime_array.wgsl.expected.wgsl
+++ b/test/intrinsics/ignore/runtime_array.wgsl.expected.wgsl
@@ -6,9 +6,9 @@
   arr : array<i32>;
 }
 
-[[binding(0), group(0)]] var<storage, read_write> s : S;
+@binding(0) @group(0) var<storage, read_write> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   ignore(s.arr);
 }
diff --git a/test/intrinsics/ignore/storage_buffer.wgsl b/test/intrinsics/ignore/storage_buffer.wgsl
index be63c03..7243c04 100644
--- a/test/intrinsics/ignore/storage_buffer.wgsl
+++ b/test/intrinsics/ignore/storage_buffer.wgsl
@@ -2,9 +2,9 @@
     i : i32;
 };
 
-[[binding(0), group(0)]] var<storage, read_write> s : S;
+@binding(0) @group(0) var<storage, read_write> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     ignore(s);
     ignore(s.i);
diff --git a/test/intrinsics/ignore/storage_buffer.wgsl.expected.wgsl b/test/intrinsics/ignore/storage_buffer.wgsl.expected.wgsl
index 0f2f5e9..4e69a8d 100644
--- a/test/intrinsics/ignore/storage_buffer.wgsl.expected.wgsl
+++ b/test/intrinsics/ignore/storage_buffer.wgsl.expected.wgsl
@@ -10,9 +10,9 @@
   i : i32;
 }
 
-[[binding(0), group(0)]] var<storage, read_write> s : S;
+@binding(0) @group(0) var<storage, read_write> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   ignore(s);
   ignore(s.i);
diff --git a/test/intrinsics/ignore/uniform_buffer.wgsl b/test/intrinsics/ignore/uniform_buffer.wgsl
index bf92e75..860867a 100644
--- a/test/intrinsics/ignore/uniform_buffer.wgsl
+++ b/test/intrinsics/ignore/uniform_buffer.wgsl
@@ -2,9 +2,9 @@
     i : i32;
 };
 
-[[binding(0), group(0)]] var<uniform> u : S;
+@binding(0) @group(0) var<uniform> u : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     ignore(u);
     ignore(u.i);
diff --git a/test/intrinsics/ignore/uniform_buffer.wgsl.expected.wgsl b/test/intrinsics/ignore/uniform_buffer.wgsl.expected.wgsl
index 72a1efe..7a25674 100644
--- a/test/intrinsics/ignore/uniform_buffer.wgsl.expected.wgsl
+++ b/test/intrinsics/ignore/uniform_buffer.wgsl.expected.wgsl
@@ -10,9 +10,9 @@
   i : i32;
 }
 
-[[binding(0), group(0)]] var<uniform> u : S;
+@binding(0) @group(0) var<uniform> u : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   ignore(u);
   ignore(u.i);
diff --git a/test/intrinsics/intrinsics.wgsl.tmpl b/test/intrinsics/intrinsics.wgsl.tmpl
index 16f72c3..254fb16 100644
--- a/test/intrinsics/intrinsics.wgsl.tmpl
+++ b/test/intrinsics/intrinsics.wgsl.tmpl
@@ -41,7 +41,7 @@
 struct SB_RW {
 {{- $sb_rw_fields -}}
 };
-[[group(0), binding(0)]] var<storage, read_write> sb_rw : SB_RW;
+@group(0) @binding(0) var<storage, read_write> sb_rw : SB_RW;
 {{    end -}}
 
 {{- /* Generate RO storage buffer parameters */ -}}
@@ -54,7 +54,7 @@
 struct SB_RO {
 {{- $sb_ro_fields -}}
 };
-[[group(0), binding(1)]] var<storage, read> sb_ro : SB_RO;
+@group(0) @binding(1) var<storage, read> sb_ro : SB_RO;
 {{    end -}}
 
 {{- /* Generate uniform buffer parameters */ -}}
@@ -67,7 +67,7 @@
 struct UB {
 {{- $ub_fields -}}
 };
-[[group(0), binding(1)]] var<uniform> ub : UB;
+@group(0) @binding(1) var<uniform> ub : UB;
 {{    end -}}
 
 {{- /* Generate module-scoped handle variables */ -}}
@@ -76,7 +76,7 @@
 {{-     if eq "ptr" $p.Type.Target.Name -}}
 {{-       $el_type := Eval "Type" (index $p.Type.TemplateArguments 1)}}
 {{-       if eq "handle" $class -}}
-            [[group(1), binding({{$i}})]] var arg_{{$i}}: {{$el_type}};
+            @group(1) @binding({{$i}}) var arg_{{$i}}: {{$el_type}};
 {{          $args.Put $i (printf "&arg_%v" $i) -}}
 {{-       else if eq "workgroup" $class -}}
             var<workgroup> arg_{{$i}}: {{$el_type}};
@@ -88,7 +88,7 @@
 {{-     else -}}
 {{-       $type := Eval "Type" $p.Type}}
 {{-       if eq "handle" $class -}}
-            [[group(1), binding({{$i}})]] var arg_{{$i}}: {{$type}};
+            @group(1) @binding({{$i}}) var arg_{{$i}}: {{$type}};
 {{          $args.Put $i (printf "arg_%v" $i) -}}
 {{-       else if eq "workgroup" $class -}}
             var<workgroup> arg_{{$i}}: {{$type}};
@@ -131,22 +131,22 @@
 {{/*new line*/ -}}
 
 {{- if .CanBeUsedInStage.Vertex }}
-[[stage(vertex)]]
-fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vertex_main() -> @builtin(position) vec4<f32> {
   {{$permutation}}();
   return vec4<f32>();
 }
 {{ end -}}
 
 {{- if .CanBeUsedInStage.Fragment }}
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   {{$permutation}}();
 }
 {{ end -}}
 
 {{- if .CanBeUsedInStage.Compute }}
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn compute_main() {
   {{$permutation}}();
 }
diff --git a/test/intrinsics/modf.wgsl b/test/intrinsics/modf.wgsl
index f8b1cf3..6991b74 100644
--- a/test/intrinsics/modf.wgsl
+++ b/test/intrinsics/modf.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     let res = modf(1.23);
     let fract : f32 = res.fract;
diff --git a/test/intrinsics/modf.wgsl.expected.wgsl b/test/intrinsics/modf.wgsl.expected.wgsl
index ba6a7c6..8e95d07 100644
--- a/test/intrinsics/modf.wgsl.expected.wgsl
+++ b/test/intrinsics/modf.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let res = modf(1.230000019);
   let fract : f32 = res.fract;
diff --git a/test/intrinsics/radians.spvasm.expected.wgsl b/test/intrinsics/radians.spvasm.expected.wgsl
index 8edc85e..1203bfe 100644
--- a/test/intrinsics/radians.spvasm.expected.wgsl
+++ b/test/intrinsics/radians.spvasm.expected.wgsl
@@ -7,7 +7,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/intrinsics/repeated_use.wgsl b/test/intrinsics/repeated_use.wgsl
index 8a5e175..0ca4cad 100644
--- a/test/intrinsics/repeated_use.wgsl
+++ b/test/intrinsics/repeated_use.wgsl
@@ -1,6 +1,6 @@
 // Check that for backends that generate intrinsic helpers, repeated use of the
 // same intrinsic overload results in single helper being generated.
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = isNormal(vec4<f32>());
     _ = isNormal(vec4<f32>(1.));
diff --git a/test/intrinsics/repeated_use.wgsl.expected.wgsl b/test/intrinsics/repeated_use.wgsl.expected.wgsl
index a654f4b..3f21e25 100644
--- a/test/intrinsics/repeated_use.wgsl.expected.wgsl
+++ b/test/intrinsics/repeated_use.wgsl.expected.wgsl
@@ -46,7 +46,7 @@
     _ = isNormal(3.);
         ^^^^^^^^
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = isNormal(vec4<f32>());
   _ = isNormal(vec4<f32>(1.0));
diff --git a/test/intrinsics/textureDimensions/depth_ms.spvasm.expected.wgsl b/test/intrinsics/textureDimensions/depth_ms.spvasm.expected.wgsl
index d7e9e8b..f6e2411 100644
--- a/test/intrinsics/textureDimensions/depth_ms.spvasm.expected.wgsl
+++ b/test/intrinsics/textureDimensions/depth_ms.spvasm.expected.wgsl
@@ -1,4 +1,4 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_multisampled_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_multisampled_2d;
 
 var<private> tint_symbol_1 : vec4<f32> = vec4<f32>();
 
@@ -21,11 +21,11 @@
 }
 
 struct vertex_main_out {
-  [[builtin(position)]]
+  @builtin(position)
   tint_symbol_1_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vertex_main() -> vertex_main_out {
   vertex_main_1();
   return vertex_main_out(tint_symbol_1);
@@ -36,7 +36,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fragment_main_1();
 }
@@ -46,7 +46,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn compute_main() {
   compute_main_1();
 }
diff --git a/test/intrinsics/textureGather/f32/alpha.wgsl b/test/intrinsics/textureGather/f32/alpha.wgsl
index d61f99b..1336988 100644
--- a/test/intrinsics/textureGather/f32/alpha.wgsl
+++ b/test/intrinsics/textureGather/f32/alpha.wgsl
@@ -1,7 +1,7 @@
-[[group(1), binding(0)]] var t : texture_2d<f32>;
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(0) var t : texture_2d<f32>;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<f32> = textureGather(3, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureGather/f32/alpha.wgsl.expected.wgsl b/test/intrinsics/textureGather/f32/alpha.wgsl.expected.wgsl
index fada6d1..3cf1392 100644
--- a/test/intrinsics/textureGather/f32/alpha.wgsl.expected.wgsl
+++ b/test/intrinsics/textureGather/f32/alpha.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(1), binding(0)]] var t : texture_2d<f32>;
+@group(1) @binding(0) var t : texture_2d<f32>;
 
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<f32> = textureGather(3, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureGather/f32/blue.wgsl b/test/intrinsics/textureGather/f32/blue.wgsl
index b8251ee..f31387b 100644
--- a/test/intrinsics/textureGather/f32/blue.wgsl
+++ b/test/intrinsics/textureGather/f32/blue.wgsl
@@ -1,7 +1,7 @@
-[[group(1), binding(0)]] var t : texture_2d<f32>;
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(0) var t : texture_2d<f32>;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<f32> = textureGather(2, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureGather/f32/blue.wgsl.expected.wgsl b/test/intrinsics/textureGather/f32/blue.wgsl.expected.wgsl
index 18cc654..2512919 100644
--- a/test/intrinsics/textureGather/f32/blue.wgsl.expected.wgsl
+++ b/test/intrinsics/textureGather/f32/blue.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(1), binding(0)]] var t : texture_2d<f32>;
+@group(1) @binding(0) var t : texture_2d<f32>;
 
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<f32> = textureGather(2, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureGather/f32/green.wgsl b/test/intrinsics/textureGather/f32/green.wgsl
index f0960ce..c0574ca 100644
--- a/test/intrinsics/textureGather/f32/green.wgsl
+++ b/test/intrinsics/textureGather/f32/green.wgsl
@@ -1,7 +1,7 @@
-[[group(1), binding(0)]] var t : texture_2d<f32>;
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(0) var t : texture_2d<f32>;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<f32> = textureGather(1, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureGather/f32/green.wgsl.expected.wgsl b/test/intrinsics/textureGather/f32/green.wgsl.expected.wgsl
index 778bc1c..524c0c4 100644
--- a/test/intrinsics/textureGather/f32/green.wgsl.expected.wgsl
+++ b/test/intrinsics/textureGather/f32/green.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(1), binding(0)]] var t : texture_2d<f32>;
+@group(1) @binding(0) var t : texture_2d<f32>;
 
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<f32> = textureGather(1, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureGather/f32/red.wgsl b/test/intrinsics/textureGather/f32/red.wgsl
index 89772c9..4eb8c60 100644
--- a/test/intrinsics/textureGather/f32/red.wgsl
+++ b/test/intrinsics/textureGather/f32/red.wgsl
@@ -1,7 +1,7 @@
-[[group(1), binding(0)]] var t : texture_2d<f32>;
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(0) var t : texture_2d<f32>;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<f32> = textureGather(0, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureGather/f32/red.wgsl.expected.wgsl b/test/intrinsics/textureGather/f32/red.wgsl.expected.wgsl
index 4853506..0524429 100644
--- a/test/intrinsics/textureGather/f32/red.wgsl.expected.wgsl
+++ b/test/intrinsics/textureGather/f32/red.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(1), binding(0)]] var t : texture_2d<f32>;
+@group(1) @binding(0) var t : texture_2d<f32>;
 
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<f32> = textureGather(0, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureGather/i32/alpha.wgsl b/test/intrinsics/textureGather/i32/alpha.wgsl
index d83c3ca..42133c9 100644
--- a/test/intrinsics/textureGather/i32/alpha.wgsl
+++ b/test/intrinsics/textureGather/i32/alpha.wgsl
@@ -1,7 +1,7 @@
-[[group(1), binding(0)]] var t : texture_2d<i32>;
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(0) var t : texture_2d<i32>;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<i32> = textureGather(3, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureGather/i32/alpha.wgsl.expected.wgsl b/test/intrinsics/textureGather/i32/alpha.wgsl.expected.wgsl
index 206d816..35d727c 100644
--- a/test/intrinsics/textureGather/i32/alpha.wgsl.expected.wgsl
+++ b/test/intrinsics/textureGather/i32/alpha.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(1), binding(0)]] var t : texture_2d<i32>;
+@group(1) @binding(0) var t : texture_2d<i32>;
 
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<i32> = textureGather(3, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureGather/i32/blue.wgsl b/test/intrinsics/textureGather/i32/blue.wgsl
index 13275af..396dd52 100644
--- a/test/intrinsics/textureGather/i32/blue.wgsl
+++ b/test/intrinsics/textureGather/i32/blue.wgsl
@@ -1,7 +1,7 @@
-[[group(1), binding(0)]] var t : texture_2d<i32>;
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(0) var t : texture_2d<i32>;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<i32> = textureGather(2, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureGather/i32/blue.wgsl.expected.wgsl b/test/intrinsics/textureGather/i32/blue.wgsl.expected.wgsl
index af7f095..116439f 100644
--- a/test/intrinsics/textureGather/i32/blue.wgsl.expected.wgsl
+++ b/test/intrinsics/textureGather/i32/blue.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(1), binding(0)]] var t : texture_2d<i32>;
+@group(1) @binding(0) var t : texture_2d<i32>;
 
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<i32> = textureGather(2, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureGather/i32/green.wgsl b/test/intrinsics/textureGather/i32/green.wgsl
index ecf2d65..ee162d1 100644
--- a/test/intrinsics/textureGather/i32/green.wgsl
+++ b/test/intrinsics/textureGather/i32/green.wgsl
@@ -1,7 +1,7 @@
-[[group(1), binding(0)]] var t : texture_2d<i32>;
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(0) var t : texture_2d<i32>;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<i32> = textureGather(1, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureGather/i32/green.wgsl.expected.wgsl b/test/intrinsics/textureGather/i32/green.wgsl.expected.wgsl
index 862c644..6f75122 100644
--- a/test/intrinsics/textureGather/i32/green.wgsl.expected.wgsl
+++ b/test/intrinsics/textureGather/i32/green.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(1), binding(0)]] var t : texture_2d<i32>;
+@group(1) @binding(0) var t : texture_2d<i32>;
 
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<i32> = textureGather(1, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureGather/i32/red.wgsl b/test/intrinsics/textureGather/i32/red.wgsl
index 1516eea..60117f7 100644
--- a/test/intrinsics/textureGather/i32/red.wgsl
+++ b/test/intrinsics/textureGather/i32/red.wgsl
@@ -1,7 +1,7 @@
-[[group(1), binding(0)]] var t : texture_2d<i32>;
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(0) var t : texture_2d<i32>;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<i32> = textureGather(0, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureGather/i32/red.wgsl.expected.wgsl b/test/intrinsics/textureGather/i32/red.wgsl.expected.wgsl
index 7a505f6..c2552b0 100644
--- a/test/intrinsics/textureGather/i32/red.wgsl.expected.wgsl
+++ b/test/intrinsics/textureGather/i32/red.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(1), binding(0)]] var t : texture_2d<i32>;
+@group(1) @binding(0) var t : texture_2d<i32>;
 
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<i32> = textureGather(0, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureGather/u32/alpha.wgsl b/test/intrinsics/textureGather/u32/alpha.wgsl
index 9aeef80..adcc5fd 100644
--- a/test/intrinsics/textureGather/u32/alpha.wgsl
+++ b/test/intrinsics/textureGather/u32/alpha.wgsl
@@ -1,7 +1,7 @@
-[[group(1), binding(0)]] var t : texture_2d<u32>;
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(0) var t : texture_2d<u32>;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<u32> = textureGather(3, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureGather/u32/alpha.wgsl.expected.wgsl b/test/intrinsics/textureGather/u32/alpha.wgsl.expected.wgsl
index fc21f33..496586d 100644
--- a/test/intrinsics/textureGather/u32/alpha.wgsl.expected.wgsl
+++ b/test/intrinsics/textureGather/u32/alpha.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(1), binding(0)]] var t : texture_2d<u32>;
+@group(1) @binding(0) var t : texture_2d<u32>;
 
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<u32> = textureGather(3, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureGather/u32/blue.wgsl b/test/intrinsics/textureGather/u32/blue.wgsl
index 9751b7c..30e266c 100644
--- a/test/intrinsics/textureGather/u32/blue.wgsl
+++ b/test/intrinsics/textureGather/u32/blue.wgsl
@@ -1,7 +1,7 @@
-[[group(1), binding(0)]] var t : texture_2d<u32>;
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(0) var t : texture_2d<u32>;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<u32> = textureGather(2, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureGather/u32/blue.wgsl.expected.wgsl b/test/intrinsics/textureGather/u32/blue.wgsl.expected.wgsl
index 5fdeb7e..eb2c3e1 100644
--- a/test/intrinsics/textureGather/u32/blue.wgsl.expected.wgsl
+++ b/test/intrinsics/textureGather/u32/blue.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(1), binding(0)]] var t : texture_2d<u32>;
+@group(1) @binding(0) var t : texture_2d<u32>;
 
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<u32> = textureGather(2, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureGather/u32/green.wgsl b/test/intrinsics/textureGather/u32/green.wgsl
index 83edac0..5b9ae18 100644
--- a/test/intrinsics/textureGather/u32/green.wgsl
+++ b/test/intrinsics/textureGather/u32/green.wgsl
@@ -1,7 +1,7 @@
-[[group(1), binding(0)]] var t : texture_2d<u32>;
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(0) var t : texture_2d<u32>;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<u32> = textureGather(1, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureGather/u32/green.wgsl.expected.wgsl b/test/intrinsics/textureGather/u32/green.wgsl.expected.wgsl
index 17b8423..935c1e2 100644
--- a/test/intrinsics/textureGather/u32/green.wgsl.expected.wgsl
+++ b/test/intrinsics/textureGather/u32/green.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(1), binding(0)]] var t : texture_2d<u32>;
+@group(1) @binding(0) var t : texture_2d<u32>;
 
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<u32> = textureGather(1, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureGather/u32/red.wgsl b/test/intrinsics/textureGather/u32/red.wgsl
index e3ca7f8..70ec158 100644
--- a/test/intrinsics/textureGather/u32/red.wgsl
+++ b/test/intrinsics/textureGather/u32/red.wgsl
@@ -1,7 +1,7 @@
-[[group(1), binding(0)]] var t : texture_2d<u32>;
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(0) var t : texture_2d<u32>;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<u32> = textureGather(0, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureGather/u32/red.wgsl.expected.wgsl b/test/intrinsics/textureGather/u32/red.wgsl.expected.wgsl
index d3b2be8..528958d 100644
--- a/test/intrinsics/textureGather/u32/red.wgsl.expected.wgsl
+++ b/test/intrinsics/textureGather/u32/red.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(1), binding(0)]] var t : texture_2d<u32>;
+@group(1) @binding(0) var t : texture_2d<u32>;
 
-[[group(1), binding(1)]] var s : sampler;
+@group(1) @binding(1) var s : sampler;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   var res : vec4<u32> = textureGather(0, t, s, vec2<f32>());
 }
diff --git a/test/intrinsics/textureLoad/depth_ms.spvasm.expected.wgsl b/test/intrinsics/textureLoad/depth_ms.spvasm.expected.wgsl
index 13f9223..7590a16 100644
--- a/test/intrinsics/textureLoad/depth_ms.spvasm.expected.wgsl
+++ b/test/intrinsics/textureLoad/depth_ms.spvasm.expected.wgsl
@@ -1,4 +1,4 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_multisampled_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_multisampled_2d;
 
 var<private> tint_symbol_1 : vec4<f32> = vec4<f32>();
 
@@ -21,11 +21,11 @@
 }
 
 struct vertex_main_out {
-  [[builtin(position)]]
+  @builtin(position)
   tint_symbol_1_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vertex_main() -> vertex_main_out {
   vertex_main_1();
   return vertex_main_out(tint_symbol_1);
@@ -36,7 +36,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fragment_main_1();
 }
@@ -46,7 +46,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn compute_main() {
   compute_main_1();
 }
diff --git a/test/intrinsics/textureNumSamples/depth_ms.spvasm.expected.wgsl b/test/intrinsics/textureNumSamples/depth_ms.spvasm.expected.wgsl
index bafa3a8..deac9d0 100644
--- a/test/intrinsics/textureNumSamples/depth_ms.spvasm.expected.wgsl
+++ b/test/intrinsics/textureNumSamples/depth_ms.spvasm.expected.wgsl
@@ -1,4 +1,4 @@
-[[group(1), binding(0)]] var arg_0 : texture_depth_multisampled_2d;
+@group(1) @binding(0) var arg_0 : texture_depth_multisampled_2d;
 
 var<private> tint_symbol_1 : vec4<f32> = vec4<f32>();
 
@@ -21,11 +21,11 @@
 }
 
 struct vertex_main_out {
-  [[builtin(position)]]
+  @builtin(position)
   tint_symbol_1_1 : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vertex_main() -> vertex_main_out {
   vertex_main_1();
   return vertex_main_out(tint_symbol_1);
@@ -36,7 +36,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn fragment_main() {
   fragment_main_1();
 }
@@ -46,7 +46,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn compute_main() {
   compute_main_1();
 }
diff --git a/test/layout/storage/mat2x2/f32.wgsl b/test/layout/storage/mat2x2/f32.wgsl
index 2be17c3..3b2c0bf 100644
--- a/test/layout/storage/mat2x2/f32.wgsl
+++ b/test/layout/storage/mat2x2/f32.wgsl
@@ -1,9 +1,9 @@
 struct SSBO {
   m : mat2x2<f32>;
 };
-[[group(0), binding(0)]] var<storage, read_write> ssbo : SSBO;
+@group(0) @binding(0) var<storage, read_write> ssbo : SSBO;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     let v = ssbo.m;
     ssbo.m = v;
diff --git a/test/layout/storage/mat2x2/f32.wgsl.expected.wgsl b/test/layout/storage/mat2x2/f32.wgsl.expected.wgsl
index 9933db6..2cdd7f6 100644
--- a/test/layout/storage/mat2x2/f32.wgsl.expected.wgsl
+++ b/test/layout/storage/mat2x2/f32.wgsl.expected.wgsl
@@ -2,9 +2,9 @@
   m : mat2x2<f32>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> ssbo : SSBO;
+@group(0) @binding(0) var<storage, read_write> ssbo : SSBO;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   let v = ssbo.m;
   ssbo.m = v;
diff --git a/test/layout/storage/mat2x2/stride/16.spvasm.expected.wgsl b/test/layout/storage/mat2x2/stride/16.spvasm.expected.wgsl
index ffb157a..a368ee1 100644
--- a/test/layout/storage/mat2x2/stride/16.spvasm.expected.wgsl
+++ b/test/layout/storage/mat2x2/stride/16.spvasm.expected.wgsl
@@ -1,15 +1,15 @@
 struct SSBO {
-  m : [[stride(16)]] array<vec2<f32>, 2u>;
+  m : @stride(16) array<vec2<f32>, 2u>;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> ssbo : SSBO;
+@group(0) @binding(0) var<storage, read_write> ssbo : SSBO;
 
-fn arr_to_mat2x2_stride_16(arr : [[stride(16)]] array<vec2<f32>, 2u>) -> mat2x2<f32> {
+fn arr_to_mat2x2_stride_16(arr : @stride(16) array<vec2<f32>, 2u>) -> mat2x2<f32> {
   return mat2x2<f32>(arr[0u], arr[1u]);
 }
 
-fn mat2x2_stride_16_to_arr(mat : mat2x2<f32>) -> [[stride(16)]] array<vec2<f32>, 2u> {
-  return [[stride(16)]] array<vec2<f32>, 2u>(mat[0u], mat[1u]);
+fn mat2x2_stride_16_to_arr(mat : mat2x2<f32>) -> @stride(16) array<vec2<f32>, 2u> {
+  return @stride(16) array<vec2<f32>, 2u>(mat[0u], mat[1u]);
 }
 
 fn f_1() {
@@ -18,7 +18,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn f() {
   f_1();
 }
diff --git a/test/let/global/global.wgsl b/test/let/global/global.wgsl
index 7928f9b..1dd906d 100644
--- a/test/let/global/global.wgsl
+++ b/test/let/global/global.wgsl
@@ -18,7 +18,7 @@
 let v8 = MyStruct();

 let v9 = MyArray();

 

-[[stage(fragment)]]

-fn main() -> [[location(0)]] vec4<f32> {

+@stage(fragment)

+fn main() -> @location(0) vec4<f32> {

     return vec4<f32>(0.0,0.0,0.0,0.0);

 }

diff --git a/test/let/global/global.wgsl.expected.wgsl b/test/let/global/global.wgsl.expected.wgsl
index 68c5ae5..60a1e36 100644
--- a/test/let/global/global.wgsl.expected.wgsl
+++ b/test/let/global/global.wgsl.expected.wgsl
@@ -22,7 +22,7 @@
 
 let v9 = MyArray();
 
-[[stage(fragment)]]
-fn main() -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main() -> @location(0) vec4<f32> {
   return vec4<f32>(0.0, 0.0, 0.0, 0.0);
 }
diff --git a/test/let/inferred/function.wgsl b/test/let/inferred/function.wgsl
index 15fc9fa..cb66845 100644
--- a/test/let/inferred/function.wgsl
+++ b/test/let/inferred/function.wgsl
@@ -33,7 +33,7 @@
     let v15 = ret_MyArray();

 }

 

-[[stage(fragment)]]

-fn main() -> [[location(0)]] vec4<f32> {

+@stage(fragment)

+fn main() -> @location(0) vec4<f32> {

     return vec4<f32>(0.0,0.0,0.0,0.0);

 }

diff --git a/test/let/inferred/function.wgsl.expected.wgsl b/test/let/inferred/function.wgsl.expected.wgsl
index 4f5b69a..e2f4653 100644
--- a/test/let/inferred/function.wgsl.expected.wgsl
+++ b/test/let/inferred/function.wgsl.expected.wgsl
@@ -42,7 +42,7 @@
   let v15 = ret_MyArray();
 }
 
-[[stage(fragment)]]
-fn main() -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main() -> @location(0) vec4<f32> {
   return vec4<f32>(0.0, 0.0, 0.0, 0.0);
 }
diff --git a/test/loops/continue_in_switch.wgsl b/test/loops/continue_in_switch.wgsl
index a08c7dd..b523874 100644
--- a/test/loops/continue_in_switch.wgsl
+++ b/test/loops/continue_in_switch.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     for (var i : i32 = 0; i < 4; i = i + 1) {
         switch(i) {
diff --git a/test/loops/continue_in_switch.wgsl.expected.wgsl b/test/loops/continue_in_switch.wgsl.expected.wgsl
index 0d375d4..ab9a029 100644
--- a/test/loops/continue_in_switch.wgsl.expected.wgsl
+++ b/test/loops/continue_in_switch.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   for(var i : i32 = 0; (i < 4); i = (i + 1)) {
     switch(i) {
diff --git a/test/ptr_ref/access/matrix.spvasm.expected.wgsl b/test/ptr_ref/access/matrix.spvasm.expected.wgsl
index 54e50e7..45ab66f 100644
--- a/test/ptr_ref/access/matrix.spvasm.expected.wgsl
+++ b/test/ptr_ref/access/matrix.spvasm.expected.wgsl
@@ -5,7 +5,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/ptr_ref/access/matrix.wgsl b/test/ptr_ref/access/matrix.wgsl
index 1347133..a085846 100644
--- a/test/ptr_ref/access/matrix.wgsl
+++ b/test/ptr_ref/access/matrix.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var m : mat3x3<f32> = mat3x3<f32>(vec3<f32>(1., 2., 3.), vec3<f32>(4., 5., 6.), vec3<f32>(7., 8., 9.));
   let v : ptr<function, vec3<f32>> = &m[1];
diff --git a/test/ptr_ref/access/matrix.wgsl.expected.wgsl b/test/ptr_ref/access/matrix.wgsl.expected.wgsl
index 8356471..110e6e6 100644
--- a/test/ptr_ref/access/matrix.wgsl.expected.wgsl
+++ b/test/ptr_ref/access/matrix.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var m : mat3x3<f32> = mat3x3<f32>(vec3<f32>(1.0, 2.0, 3.0), vec3<f32>(4.0, 5.0, 6.0), vec3<f32>(7.0, 8.0, 9.0));
   let v : ptr<function, vec3<f32>> = &(m[1]);
diff --git a/test/ptr_ref/copy/ptr_copy.spvasm.expected.wgsl b/test/ptr_ref/copy/ptr_copy.spvasm.expected.wgsl
index 512d5c8..82d9c5a 100644
--- a/test/ptr_ref/copy/ptr_copy.spvasm.expected.wgsl
+++ b/test/ptr_ref/copy/ptr_copy.spvasm.expected.wgsl
@@ -5,7 +5,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/ptr_ref/load/global/i32.spvasm.expected.wgsl b/test/ptr_ref/load/global/i32.spvasm.expected.wgsl
index 2f193e8..fa2c115 100644
--- a/test/ptr_ref/load/global/i32.spvasm.expected.wgsl
+++ b/test/ptr_ref/load/global/i32.spvasm.expected.wgsl
@@ -6,7 +6,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/ptr_ref/load/global/i32.wgsl b/test/ptr_ref/load/global/i32.wgsl
index b0e73b6..4f620cf 100644
--- a/test/ptr_ref/load/global/i32.wgsl
+++ b/test/ptr_ref/load/global/i32.wgsl
@@ -1,6 +1,6 @@
 var<private> I : i32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let i : i32 = I;
   let use : i32 = i + 1;
diff --git a/test/ptr_ref/load/global/i32.wgsl.expected.wgsl b/test/ptr_ref/load/global/i32.wgsl.expected.wgsl
index e3d286d..5e1feea 100644
--- a/test/ptr_ref/load/global/i32.wgsl.expected.wgsl
+++ b/test/ptr_ref/load/global/i32.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
 var<private> I : i32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let i : i32 = I;
   let use : i32 = (i + 1);
diff --git a/test/ptr_ref/load/global/struct_field.spvasm.expected.wgsl b/test/ptr_ref/load/global/struct_field.spvasm.expected.wgsl
index 67eba57..6d6d8e6 100644
--- a/test/ptr_ref/load/global/struct_field.spvasm.expected.wgsl
+++ b/test/ptr_ref/load/global/struct_field.spvasm.expected.wgsl
@@ -11,7 +11,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/ptr_ref/load/global/struct_field.wgsl b/test/ptr_ref/load/global/struct_field.wgsl
index 074fe80..e4341ca 100644
--- a/test/ptr_ref/load/global/struct_field.wgsl
+++ b/test/ptr_ref/load/global/struct_field.wgsl
@@ -4,7 +4,7 @@
 
 var<private> V : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let i : i32 = V.i;
 }
diff --git a/test/ptr_ref/load/global/struct_field.wgsl.expected.wgsl b/test/ptr_ref/load/global/struct_field.wgsl.expected.wgsl
index d0b3e34..59395f9 100644
--- a/test/ptr_ref/load/global/struct_field.wgsl.expected.wgsl
+++ b/test/ptr_ref/load/global/struct_field.wgsl.expected.wgsl
@@ -4,7 +4,7 @@
 
 var<private> V : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let i : i32 = V.i;
 }
diff --git a/test/ptr_ref/load/local/i32.spvasm.expected.wgsl b/test/ptr_ref/load/local/i32.spvasm.expected.wgsl
index 89d3a08..22952b8 100644
--- a/test/ptr_ref/load/local/i32.spvasm.expected.wgsl
+++ b/test/ptr_ref/load/local/i32.spvasm.expected.wgsl
@@ -6,7 +6,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/ptr_ref/load/local/i32.wgsl b/test/ptr_ref/load/local/i32.wgsl
index f01042b..6c30f81 100644
--- a/test/ptr_ref/load/local/i32.wgsl
+++ b/test/ptr_ref/load/local/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var i : i32 = 123;
   let use : i32 = i + 1;
diff --git a/test/ptr_ref/load/local/i32.wgsl.expected.wgsl b/test/ptr_ref/load/local/i32.wgsl.expected.wgsl
index d08fa3d..587375e 100644
--- a/test/ptr_ref/load/local/i32.wgsl.expected.wgsl
+++ b/test/ptr_ref/load/local/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var i : i32 = 123;
   let use : i32 = (i + 1);
diff --git a/test/ptr_ref/load/local/ptr_function.wgsl b/test/ptr_ref/load/local/ptr_function.wgsl
index df53774..ddaafb2 100644
--- a/test/ptr_ref/load/local/ptr_function.wgsl
+++ b/test/ptr_ref/load/local/ptr_function.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var i : i32 = 123;
   let p : ptr<function, i32> = &i;
diff --git a/test/ptr_ref/load/local/ptr_function.wgsl.expected.wgsl b/test/ptr_ref/load/local/ptr_function.wgsl.expected.wgsl
index 4bd46dd..e29289c 100644
--- a/test/ptr_ref/load/local/ptr_function.wgsl.expected.wgsl
+++ b/test/ptr_ref/load/local/ptr_function.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var i : i32 = 123;
   let p : ptr<function, i32> = &(i);
diff --git a/test/ptr_ref/load/local/ptr_private.wgsl b/test/ptr_ref/load/local/ptr_private.wgsl
index b9d231f..0f59ad5 100644
--- a/test/ptr_ref/load/local/ptr_private.wgsl
+++ b/test/ptr_ref/load/local/ptr_private.wgsl
@@ -1,6 +1,6 @@
 var<private> i : i32 = 123;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let p : ptr<private, i32> = &i;
   let use : i32 = *p + 1;
diff --git a/test/ptr_ref/load/local/ptr_private.wgsl.expected.wgsl b/test/ptr_ref/load/local/ptr_private.wgsl.expected.wgsl
index 4c92811..9b77f46 100644
--- a/test/ptr_ref/load/local/ptr_private.wgsl.expected.wgsl
+++ b/test/ptr_ref/load/local/ptr_private.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
 var<private> i : i32 = 123;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let p : ptr<private, i32> = &(i);
   let use : i32 = (*(p) + 1);
diff --git a/test/ptr_ref/load/local/ptr_storage.wgsl b/test/ptr_ref/load/local/ptr_storage.wgsl
index 1b1bfba..e50f835 100644
--- a/test/ptr_ref/load/local/ptr_storage.wgsl
+++ b/test/ptr_ref/load/local/ptr_storage.wgsl
@@ -2,10 +2,10 @@
   a : i32;
 };
 
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<storage, read_write> v : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let p : ptr<storage, i32, read_write> = &v.a;
   let use : i32 = *p + 1;
diff --git a/test/ptr_ref/load/local/ptr_storage.wgsl.expected.wgsl b/test/ptr_ref/load/local/ptr_storage.wgsl.expected.wgsl
index 3111c5f..ecef085 100644
--- a/test/ptr_ref/load/local/ptr_storage.wgsl.expected.wgsl
+++ b/test/ptr_ref/load/local/ptr_storage.wgsl.expected.wgsl
@@ -2,9 +2,9 @@
   a : i32;
 }
 
-[[group(0), binding(0)]] var<storage, read_write> v : S;
+@group(0) @binding(0) var<storage, read_write> v : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let p : ptr<storage, i32, read_write> = &(v.a);
   let use : i32 = (*(p) + 1);
diff --git a/test/ptr_ref/load/local/ptr_uniform.wgsl b/test/ptr_ref/load/local/ptr_uniform.wgsl
index 1d0e355..49328ac 100644
--- a/test/ptr_ref/load/local/ptr_uniform.wgsl
+++ b/test/ptr_ref/load/local/ptr_uniform.wgsl
@@ -2,10 +2,10 @@
   a : i32;
 };
 
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<uniform> v : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let p : ptr<uniform, i32> = &v.a;
   let use : i32 = *p + 1;
diff --git a/test/ptr_ref/load/local/ptr_uniform.wgsl.expected.wgsl b/test/ptr_ref/load/local/ptr_uniform.wgsl.expected.wgsl
index b6f8628..dabfd63 100644
--- a/test/ptr_ref/load/local/ptr_uniform.wgsl.expected.wgsl
+++ b/test/ptr_ref/load/local/ptr_uniform.wgsl.expected.wgsl
@@ -2,9 +2,9 @@
   a : i32;
 }
 
-[[group(0), binding(0)]] var<uniform> v : S;
+@group(0) @binding(0) var<uniform> v : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let p : ptr<uniform, i32> = &(v.a);
   let use : i32 = (*(p) + 1);
diff --git a/test/ptr_ref/load/local/ptr_workgroup.wgsl b/test/ptr_ref/load/local/ptr_workgroup.wgsl
index eb7dae9..269caa5 100644
--- a/test/ptr_ref/load/local/ptr_workgroup.wgsl
+++ b/test/ptr_ref/load/local/ptr_workgroup.wgsl
@@ -1,6 +1,6 @@
 var<workgroup> i : i32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   i = 123;
   let p : ptr<workgroup, i32> = &i;
diff --git a/test/ptr_ref/load/local/ptr_workgroup.wgsl.expected.wgsl b/test/ptr_ref/load/local/ptr_workgroup.wgsl.expected.wgsl
index cf84d58..39ea1f5 100644
--- a/test/ptr_ref/load/local/ptr_workgroup.wgsl.expected.wgsl
+++ b/test/ptr_ref/load/local/ptr_workgroup.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
 var<workgroup> i : i32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   i = 123;
   let p : ptr<workgroup, i32> = &(i);
diff --git a/test/ptr_ref/load/local/struct_field.spvasm.expected.wgsl b/test/ptr_ref/load/local/struct_field.spvasm.expected.wgsl
index ea14750..9b15ec1 100644
--- a/test/ptr_ref/load/local/struct_field.spvasm.expected.wgsl
+++ b/test/ptr_ref/load/local/struct_field.spvasm.expected.wgsl
@@ -10,7 +10,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/ptr_ref/load/local/struct_field.wgsl b/test/ptr_ref/load/local/struct_field.wgsl
index 18aca63..60b9af5 100644
--- a/test/ptr_ref/load/local/struct_field.wgsl
+++ b/test/ptr_ref/load/local/struct_field.wgsl
@@ -2,7 +2,7 @@
   i : i32;
 };
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var V : S;
   var i : i32 = V.i;
diff --git a/test/ptr_ref/load/local/struct_field.wgsl.expected.wgsl b/test/ptr_ref/load/local/struct_field.wgsl.expected.wgsl
index 7bbcb5a..056bf95 100644
--- a/test/ptr_ref/load/local/struct_field.wgsl.expected.wgsl
+++ b/test/ptr_ref/load/local/struct_field.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   i : i32;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var V : S;
   var i : i32 = V.i;
diff --git a/test/ptr_ref/load/param/ptr.spvasm.expected.wgsl b/test/ptr_ref/load/param/ptr.spvasm.expected.wgsl
index 05c17cf..e8df997 100644
--- a/test/ptr_ref/load/param/ptr.spvasm.expected.wgsl
+++ b/test/ptr_ref/load/param/ptr.spvasm.expected.wgsl
@@ -11,7 +11,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/ptr_ref/load/param/ptr.wgsl b/test/ptr_ref/load/param/ptr.wgsl
index 3348240..1dfc928 100644
--- a/test/ptr_ref/load/param/ptr.wgsl
+++ b/test/ptr_ref/load/param/ptr.wgsl
@@ -2,7 +2,7 @@
   return value + *pointer;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var i : i32 = 123;
   let r : i32 = func(i, &i);
diff --git a/test/ptr_ref/load/param/ptr.wgsl.expected.wgsl b/test/ptr_ref/load/param/ptr.wgsl.expected.wgsl
index 812dfea..68c51db 100644
--- a/test/ptr_ref/load/param/ptr.wgsl.expected.wgsl
+++ b/test/ptr_ref/load/param/ptr.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   return (value + *(pointer));
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var i : i32 = 123;
   let r : i32 = func(i, &(i));
diff --git a/test/ptr_ref/store/global/i32.spvasm.expected.wgsl b/test/ptr_ref/store/global/i32.spvasm.expected.wgsl
index b48aa90..d50fc89 100644
--- a/test/ptr_ref/store/global/i32.spvasm.expected.wgsl
+++ b/test/ptr_ref/store/global/i32.spvasm.expected.wgsl
@@ -6,7 +6,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/ptr_ref/store/global/i32.wgsl b/test/ptr_ref/store/global/i32.wgsl
index 9254513..3a5c72e 100644
--- a/test/ptr_ref/store/global/i32.wgsl
+++ b/test/ptr_ref/store/global/i32.wgsl
@@ -1,6 +1,6 @@
 var<private> I : i32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   I = 123; // constant
   I = 100 + 20 + 3; // dynamic
diff --git a/test/ptr_ref/store/global/i32.wgsl.expected.wgsl b/test/ptr_ref/store/global/i32.wgsl.expected.wgsl
index 8b8367d..807c1cd 100644
--- a/test/ptr_ref/store/global/i32.wgsl.expected.wgsl
+++ b/test/ptr_ref/store/global/i32.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
 var<private> I : i32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   I = 123;
   I = ((100 + 20) + 3);
diff --git a/test/ptr_ref/store/global/struct_field.spvasm.expected.wgsl b/test/ptr_ref/store/global/struct_field.spvasm.expected.wgsl
index e70b574..7ed0977 100644
--- a/test/ptr_ref/store/global/struct_field.spvasm.expected.wgsl
+++ b/test/ptr_ref/store/global/struct_field.spvasm.expected.wgsl
@@ -9,7 +9,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/ptr_ref/store/local/i32.spvasm.expected.wgsl b/test/ptr_ref/store/local/i32.spvasm.expected.wgsl
index 64f3744..822c64b 100644
--- a/test/ptr_ref/store/local/i32.spvasm.expected.wgsl
+++ b/test/ptr_ref/store/local/i32.spvasm.expected.wgsl
@@ -6,7 +6,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/ptr_ref/store/local/i32.wgsl b/test/ptr_ref/store/local/i32.wgsl
index 77578a7..ea390b9 100644
--- a/test/ptr_ref/store/local/i32.wgsl
+++ b/test/ptr_ref/store/local/i32.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var i : i32 = 123;
   let p : ptr<function, i32> = &i;
diff --git a/test/ptr_ref/store/local/i32.wgsl.expected.wgsl b/test/ptr_ref/store/local/i32.wgsl.expected.wgsl
index 2690a1a..c5f03d5 100644
--- a/test/ptr_ref/store/local/i32.wgsl.expected.wgsl
+++ b/test/ptr_ref/store/local/i32.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var i : i32 = 123;
   let p : ptr<function, i32> = &(i);
diff --git a/test/ptr_ref/store/local/struct_field.spvasm.expected.wgsl b/test/ptr_ref/store/local/struct_field.spvasm.expected.wgsl
index b3b95df..bcc1680 100644
--- a/test/ptr_ref/store/local/struct_field.spvasm.expected.wgsl
+++ b/test/ptr_ref/store/local/struct_field.spvasm.expected.wgsl
@@ -8,7 +8,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/ptr_ref/store/param/ptr.spvasm.expected.wgsl b/test/ptr_ref/store/param/ptr.spvasm.expected.wgsl
index 30fdea1..c505b66 100644
--- a/test/ptr_ref/store/param/ptr.spvasm.expected.wgsl
+++ b/test/ptr_ref/store/param/ptr.spvasm.expected.wgsl
@@ -10,7 +10,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/ptr_ref/store/param/ptr.wgsl b/test/ptr_ref/store/param/ptr.wgsl
index f4225f0..b23ad6f 100644
--- a/test/ptr_ref/store/param/ptr.wgsl
+++ b/test/ptr_ref/store/param/ptr.wgsl
@@ -2,7 +2,7 @@
   *pointer = value;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var i : i32 = 123;
   func(123, &i);
diff --git a/test/ptr_ref/store/param/ptr.wgsl.expected.wgsl b/test/ptr_ref/store/param/ptr.wgsl.expected.wgsl
index 05d2d40..d9d6dbb 100644
--- a/test/ptr_ref/store/param/ptr.wgsl.expected.wgsl
+++ b/test/ptr_ref/store/param/ptr.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   *(pointer) = value;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var i : i32 = 123;
   func(123, &(i));
diff --git a/test/samples/compute_boids.wgsl b/test/samples/compute_boids.wgsl
index 53ea4c5..269ac5d 100644
--- a/test/samples/compute_boids.wgsl
+++ b/test/samples/compute_boids.wgsl
@@ -14,11 +14,11 @@
 
 // vertex shader
 
-[[stage(vertex)]]
-fn vert_main([[location(0)]] a_particlePos : vec2<f32>,
-             [[location(1)]] a_particleVel : vec2<f32>,
-             [[location(2)]] a_pos : vec2<f32>)
-          -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vert_main(@location(0) a_particlePos : vec2<f32>,
+             @location(1) a_particleVel : vec2<f32>,
+             @location(2) a_pos : vec2<f32>)
+          -> @builtin(position) vec4<f32> {
   var angle : f32 = -atan2(a_particleVel.x, a_particleVel.y);
   var pos : vec2<f32> = vec2<f32>(
       (a_pos.x * cos(angle)) - (a_pos.y * sin(angle)),
@@ -28,8 +28,8 @@
 
 // fragment shader
 
-[[stage(fragment)]]
-fn frag_main() -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn frag_main() -> @location(0) vec4<f32> {
   return vec4<f32>(1.0, 1.0, 1.0, 1.0);
 }
 
@@ -53,14 +53,14 @@
   particles : array<Particle, 5>;
 };
 
-[[binding(0), group(0)]] var<uniform> params : SimParams;
-[[binding(1), group(0)]] var<storage, read_write> particlesA : Particles;
-[[binding(2), group(0)]] var<storage, read_write> particlesB : Particles;
+@binding(0) @group(0) var<uniform> params : SimParams;
+@binding(1) @group(0) var<storage, read_write> particlesA : Particles;
+@binding(2) @group(0) var<storage, read_write> particlesB : Particles;
 
 // https://github.com/austinEng/Project6-Vulkan-Flocking/blob/master/data/shaders/computeparticles/particle.comp
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn comp_main(
-  [[builtin(global_invocation_id)]] gl_GlobalInvocationID : vec3<u32>) {
+  @builtin(global_invocation_id) gl_GlobalInvocationID : vec3<u32>) {
   var index : u32 = gl_GlobalInvocationID.x;
   if (index >= 5u) {
     return;
diff --git a/test/samples/compute_boids.wgsl.expected.wgsl b/test/samples/compute_boids.wgsl.expected.wgsl
index 394631c..5abf9fa 100644
--- a/test/samples/compute_boids.wgsl.expected.wgsl
+++ b/test/samples/compute_boids.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
-[[stage(vertex)]]
-fn vert_main([[location(0)]] a_particlePos : vec2<f32>, [[location(1)]] a_particleVel : vec2<f32>, [[location(2)]] a_pos : vec2<f32>) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vert_main(@location(0) a_particlePos : vec2<f32>, @location(1) a_particleVel : vec2<f32>, @location(2) a_pos : vec2<f32>) -> @builtin(position) vec4<f32> {
   var angle : f32 = -(atan2(a_particleVel.x, a_particleVel.y));
   var pos : vec2<f32> = vec2<f32>(((a_pos.x * cos(angle)) - (a_pos.y * sin(angle))), ((a_pos.x * sin(angle)) + (a_pos.y * cos(angle))));
   return vec4<f32>((pos + a_particlePos), 0.0, 1.0);
 }
 
-[[stage(fragment)]]
-fn frag_main() -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn frag_main() -> @location(0) vec4<f32> {
   return vec4<f32>(1.0, 1.0, 1.0, 1.0);
 }
 
@@ -29,14 +29,14 @@
   particles : array<Particle, 5>;
 }
 
-[[binding(0), group(0)]] var<uniform> params : SimParams;
+@binding(0) @group(0) var<uniform> params : SimParams;
 
-[[binding(1), group(0)]] var<storage, read_write> particlesA : Particles;
+@binding(1) @group(0) var<storage, read_write> particlesA : Particles;
 
-[[binding(2), group(0)]] var<storage, read_write> particlesB : Particles;
+@binding(2) @group(0) var<storage, read_write> particlesB : Particles;
 
-[[stage(compute), workgroup_size(1)]]
-fn comp_main([[builtin(global_invocation_id)]] gl_GlobalInvocationID : vec3<u32>) {
+@stage(compute) @workgroup_size(1)
+fn comp_main(@builtin(global_invocation_id) gl_GlobalInvocationID : vec3<u32>) {
   var index : u32 = gl_GlobalInvocationID.x;
   if ((index >= 5u)) {
     return;
diff --git a/test/samples/cube.wgsl b/test/samples/cube.wgsl
index 5b9fab1..93519e4 100644
--- a/test/samples/cube.wgsl
+++ b/test/samples/cube.wgsl
@@ -17,19 +17,19 @@
   modelViewProjectionMatrix : mat4x4<f32>;
 };
 
-[[binding(0), group(0)]] var<uniform> uniforms : Uniforms;
+@binding(0) @group(0) var<uniform> uniforms : Uniforms;
 
 struct VertexInput {
-  [[location(0)]] cur_position : vec4<f32>;
-  [[location(1)]] color : vec4<f32>;
+  @location(0) cur_position : vec4<f32>;
+  @location(1) color : vec4<f32>;
 };
 
 struct VertexOutput {
-  [[location(0)]] vtxFragColor : vec4<f32>;
-  [[builtin(position)]] Position : vec4<f32>;
+  @location(0) vtxFragColor : vec4<f32>;
+  @builtin(position) Position : vec4<f32>;
 };
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vtx_main(input : VertexInput) -> VertexOutput {
   var output : VertexOutput;
   output.Position = uniforms.modelViewProjectionMatrix * input.cur_position;
@@ -39,8 +39,8 @@
 
 // Fragment shader
 
-[[stage(fragment)]]
-fn frag_main([[location(0)]] fragColor : vec4<f32>)
-          -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn frag_main(@location(0) fragColor : vec4<f32>)
+          -> @location(0) vec4<f32> {
   return fragColor;
 }
diff --git a/test/samples/cube.wgsl.expected.wgsl b/test/samples/cube.wgsl.expected.wgsl
index a764703..ba0371f 100644
--- a/test/samples/cube.wgsl.expected.wgsl
+++ b/test/samples/cube.wgsl.expected.wgsl
@@ -2,23 +2,23 @@
   modelViewProjectionMatrix : mat4x4<f32>;
 }
 
-[[binding(0), group(0)]] var<uniform> uniforms : Uniforms;
+@binding(0) @group(0) var<uniform> uniforms : Uniforms;
 
 struct VertexInput {
-  [[location(0)]]
+  @location(0)
   cur_position : vec4<f32>;
-  [[location(1)]]
+  @location(1)
   color : vec4<f32>;
 }
 
 struct VertexOutput {
-  [[location(0)]]
+  @location(0)
   vtxFragColor : vec4<f32>;
-  [[builtin(position)]]
+  @builtin(position)
   Position : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vtx_main(input : VertexInput) -> VertexOutput {
   var output : VertexOutput;
   output.Position = (uniforms.modelViewProjectionMatrix * input.cur_position);
@@ -26,7 +26,7 @@
   return output;
 }
 
-[[stage(fragment)]]
-fn frag_main([[location(0)]] fragColor : vec4<f32>) -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn frag_main(@location(0) fragColor : vec4<f32>) -> @location(0) vec4<f32> {
   return fragColor;
 }
diff --git a/test/samples/function.wgsl b/test/samples/function.wgsl
index 257a664..92ffb04 100644
--- a/test/samples/function.wgsl
+++ b/test/samples/function.wgsl
@@ -16,6 +16,6 @@
     return ((2. * 3.) - 4.) / 5.;
 }
 
-[[stage(compute), workgroup_size(2)]]
+@stage(compute) @workgroup_size(2)
 fn ep() {
 }
diff --git a/test/samples/function.wgsl.expected.wgsl b/test/samples/function.wgsl.expected.wgsl
index 4cd4fb6..5a3a80c 100644
--- a/test/samples/function.wgsl.expected.wgsl
+++ b/test/samples/function.wgsl.expected.wgsl
@@ -2,6 +2,6 @@
   return (((2.0 * 3.0) - 4.0) / 5.0);
 }
 
-[[stage(compute), workgroup_size(2)]]
+@stage(compute) @workgroup_size(2)
 fn ep() {
 }
diff --git a/test/samples/simple.wgsl b/test/samples/simple.wgsl
index bec6a0f..d30b8a0 100644
--- a/test/samples/simple.wgsl
+++ b/test/samples/simple.wgsl
@@ -15,8 +15,8 @@
 fn bar() {
 }
 
-[[stage(fragment)]]
-fn main() -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main() -> @location(0) vec4<f32> {
     var a : vec2<f32> = vec2<f32>();
     bar();
     return vec4<f32>(0.4, 0.4, 0.8, 1.0);
diff --git a/test/samples/simple.wgsl.expected.wgsl b/test/samples/simple.wgsl.expected.wgsl
index b5a4dc0..83388f8 100644
--- a/test/samples/simple.wgsl.expected.wgsl
+++ b/test/samples/simple.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
 fn bar() {
 }
 
-[[stage(fragment)]]
-fn main() -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main() -> @location(0) vec4<f32> {
   var a : vec2<f32> = vec2<f32>();
   bar();
   return vec4<f32>(0.400000006, 0.400000006, 0.800000012, 1.0);
diff --git a/test/samples/simple_vertex.spvasm.expected.wgsl b/test/samples/simple_vertex.spvasm.expected.wgsl
index 372bb24..91ccaf9 100644
--- a/test/samples/simple_vertex.spvasm.expected.wgsl
+++ b/test/samples/simple_vertex.spvasm.expected.wgsl
@@ -6,11 +6,11 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main() -> main_out {
   main_1();
   return main_out(gl_Position);
diff --git a/test/samples/triangle.wgsl b/test/samples/triangle.wgsl
index ba3cb52..69d2281 100644
--- a/test/samples/triangle.wgsl
+++ b/test/samples/triangle.wgsl
@@ -18,14 +18,14 @@
     vec2<f32>(-0.5, -0.5),
     vec2<f32>(0.5, -0.5));
 
-[[stage(vertex)]]
-fn vtx_main([[builtin(vertex_index)]] VertexIndex : u32)
-         -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vtx_main(@builtin(vertex_index) VertexIndex : u32)
+         -> @builtin(position) vec4<f32> {
   return vec4<f32>(pos[VertexIndex], 0.0, 1.0);
 }
 
 // Fragment shader
-[[stage(fragment)]]
-fn frag_main() -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn frag_main() -> @location(0) vec4<f32> {
   return vec4<f32>(1.0, 0.0, 0.0, 1.0);
 }
diff --git a/test/samples/triangle.wgsl.expected.wgsl b/test/samples/triangle.wgsl.expected.wgsl
index bd398e0..c92f0a6 100644
--- a/test/samples/triangle.wgsl.expected.wgsl
+++ b/test/samples/triangle.wgsl.expected.wgsl
@@ -1,11 +1,11 @@
 let pos : array<vec2<f32>, 3> = array<vec2<f32>, 3>(vec2<f32>(0.0, 0.5), vec2<f32>(-0.5, -0.5), vec2<f32>(0.5, -0.5));
 
-[[stage(vertex)]]
-fn vtx_main([[builtin(vertex_index)]] VertexIndex : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn vtx_main(@builtin(vertex_index) VertexIndex : u32) -> @builtin(position) vec4<f32> {
   return vec4<f32>(pos[VertexIndex], 0.0, 1.0);
 }
 
-[[stage(fragment)]]
-fn frag_main() -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn frag_main() -> @location(0) vec4<f32> {
   return vec4<f32>(1.0, 0.0, 0.0, 1.0);
 }
diff --git a/test/shader_io/compute_input_builtins.wgsl b/test/shader_io/compute_input_builtins.wgsl
index 016ec31..77f209e 100644
--- a/test/shader_io/compute_input_builtins.wgsl
+++ b/test/shader_io/compute_input_builtins.wgsl
@@ -1,10 +1,10 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main(
-  [[builtin(local_invocation_id)]] local_invocation_id : vec3<u32>,
-  [[builtin(local_invocation_index)]] local_invocation_index : u32,
-  [[builtin(global_invocation_id)]] global_invocation_id : vec3<u32>,
-  [[builtin(workgroup_id)]] workgroup_id : vec3<u32>,
-  [[builtin(num_workgroups)]] num_workgroups : vec3<u32>,
+  @builtin(local_invocation_id) local_invocation_id : vec3<u32>,
+  @builtin(local_invocation_index) local_invocation_index : u32,
+  @builtin(global_invocation_id) global_invocation_id : vec3<u32>,
+  @builtin(workgroup_id) workgroup_id : vec3<u32>,
+  @builtin(num_workgroups) num_workgroups : vec3<u32>,
 ) {
   let foo : u32 =
     local_invocation_id.x +
diff --git a/test/shader_io/compute_input_builtins.wgsl.expected.wgsl b/test/shader_io/compute_input_builtins.wgsl.expected.wgsl
index 42c8adb..a1d3163 100644
--- a/test/shader_io/compute_input_builtins.wgsl.expected.wgsl
+++ b/test/shader_io/compute_input_builtins.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
-fn main([[builtin(local_invocation_id)]] local_invocation_id : vec3<u32>, [[builtin(local_invocation_index)]] local_invocation_index : u32, [[builtin(global_invocation_id)]] global_invocation_id : vec3<u32>, [[builtin(workgroup_id)]] workgroup_id : vec3<u32>, [[builtin(num_workgroups)]] num_workgroups : vec3<u32>) {
+@stage(compute) @workgroup_size(1)
+fn main(@builtin(local_invocation_id) local_invocation_id : vec3<u32>, @builtin(local_invocation_index) local_invocation_index : u32, @builtin(global_invocation_id) global_invocation_id : vec3<u32>, @builtin(workgroup_id) workgroup_id : vec3<u32>, @builtin(num_workgroups) num_workgroups : vec3<u32>) {
   let foo : u32 = ((((local_invocation_id.x + local_invocation_index) + global_invocation_id.x) + workgroup_id.x) + num_workgroups.x);
 }
diff --git a/test/shader_io/compute_input_builtins_struct.wgsl b/test/shader_io/compute_input_builtins_struct.wgsl
index c9691c9..968a1fa 100644
--- a/test/shader_io/compute_input_builtins_struct.wgsl
+++ b/test/shader_io/compute_input_builtins_struct.wgsl
@@ -1,12 +1,12 @@
 struct ComputeInputs {
-  [[builtin(local_invocation_id)]] local_invocation_id : vec3<u32>;
-  [[builtin(local_invocation_index)]] local_invocation_index : u32;
-  [[builtin(global_invocation_id)]] global_invocation_id : vec3<u32>;
-  [[builtin(workgroup_id)]] workgroup_id : vec3<u32>;
-  [[builtin(num_workgroups)]] num_workgroups : vec3<u32>;
+  @builtin(local_invocation_id) local_invocation_id : vec3<u32>;
+  @builtin(local_invocation_index) local_invocation_index : u32;
+  @builtin(global_invocation_id) global_invocation_id : vec3<u32>;
+  @builtin(workgroup_id) workgroup_id : vec3<u32>;
+  @builtin(num_workgroups) num_workgroups : vec3<u32>;
 };
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main(inputs : ComputeInputs) {
   let foo : u32 =
     inputs.local_invocation_id.x +
diff --git a/test/shader_io/compute_input_builtins_struct.wgsl.expected.wgsl b/test/shader_io/compute_input_builtins_struct.wgsl.expected.wgsl
index c3830ee..08660cc 100644
--- a/test/shader_io/compute_input_builtins_struct.wgsl.expected.wgsl
+++ b/test/shader_io/compute_input_builtins_struct.wgsl.expected.wgsl
@@ -1,17 +1,17 @@
 struct ComputeInputs {
-  [[builtin(local_invocation_id)]]
+  @builtin(local_invocation_id)
   local_invocation_id : vec3<u32>;
-  [[builtin(local_invocation_index)]]
+  @builtin(local_invocation_index)
   local_invocation_index : u32;
-  [[builtin(global_invocation_id)]]
+  @builtin(global_invocation_id)
   global_invocation_id : vec3<u32>;
-  [[builtin(workgroup_id)]]
+  @builtin(workgroup_id)
   workgroup_id : vec3<u32>;
-  [[builtin(num_workgroups)]]
+  @builtin(num_workgroups)
   num_workgroups : vec3<u32>;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main(inputs : ComputeInputs) {
   let foo : u32 = ((((inputs.local_invocation_id.x + inputs.local_invocation_index) + inputs.global_invocation_id.x) + inputs.workgroup_id.x) + inputs.num_workgroups.x);
 }
diff --git a/test/shader_io/compute_input_mixed.wgsl b/test/shader_io/compute_input_mixed.wgsl
index e49303c..b46ff00 100644
--- a/test/shader_io/compute_input_mixed.wgsl
+++ b/test/shader_io/compute_input_mixed.wgsl
@@ -1,20 +1,20 @@
 struct ComputeInputs0 {
-  [[builtin(local_invocation_id)]] local_invocation_id : vec3<u32>;
+  @builtin(local_invocation_id) local_invocation_id : vec3<u32>;
 };
 struct ComputeInputs1 {
-  [[builtin(workgroup_id)]] workgroup_id : vec3<u32>;
+  @builtin(workgroup_id) workgroup_id : vec3<u32>;
 };
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main(
   inputs0 : ComputeInputs0,
-  [[builtin(local_invocation_index)]] local_invocation_index : u32,
-  [[builtin(global_invocation_id)]] global_invocation_id : vec3<u32>,
+  @builtin(local_invocation_index) local_invocation_index : u32,
+  @builtin(global_invocation_id) global_invocation_id : vec3<u32>,
   inputs1 : ComputeInputs1,
 ) {
   let foo : u32 =
     inputs0.local_invocation_id.x +
-    local_invocation_index + 
-    global_invocation_id.x + 
+    local_invocation_index +
+    global_invocation_id.x +
     inputs1.workgroup_id.x;
 }
diff --git a/test/shader_io/compute_input_mixed.wgsl.expected.wgsl b/test/shader_io/compute_input_mixed.wgsl.expected.wgsl
index 369ae7f..56cd363 100644
--- a/test/shader_io/compute_input_mixed.wgsl.expected.wgsl
+++ b/test/shader_io/compute_input_mixed.wgsl.expected.wgsl
@@ -1,14 +1,14 @@
 struct ComputeInputs0 {
-  [[builtin(local_invocation_id)]]
+  @builtin(local_invocation_id)
   local_invocation_id : vec3<u32>;
 }
 
 struct ComputeInputs1 {
-  [[builtin(workgroup_id)]]
+  @builtin(workgroup_id)
   workgroup_id : vec3<u32>;
 }
 
-[[stage(compute), workgroup_size(1)]]
-fn main(inputs0 : ComputeInputs0, [[builtin(local_invocation_index)]] local_invocation_index : u32, [[builtin(global_invocation_id)]] global_invocation_id : vec3<u32>, inputs1 : ComputeInputs1) {
+@stage(compute) @workgroup_size(1)
+fn main(inputs0 : ComputeInputs0, @builtin(local_invocation_index) local_invocation_index : u32, @builtin(global_invocation_id) global_invocation_id : vec3<u32>, inputs1 : ComputeInputs1) {
   let foo : u32 = (((inputs0.local_invocation_id.x + local_invocation_index) + global_invocation_id.x) + inputs1.workgroup_id.x);
 }
diff --git a/test/shader_io/fragment_input_builtins.wgsl b/test/shader_io/fragment_input_builtins.wgsl
index 0395bfd..db717eb 100644
--- a/test/shader_io/fragment_input_builtins.wgsl
+++ b/test/shader_io/fragment_input_builtins.wgsl
@@ -1,9 +1,9 @@
-[[stage(fragment)]]
+@stage(fragment)
 fn main(
-  [[builtin(position)]] position : vec4<f32>,
-  [[builtin(front_facing)]] front_facing : bool,
-  [[builtin(sample_index)]] sample_index : u32,
-  [[builtin(sample_mask)]] sample_mask : u32,
+  @builtin(position) position : vec4<f32>,
+  @builtin(front_facing) front_facing : bool,
+  @builtin(sample_index) sample_index : u32,
+  @builtin(sample_mask) sample_mask : u32,
 ) {
   if (front_facing) {
     let foo : vec4<f32> = position;
diff --git a/test/shader_io/fragment_input_builtins.wgsl.expected.wgsl b/test/shader_io/fragment_input_builtins.wgsl.expected.wgsl
index cfad6db..92dfb41 100644
--- a/test/shader_io/fragment_input_builtins.wgsl.expected.wgsl
+++ b/test/shader_io/fragment_input_builtins.wgsl.expected.wgsl
@@ -1,5 +1,5 @@
-[[stage(fragment)]]
-fn main([[builtin(position)]] position : vec4<f32>, [[builtin(front_facing)]] front_facing : bool, [[builtin(sample_index)]] sample_index : u32, [[builtin(sample_mask)]] sample_mask : u32) {
+@stage(fragment)
+fn main(@builtin(position) position : vec4<f32>, @builtin(front_facing) front_facing : bool, @builtin(sample_index) sample_index : u32, @builtin(sample_mask) sample_mask : u32) {
   if (front_facing) {
     let foo : vec4<f32> = position;
     let bar : u32 = (sample_index + sample_mask);
diff --git a/test/shader_io/fragment_input_builtins_struct.wgsl b/test/shader_io/fragment_input_builtins_struct.wgsl
index af9e0d3..ba833db 100644
--- a/test/shader_io/fragment_input_builtins_struct.wgsl
+++ b/test/shader_io/fragment_input_builtins_struct.wgsl
@@ -1,11 +1,11 @@
 struct FragmentInputs {
-  [[builtin(position)]] position : vec4<f32>;
-  [[builtin(front_facing)]] front_facing : bool;
-  [[builtin(sample_index)]] sample_index : u32;
-  [[builtin(sample_mask)]] sample_mask : u32;
+  @builtin(position) position : vec4<f32>;
+  @builtin(front_facing) front_facing : bool;
+  @builtin(sample_index) sample_index : u32;
+  @builtin(sample_mask) sample_mask : u32;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main(inputs : FragmentInputs) {
   if (inputs.front_facing) {
     let foo : vec4<f32> = inputs.position;
diff --git a/test/shader_io/fragment_input_builtins_struct.wgsl.expected.wgsl b/test/shader_io/fragment_input_builtins_struct.wgsl.expected.wgsl
index 79ec5fd..5eddd12 100644
--- a/test/shader_io/fragment_input_builtins_struct.wgsl.expected.wgsl
+++ b/test/shader_io/fragment_input_builtins_struct.wgsl.expected.wgsl
@@ -1,15 +1,15 @@
 struct FragmentInputs {
-  [[builtin(position)]]
+  @builtin(position)
   position : vec4<f32>;
-  [[builtin(front_facing)]]
+  @builtin(front_facing)
   front_facing : bool;
-  [[builtin(sample_index)]]
+  @builtin(sample_index)
   sample_index : u32;
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   sample_mask : u32;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main(inputs : FragmentInputs) {
   if (inputs.front_facing) {
     let foo : vec4<f32> = inputs.position;
diff --git a/test/shader_io/fragment_input_locations.wgsl b/test/shader_io/fragment_input_locations.wgsl
index 0ed8e3c..b33cfe4 100644
--- a/test/shader_io/fragment_input_locations.wgsl
+++ b/test/shader_io/fragment_input_locations.wgsl
@@ -1,9 +1,9 @@
-[[stage(fragment)]]
+@stage(fragment)
 fn main(
-  [[location(0), interpolate(flat)]] loc0 : i32,
-  [[location(1), interpolate(flat)]] loc1 : u32,
-  [[location(2)]] loc2 : f32,
-  [[location(3)]] loc3 : vec4<f32>,
+  @location(0) @interpolate(flat) loc0 : i32,
+  @location(1) @interpolate(flat) loc1 : u32,
+  @location(2) loc2 : f32,
+  @location(3) loc3 : vec4<f32>,
 ) {
   let i : i32 = loc0;
   let u : u32 = loc1;
diff --git a/test/shader_io/fragment_input_locations.wgsl.expected.wgsl b/test/shader_io/fragment_input_locations.wgsl.expected.wgsl
index ce13406..a4cd502 100644
--- a/test/shader_io/fragment_input_locations.wgsl.expected.wgsl
+++ b/test/shader_io/fragment_input_locations.wgsl.expected.wgsl
@@ -1,5 +1,5 @@
-[[stage(fragment)]]
-fn main([[location(0), interpolate(flat)]] loc0 : i32, [[location(1), interpolate(flat)]] loc1 : u32, [[location(2)]] loc2 : f32, [[location(3)]] loc3 : vec4<f32>) {
+@stage(fragment)
+fn main(@location(0) @interpolate(flat) loc0 : i32, @location(1) @interpolate(flat) loc1 : u32, @location(2) loc2 : f32, @location(3) loc3 : vec4<f32>) {
   let i : i32 = loc0;
   let u : u32 = loc1;
   let f : f32 = loc2;
diff --git a/test/shader_io/fragment_input_locations_struct.wgsl b/test/shader_io/fragment_input_locations_struct.wgsl
index 03840c2..e5e4bd5 100644
--- a/test/shader_io/fragment_input_locations_struct.wgsl
+++ b/test/shader_io/fragment_input_locations_struct.wgsl
@@ -1,11 +1,11 @@
 struct FragmentInputs {
-  [[location(0), interpolate(flat)]] loc0 : i32;
-  [[location(1), interpolate(flat)]] loc1 : u32;
-  [[location(2)]] loc2 : f32;
-  [[location(3)]] loc3 : vec4<f32>;
+  @location(0) @interpolate(flat) loc0 : i32;
+  @location(1) @interpolate(flat) loc1 : u32;
+  @location(2) loc2 : f32;
+  @location(3) loc3 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main(inputs : FragmentInputs) {
   let i : i32 = inputs.loc0;
   let u : u32 = inputs.loc1;
diff --git a/test/shader_io/fragment_input_locations_struct.wgsl.expected.wgsl b/test/shader_io/fragment_input_locations_struct.wgsl.expected.wgsl
index 5179ec9..d4a9ebb 100644
--- a/test/shader_io/fragment_input_locations_struct.wgsl.expected.wgsl
+++ b/test/shader_io/fragment_input_locations_struct.wgsl.expected.wgsl
@@ -1,15 +1,15 @@
 struct FragmentInputs {
-  [[location(0), interpolate(flat)]]
+  @location(0) @interpolate(flat)
   loc0 : i32;
-  [[location(1), interpolate(flat)]]
+  @location(1) @interpolate(flat)
   loc1 : u32;
-  [[location(2)]]
+  @location(2)
   loc2 : f32;
-  [[location(3)]]
+  @location(3)
   loc3 : vec4<f32>;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main(inputs : FragmentInputs) {
   let i : i32 = inputs.loc0;
   let u : u32 = inputs.loc1;
diff --git a/test/shader_io/fragment_input_mixed.wgsl b/test/shader_io/fragment_input_mixed.wgsl
index 62e1312..2bbc728 100644
--- a/test/shader_io/fragment_input_mixed.wgsl
+++ b/test/shader_io/fragment_input_mixed.wgsl
@@ -1,20 +1,20 @@
 struct FragmentInputs0 {
-  [[builtin(position)]] position : vec4<f32>;
-  [[location(0), interpolate(flat)]] loc0 : i32;
+  @builtin(position) position : vec4<f32>;
+  @location(0) @interpolate(flat) loc0 : i32;
 };
 struct FragmentInputs1 {
-  [[location(3)]] loc3 : vec4<f32>;
-  [[builtin(sample_mask)]] sample_mask : u32;
+  @location(3) loc3 : vec4<f32>;
+  @builtin(sample_mask) sample_mask : u32;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main(
   inputs0 : FragmentInputs0,
-  [[builtin(front_facing)]] front_facing : bool,
-  [[location(1), interpolate(flat)]] loc1 : u32,
-  [[builtin(sample_index)]] sample_index : u32,
+  @builtin(front_facing) front_facing : bool,
+  @location(1) @interpolate(flat) loc1 : u32,
+  @builtin(sample_index) sample_index : u32,
   inputs1 : FragmentInputs1,
-  [[location(2)]] loc2 : f32,
+  @location(2) loc2 : f32,
 ) {
   if (front_facing) {
     let foo : vec4<f32> = inputs0.position;
diff --git a/test/shader_io/fragment_input_mixed.wgsl.expected.wgsl b/test/shader_io/fragment_input_mixed.wgsl.expected.wgsl
index bca1e79..78911e6 100644
--- a/test/shader_io/fragment_input_mixed.wgsl.expected.wgsl
+++ b/test/shader_io/fragment_input_mixed.wgsl.expected.wgsl
@@ -1,19 +1,19 @@
 struct FragmentInputs0 {
-  [[builtin(position)]]
+  @builtin(position)
   position : vec4<f32>;
-  [[location(0), interpolate(flat)]]
+  @location(0) @interpolate(flat)
   loc0 : i32;
 }
 
 struct FragmentInputs1 {
-  [[location(3)]]
+  @location(3)
   loc3 : vec4<f32>;
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   sample_mask : u32;
 }
 
-[[stage(fragment)]]
-fn main(inputs0 : FragmentInputs0, [[builtin(front_facing)]] front_facing : bool, [[location(1), interpolate(flat)]] loc1 : u32, [[builtin(sample_index)]] sample_index : u32, inputs1 : FragmentInputs1, [[location(2)]] loc2 : f32) {
+@stage(fragment)
+fn main(inputs0 : FragmentInputs0, @builtin(front_facing) front_facing : bool, @location(1) @interpolate(flat) loc1 : u32, @builtin(sample_index) sample_index : u32, inputs1 : FragmentInputs1, @location(2) loc2 : f32) {
   if (front_facing) {
     let foo : vec4<f32> = inputs0.position;
     let bar : u32 = (sample_index + inputs1.sample_mask);
diff --git a/test/shader_io/fragment_output_builtins.wgsl b/test/shader_io/fragment_output_builtins.wgsl
index 462cb77..914cbad 100644
--- a/test/shader_io/fragment_output_builtins.wgsl
+++ b/test/shader_io/fragment_output_builtins.wgsl
@@ -1,9 +1,9 @@
-[[stage(fragment)]]
-fn main1() -> [[builtin(frag_depth)]] f32 {
+@stage(fragment)
+fn main1() -> @builtin(frag_depth) f32 {
   return 1.0;
 }
 
-[[stage(fragment)]]
-fn main2() -> [[builtin(sample_mask)]] u32 {
+@stage(fragment)
+fn main2() -> @builtin(sample_mask) u32 {
   return 1u;
 }
diff --git a/test/shader_io/fragment_output_builtins.wgsl.expected.wgsl b/test/shader_io/fragment_output_builtins.wgsl.expected.wgsl
index 462cb77..914cbad 100644
--- a/test/shader_io/fragment_output_builtins.wgsl.expected.wgsl
+++ b/test/shader_io/fragment_output_builtins.wgsl.expected.wgsl
@@ -1,9 +1,9 @@
-[[stage(fragment)]]
-fn main1() -> [[builtin(frag_depth)]] f32 {
+@stage(fragment)
+fn main1() -> @builtin(frag_depth) f32 {
   return 1.0;
 }
 
-[[stage(fragment)]]
-fn main2() -> [[builtin(sample_mask)]] u32 {
+@stage(fragment)
+fn main2() -> @builtin(sample_mask) u32 {
   return 1u;
 }
diff --git a/test/shader_io/fragment_output_builtins_struct.wgsl b/test/shader_io/fragment_output_builtins_struct.wgsl
index d7b37f8..a67765f 100644
--- a/test/shader_io/fragment_output_builtins_struct.wgsl
+++ b/test/shader_io/fragment_output_builtins_struct.wgsl
@@ -1,9 +1,9 @@
 struct FragmentOutputs {
-  [[builtin(frag_depth)]] frag_depth : f32;
-  [[builtin(sample_mask)]] sample_mask : u32;
+  @builtin(frag_depth) frag_depth : f32;
+  @builtin(sample_mask) sample_mask : u32;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> FragmentOutputs {
   return FragmentOutputs(1.0, 1u);
 }
diff --git a/test/shader_io/fragment_output_builtins_struct.wgsl.expected.wgsl b/test/shader_io/fragment_output_builtins_struct.wgsl.expected.wgsl
index e87f857..86551d3 100644
--- a/test/shader_io/fragment_output_builtins_struct.wgsl.expected.wgsl
+++ b/test/shader_io/fragment_output_builtins_struct.wgsl.expected.wgsl
@@ -1,11 +1,11 @@
 struct FragmentOutputs {
-  [[builtin(frag_depth)]]
+  @builtin(frag_depth)
   frag_depth : f32;
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   sample_mask : u32;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> FragmentOutputs {
   return FragmentOutputs(1.0, 1u);
 }
diff --git a/test/shader_io/fragment_output_locations.wgsl b/test/shader_io/fragment_output_locations.wgsl
index b5858e8..239589d 100644
--- a/test/shader_io/fragment_output_locations.wgsl
+++ b/test/shader_io/fragment_output_locations.wgsl
@@ -1,19 +1,19 @@
-[[stage(fragment)]]
-fn main0() -> [[location(0)]] i32 {
+@stage(fragment)
+fn main0() -> @location(0) i32 {
   return 1;
 }
 
-[[stage(fragment)]]
-fn main1() -> [[location(1)]] u32 {
+@stage(fragment)
+fn main1() -> @location(1) u32 {
   return 1u;
 }
 
-[[stage(fragment)]]
-fn main2() -> [[location(2)]] f32 {
+@stage(fragment)
+fn main2() -> @location(2) f32 {
   return 1.0;
 }
 
-[[stage(fragment)]]
-fn main3() -> [[location(3)]] vec4<f32> {
+@stage(fragment)
+fn main3() -> @location(3) vec4<f32> {
   return vec4<f32>(1.0, 2.0, 3.0, 4.0);
 }
diff --git a/test/shader_io/fragment_output_locations.wgsl.expected.wgsl b/test/shader_io/fragment_output_locations.wgsl.expected.wgsl
index b5858e8..239589d 100644
--- a/test/shader_io/fragment_output_locations.wgsl.expected.wgsl
+++ b/test/shader_io/fragment_output_locations.wgsl.expected.wgsl
@@ -1,19 +1,19 @@
-[[stage(fragment)]]
-fn main0() -> [[location(0)]] i32 {
+@stage(fragment)
+fn main0() -> @location(0) i32 {
   return 1;
 }
 
-[[stage(fragment)]]
-fn main1() -> [[location(1)]] u32 {
+@stage(fragment)
+fn main1() -> @location(1) u32 {
   return 1u;
 }
 
-[[stage(fragment)]]
-fn main2() -> [[location(2)]] f32 {
+@stage(fragment)
+fn main2() -> @location(2) f32 {
   return 1.0;
 }
 
-[[stage(fragment)]]
-fn main3() -> [[location(3)]] vec4<f32> {
+@stage(fragment)
+fn main3() -> @location(3) vec4<f32> {
   return vec4<f32>(1.0, 2.0, 3.0, 4.0);
 }
diff --git a/test/shader_io/fragment_output_locations_struct.wgsl b/test/shader_io/fragment_output_locations_struct.wgsl
index c196843..9d7c9c7 100644
--- a/test/shader_io/fragment_output_locations_struct.wgsl
+++ b/test/shader_io/fragment_output_locations_struct.wgsl
@@ -1,11 +1,11 @@
 struct FragmentOutputs {
-  [[location(0)]] loc0 : i32;
-  [[location(1)]] loc1 : u32;
-  [[location(2)]] loc2 : f32;
-  [[location(3)]] loc3 : vec4<f32>;
+  @location(0) loc0 : i32;
+  @location(1) loc1 : u32;
+  @location(2) loc2 : f32;
+  @location(3) loc3 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> FragmentOutputs {
   return FragmentOutputs(1, 1u, 1.0, vec4<f32>(1.0, 2.0, 3.0, 4.0));
 }
diff --git a/test/shader_io/fragment_output_locations_struct.wgsl.expected.wgsl b/test/shader_io/fragment_output_locations_struct.wgsl.expected.wgsl
index da4e7cf..5196236 100644
--- a/test/shader_io/fragment_output_locations_struct.wgsl.expected.wgsl
+++ b/test/shader_io/fragment_output_locations_struct.wgsl.expected.wgsl
@@ -1,15 +1,15 @@
 struct FragmentOutputs {
-  [[location(0)]]
+  @location(0)
   loc0 : i32;
-  [[location(1)]]
+  @location(1)
   loc1 : u32;
-  [[location(2)]]
+  @location(2)
   loc2 : f32;
-  [[location(3)]]
+  @location(3)
   loc3 : vec4<f32>;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> FragmentOutputs {
   return FragmentOutputs(1, 1u, 1.0, vec4<f32>(1.0, 2.0, 3.0, 4.0));
 }
diff --git a/test/shader_io/fragment_output_mixed.wgsl b/test/shader_io/fragment_output_mixed.wgsl
index 29e5108..58fe80b 100644
--- a/test/shader_io/fragment_output_mixed.wgsl
+++ b/test/shader_io/fragment_output_mixed.wgsl
@@ -1,13 +1,13 @@
 struct FragmentOutputs {
-  [[location(0)]] loc0 : i32;
-  [[builtin(frag_depth)]] frag_depth : f32;
-  [[location(1)]] loc1 : u32;
-  [[location(2)]] loc2 : f32;
-  [[builtin(sample_mask)]] sample_mask : u32;
-  [[location(3)]] loc3 : vec4<f32>;
+  @location(0) loc0 : i32;
+  @builtin(frag_depth) frag_depth : f32;
+  @location(1) loc1 : u32;
+  @location(2) loc2 : f32;
+  @builtin(sample_mask) sample_mask : u32;
+  @location(3) loc3 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> FragmentOutputs {
   return FragmentOutputs(1, 2.0, 1u, 1.0, 2u, vec4<f32>(1.0, 2.0, 3.0, 4.0));
 }
diff --git a/test/shader_io/fragment_output_mixed.wgsl.expected.wgsl b/test/shader_io/fragment_output_mixed.wgsl.expected.wgsl
index 8069265..3cc71b6 100644
--- a/test/shader_io/fragment_output_mixed.wgsl.expected.wgsl
+++ b/test/shader_io/fragment_output_mixed.wgsl.expected.wgsl
@@ -1,19 +1,19 @@
 struct FragmentOutputs {
-  [[location(0)]]
+  @location(0)
   loc0 : i32;
-  [[builtin(frag_depth)]]
+  @builtin(frag_depth)
   frag_depth : f32;
-  [[location(1)]]
+  @location(1)
   loc1 : u32;
-  [[location(2)]]
+  @location(2)
   loc2 : f32;
-  [[builtin(sample_mask)]]
+  @builtin(sample_mask)
   sample_mask : u32;
-  [[location(3)]]
+  @location(3)
   loc3 : vec4<f32>;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> FragmentOutputs {
   return FragmentOutputs(1, 2.0, 1u, 1.0, 2u, vec4<f32>(1.0, 2.0, 3.0, 4.0));
 }
diff --git a/test/shader_io/interpolate_input_parameters.wgsl b/test/shader_io/interpolate_input_parameters.wgsl
index 64556cd..3e350ea 100644
--- a/test/shader_io/interpolate_input_parameters.wgsl
+++ b/test/shader_io/interpolate_input_parameters.wgsl
@@ -1,11 +1,11 @@
-[[stage(fragment)]]
+@stage(fragment)
 fn main(
-  [[location(0)]] none : f32,
-  [[location(1), interpolate(flat)]] flat : f32,
-  [[location(2), interpolate(perspective, center)]] perspective_center : f32,
-  [[location(3), interpolate(perspective, centroid)]] perspective_centroid : f32,
-  [[location(4), interpolate(perspective, sample)]] perspective_sample : f32,
-  [[location(5), interpolate(linear, center)]] linear_center : f32,
-  [[location(6), interpolate(linear, centroid)]] linear_centroid : f32,
-  [[location(7), interpolate(linear, sample)]] linear_sample : f32) {
+  @location(0) none : f32,
+  @location(1) @interpolate(flat) flat : f32,
+  @location(2) @interpolate(perspective, center) perspective_center : f32,
+  @location(3) @interpolate(perspective, centroid) perspective_centroid : f32,
+  @location(4) @interpolate(perspective, sample) perspective_sample : f32,
+  @location(5) @interpolate(linear, center) linear_center : f32,
+  @location(6) @interpolate(linear, centroid) linear_centroid : f32,
+  @location(7) @interpolate(linear, sample) linear_sample : f32) {
 }
diff --git a/test/shader_io/interpolate_input_parameters.wgsl.expected.wgsl b/test/shader_io/interpolate_input_parameters.wgsl.expected.wgsl
index 3488ca7..8dbd5b1 100644
--- a/test/shader_io/interpolate_input_parameters.wgsl.expected.wgsl
+++ b/test/shader_io/interpolate_input_parameters.wgsl.expected.wgsl
@@ -1,3 +1,3 @@
-[[stage(fragment)]]
-fn main([[location(0)]] none : f32, [[location(1), interpolate(flat)]] flat : f32, [[location(2), interpolate(perspective, center)]] perspective_center : f32, [[location(3), interpolate(perspective, centroid)]] perspective_centroid : f32, [[location(4), interpolate(perspective, sample)]] perspective_sample : f32, [[location(5), interpolate(linear, center)]] linear_center : f32, [[location(6), interpolate(linear, centroid)]] linear_centroid : f32, [[location(7), interpolate(linear, sample)]] linear_sample : f32) {
+@stage(fragment)
+fn main(@location(0) none : f32, @location(1) @interpolate(flat) flat : f32, @location(2) @interpolate(perspective, center) perspective_center : f32, @location(3) @interpolate(perspective, centroid) perspective_centroid : f32, @location(4) @interpolate(perspective, sample) perspective_sample : f32, @location(5) @interpolate(linear, center) linear_center : f32, @location(6) @interpolate(linear, centroid) linear_centroid : f32, @location(7) @interpolate(linear, sample) linear_sample : f32) {
 }
diff --git a/test/shader_io/interpolate_input_struct.wgsl b/test/shader_io/interpolate_input_struct.wgsl
index 0299250..5f5c8c1 100644
--- a/test/shader_io/interpolate_input_struct.wgsl
+++ b/test/shader_io/interpolate_input_struct.wgsl
@@ -1,14 +1,14 @@
 struct In {
-  [[location(0)]] none : f32;
-  [[location(1), interpolate(flat)]] flat : f32;
-  [[location(2), interpolate(perspective, center)]] perspective_center : f32;
-  [[location(3), interpolate(perspective, centroid)]] perspective_centroid : f32;
-  [[location(4), interpolate(perspective, sample)]] perspective_sample : f32;
-  [[location(5), interpolate(linear, center)]] linear_center : f32;
-  [[location(6), interpolate(linear, centroid)]] linear_centroid : f32;
-  [[location(7), interpolate(linear, sample)]] linear_sample : f32;
+  @location(0) none : f32;
+  @location(1) @interpolate(flat) flat : f32;
+  @location(2) @interpolate(perspective, center) perspective_center : f32;
+  @location(3) @interpolate(perspective, centroid) perspective_centroid : f32;
+  @location(4) @interpolate(perspective, sample) perspective_sample : f32;
+  @location(5) @interpolate(linear, center) linear_center : f32;
+  @location(6) @interpolate(linear, centroid) linear_centroid : f32;
+  @location(7) @interpolate(linear, sample) linear_sample : f32;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main(in : In) {
 }
diff --git a/test/shader_io/interpolate_input_struct.wgsl.expected.wgsl b/test/shader_io/interpolate_input_struct.wgsl.expected.wgsl
index 20a8106..3a34745 100644
--- a/test/shader_io/interpolate_input_struct.wgsl.expected.wgsl
+++ b/test/shader_io/interpolate_input_struct.wgsl.expected.wgsl
@@ -1,22 +1,22 @@
 struct In {
-  [[location(0)]]
+  @location(0)
   none : f32;
-  [[location(1), interpolate(flat)]]
+  @location(1) @interpolate(flat)
   flat : f32;
-  [[location(2), interpolate(perspective, center)]]
+  @location(2) @interpolate(perspective, center)
   perspective_center : f32;
-  [[location(3), interpolate(perspective, centroid)]]
+  @location(3) @interpolate(perspective, centroid)
   perspective_centroid : f32;
-  [[location(4), interpolate(perspective, sample)]]
+  @location(4) @interpolate(perspective, sample)
   perspective_sample : f32;
-  [[location(5), interpolate(linear, center)]]
+  @location(5) @interpolate(linear, center)
   linear_center : f32;
-  [[location(6), interpolate(linear, centroid)]]
+  @location(6) @interpolate(linear, centroid)
   linear_centroid : f32;
-  [[location(7), interpolate(linear, sample)]]
+  @location(7) @interpolate(linear, sample)
   linear_sample : f32;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main(in : In) {
 }
diff --git a/test/shader_io/interpolate_integers.wgsl b/test/shader_io/interpolate_integers.wgsl
index 4b3ebe7..f961c8a 100644
--- a/test/shader_io/interpolate_integers.wgsl
+++ b/test/shader_io/interpolate_integers.wgsl
@@ -1,17 +1,17 @@
 struct Interface {
-  [[location(0), interpolate(flat)]] i : i32;
-  [[location(1), interpolate(flat)]] u : u32;
-  [[location(2), interpolate(flat)]] vi : vec4<i32>;
-  [[location(3), interpolate(flat)]] vu : vec4<u32>;
-  [[builtin(position)]] pos : vec4<f32>;
+  @location(0) @interpolate(flat) i : i32;
+  @location(1) @interpolate(flat) u : u32;
+  @location(2) @interpolate(flat) vi : vec4<i32>;
+  @location(3) @interpolate(flat) vu : vec4<u32>;
+  @builtin(position) pos : vec4<f32>;
 };
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main() -> Interface {
   return Interface();
 }
 
-[[stage(fragment)]]
-fn frag_main(inputs : Interface) -> [[location(0)]] i32 {
+@stage(fragment)
+fn frag_main(inputs : Interface) -> @location(0) i32 {
   return inputs.i;
 }
diff --git a/test/shader_io/interpolate_integers.wgsl.expected.wgsl b/test/shader_io/interpolate_integers.wgsl.expected.wgsl
index afabf7c..a6efd12 100644
--- a/test/shader_io/interpolate_integers.wgsl.expected.wgsl
+++ b/test/shader_io/interpolate_integers.wgsl.expected.wgsl
@@ -1,22 +1,22 @@
 struct Interface {
-  [[location(0), interpolate(flat)]]
+  @location(0) @interpolate(flat)
   i : i32;
-  [[location(1), interpolate(flat)]]
+  @location(1) @interpolate(flat)
   u : u32;
-  [[location(2), interpolate(flat)]]
+  @location(2) @interpolate(flat)
   vi : vec4<i32>;
-  [[location(3), interpolate(flat)]]
+  @location(3) @interpolate(flat)
   vu : vec4<u32>;
-  [[builtin(position)]]
+  @builtin(position)
   pos : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main() -> Interface {
   return Interface();
 }
 
-[[stage(fragment)]]
-fn frag_main(inputs : Interface) -> [[location(0)]] i32 {
+@stage(fragment)
+fn frag_main(inputs : Interface) -> @location(0) i32 {
   return inputs.i;
 }
diff --git a/test/shader_io/interpolate_return_struct.wgsl b/test/shader_io/interpolate_return_struct.wgsl
index 9d24e61..0cff79e 100644
--- a/test/shader_io/interpolate_return_struct.wgsl
+++ b/test/shader_io/interpolate_return_struct.wgsl
@@ -1,16 +1,16 @@
 struct Out {
-  [[builtin(position)]] pos : vec4<f32>;
-  [[location(0)]] none : f32;
-  [[location(1), interpolate(flat)]] flat : f32;
-  [[location(2), interpolate(perspective, center)]] perspective_center : f32;
-  [[location(3), interpolate(perspective, centroid)]] perspective_centroid : f32;
-  [[location(4), interpolate(perspective, sample)]] perspective_sample : f32;
-  [[location(5), interpolate(linear, center)]] linear_center : f32;
-  [[location(6), interpolate(linear, centroid)]] linear_centroid : f32;
-  [[location(7), interpolate(linear, sample)]] linear_sample : f32;
+  @builtin(position) pos : vec4<f32>;
+  @location(0) none : f32;
+  @location(1) @interpolate(flat) flat : f32;
+  @location(2) @interpolate(perspective, center) perspective_center : f32;
+  @location(3) @interpolate(perspective, centroid) perspective_centroid : f32;
+  @location(4) @interpolate(perspective, sample) perspective_sample : f32;
+  @location(5) @interpolate(linear, center) linear_center : f32;
+  @location(6) @interpolate(linear, centroid) linear_centroid : f32;
+  @location(7) @interpolate(linear, sample) linear_sample : f32;
 };
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main() -> Out {
   return Out();
 }
diff --git a/test/shader_io/interpolate_return_struct.wgsl.expected.wgsl b/test/shader_io/interpolate_return_struct.wgsl.expected.wgsl
index bcf8177..9a2164a 100644
--- a/test/shader_io/interpolate_return_struct.wgsl.expected.wgsl
+++ b/test/shader_io/interpolate_return_struct.wgsl.expected.wgsl
@@ -1,25 +1,25 @@
 struct Out {
-  [[builtin(position)]]
+  @builtin(position)
   pos : vec4<f32>;
-  [[location(0)]]
+  @location(0)
   none : f32;
-  [[location(1), interpolate(flat)]]
+  @location(1) @interpolate(flat)
   flat : f32;
-  [[location(2), interpolate(perspective, center)]]
+  @location(2) @interpolate(perspective, center)
   perspective_center : f32;
-  [[location(3), interpolate(perspective, centroid)]]
+  @location(3) @interpolate(perspective, centroid)
   perspective_centroid : f32;
-  [[location(4), interpolate(perspective, sample)]]
+  @location(4) @interpolate(perspective, sample)
   perspective_sample : f32;
-  [[location(5), interpolate(linear, center)]]
+  @location(5) @interpolate(linear, center)
   linear_center : f32;
-  [[location(6), interpolate(linear, centroid)]]
+  @location(6) @interpolate(linear, centroid)
   linear_centroid : f32;
-  [[location(7), interpolate(linear, sample)]]
+  @location(7) @interpolate(linear, sample)
   linear_sample : f32;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main() -> Out {
   return Out();
 }
diff --git a/test/shader_io/invariant.wgsl b/test/shader_io/invariant.wgsl
index 66b0649..9abbc94 100644
--- a/test/shader_io/invariant.wgsl
+++ b/test/shader_io/invariant.wgsl
@@ -1,4 +1,4 @@
-[[stage(vertex)]]
-fn main() -> [[builtin(position), invariant]] vec4<f32> {
+@stage(vertex)
+fn main() -> @builtin(position) @invariant vec4<f32> {
   return vec4<f32>();
 }
diff --git a/test/shader_io/invariant.wgsl.expected.wgsl b/test/shader_io/invariant.wgsl.expected.wgsl
index 66b0649..9abbc94 100644
--- a/test/shader_io/invariant.wgsl.expected.wgsl
+++ b/test/shader_io/invariant.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(vertex)]]
-fn main() -> [[builtin(position), invariant]] vec4<f32> {
+@stage(vertex)
+fn main() -> @builtin(position) @invariant vec4<f32> {
   return vec4<f32>();
 }
diff --git a/test/shader_io/invariant_struct_member.wgsl b/test/shader_io/invariant_struct_member.wgsl
index 97d813f..3b2a6ad 100644
--- a/test/shader_io/invariant_struct_member.wgsl
+++ b/test/shader_io/invariant_struct_member.wgsl
@@ -1,8 +1,8 @@
 struct Out {
-  [[builtin(position), invariant]] pos : vec4<f32>;
+  @builtin(position) @invariant pos : vec4<f32>;
 };
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main() -> Out {
   return Out();
 }
diff --git a/test/shader_io/invariant_struct_member.wgsl.expected.wgsl b/test/shader_io/invariant_struct_member.wgsl.expected.wgsl
index 503a0ba..64d1f60 100644
--- a/test/shader_io/invariant_struct_member.wgsl.expected.wgsl
+++ b/test/shader_io/invariant_struct_member.wgsl.expected.wgsl
@@ -1,9 +1,9 @@
 struct Out {
-  [[builtin(position), invariant]]
+  @builtin(position) @invariant
   pos : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main() -> Out {
   return Out();
 }
diff --git a/test/shader_io/shared_struct_different_stages.wgsl b/test/shader_io/shared_struct_different_stages.wgsl
index 802ce43..2e52791 100644
--- a/test/shader_io/shared_struct_different_stages.wgsl
+++ b/test/shader_io/shared_struct_different_stages.wgsl
@@ -1,15 +1,15 @@
 struct Interface {
-  [[location(1)]] col1 : f32;
-  [[location(2)]] col2 : f32;
-  [[builtin(position)]] pos : vec4<f32>;
+  @location(1) col1 : f32;
+  @location(2) col2 : f32;
+  @builtin(position) pos : vec4<f32>;
 };
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main() -> Interface {
   return Interface(0.4, 0.6, vec4<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main(colors : Interface) {
   let r : f32 = colors.col1;
   let g : f32 = colors.col2;
diff --git a/test/shader_io/shared_struct_different_stages.wgsl.expected.wgsl b/test/shader_io/shared_struct_different_stages.wgsl.expected.wgsl
index 343afdd..81fbc7a 100644
--- a/test/shader_io/shared_struct_different_stages.wgsl.expected.wgsl
+++ b/test/shader_io/shared_struct_different_stages.wgsl.expected.wgsl
@@ -1,18 +1,18 @@
 struct Interface {
-  [[location(1)]]
+  @location(1)
   col1 : f32;
-  [[location(2)]]
+  @location(2)
   col2 : f32;
-  [[builtin(position)]]
+  @builtin(position)
   pos : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main() -> Interface {
   return Interface(0.400000006, 0.600000024, vec4<f32>());
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main(colors : Interface) {
   let r : f32 = colors.col1;
   let g : f32 = colors.col2;
diff --git a/test/shader_io/shared_struct_helper_function.wgsl b/test/shader_io/shared_struct_helper_function.wgsl
index 2ebd094..7f7d203 100644
--- a/test/shader_io/shared_struct_helper_function.wgsl
+++ b/test/shader_io/shared_struct_helper_function.wgsl
@@ -1,18 +1,18 @@
 struct VertexOutput {
-  [[builtin(position)]] pos : vec4<f32>;
-  [[location(0), interpolate(flat)]] loc0 : i32;
+  @builtin(position) pos : vec4<f32>;
+  @location(0) @interpolate(flat) loc0 : i32;
 };
 
 fn foo(x : f32) -> VertexOutput {
   return VertexOutput(vec4<f32>(x, x, x, 1.0), 42);
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main1() -> VertexOutput {
   return foo(0.5);
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main2() -> VertexOutput {
   return foo(0.25);
 }
diff --git a/test/shader_io/shared_struct_helper_function.wgsl.expected.wgsl b/test/shader_io/shared_struct_helper_function.wgsl.expected.wgsl
index 034d5e1..4cad81a 100644
--- a/test/shader_io/shared_struct_helper_function.wgsl.expected.wgsl
+++ b/test/shader_io/shared_struct_helper_function.wgsl.expected.wgsl
@@ -1,7 +1,7 @@
 struct VertexOutput {
-  [[builtin(position)]]
+  @builtin(position)
   pos : vec4<f32>;
-  [[location(0), interpolate(flat)]]
+  @location(0) @interpolate(flat)
   loc0 : i32;
 }
 
@@ -9,12 +9,12 @@
   return VertexOutput(vec4<f32>(x, x, x, 1.0), 42);
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main1() -> VertexOutput {
   return foo(0.5);
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn vert_main2() -> VertexOutput {
   return foo(0.25);
 }
diff --git a/test/shader_io/shared_struct_storage_buffer.wgsl b/test/shader_io/shared_struct_storage_buffer.wgsl
index 5d3f93e..83b1ba5 100644
--- a/test/shader_io/shared_struct_storage_buffer.wgsl
+++ b/test/shader_io/shared_struct_storage_buffer.wgsl
@@ -1,13 +1,13 @@
 struct S {
-  [[align(64)]] [[location(0)]] f : f32;
-  [[size(32)]] [[location(1), interpolate(flat)]] u : u32;
-  [[align(128)]] [[builtin(position)]] v : vec4<f32>;
+  @align(64) @location(0) f : f32;
+  @size(32) @location(1) @interpolate(flat) u : u32;
+  @align(128) @builtin(position) v : vec4<f32>;
 };
 
-[[group(0), binding(0)]]
+@group(0) @binding(0)
 var<storage, write> output : S;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main(input : S) {
   let f : f32 = input.f;
   let u : u32 = input.u;
diff --git a/test/shader_io/shared_struct_storage_buffer.wgsl.expected.wgsl b/test/shader_io/shared_struct_storage_buffer.wgsl.expected.wgsl
index 7872704..f4667a4 100644
--- a/test/shader_io/shared_struct_storage_buffer.wgsl.expected.wgsl
+++ b/test/shader_io/shared_struct_storage_buffer.wgsl.expected.wgsl
@@ -1,15 +1,15 @@
 struct S {
-  [[align(64), location(0)]]
+  @align(64) @location(0)
   f : f32;
-  [[size(32), location(1), interpolate(flat)]]
+  @size(32) @location(1) @interpolate(flat)
   u : u32;
-  [[align(128), builtin(position)]]
+  @align(128) @builtin(position)
   v : vec4<f32>;
 }
 
-[[group(0), binding(0)]] var<storage, write> output : S;
+@group(0) @binding(0) var<storage, write> output : S;
 
-[[stage(fragment)]]
+@stage(fragment)
 fn frag_main(input : S) {
   let f : f32 = input.f;
   let u : u32 = input.u;
diff --git a/test/shader_io/vertex_input_builtins.wgsl b/test/shader_io/vertex_input_builtins.wgsl
index 6d207b5..a73ae88 100644
--- a/test/shader_io/vertex_input_builtins.wgsl
+++ b/test/shader_io/vertex_input_builtins.wgsl
@@ -1,8 +1,8 @@
-[[stage(vertex)]]
+@stage(vertex)
 fn main(
-  [[builtin(vertex_index)]] vertex_index : u32,
-  [[builtin(instance_index)]] instance_index : u32,
-) -> [[builtin(position)]] vec4<f32> {
+  @builtin(vertex_index) vertex_index : u32,
+  @builtin(instance_index) instance_index : u32,
+) -> @builtin(position) vec4<f32> {
   let foo : u32 = vertex_index + instance_index;
   return vec4<f32>();
 }
diff --git a/test/shader_io/vertex_input_builtins.wgsl.expected.wgsl b/test/shader_io/vertex_input_builtins.wgsl.expected.wgsl
index ef2f3ac..9955c16 100644
--- a/test/shader_io/vertex_input_builtins.wgsl.expected.wgsl
+++ b/test/shader_io/vertex_input_builtins.wgsl.expected.wgsl
@@ -1,5 +1,5 @@
-[[stage(vertex)]]
-fn main([[builtin(vertex_index)]] vertex_index : u32, [[builtin(instance_index)]] instance_index : u32) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(@builtin(vertex_index) vertex_index : u32, @builtin(instance_index) instance_index : u32) -> @builtin(position) vec4<f32> {
   let foo : u32 = (vertex_index + instance_index);
   return vec4<f32>();
 }
diff --git a/test/shader_io/vertex_input_builtins_struct.wgsl b/test/shader_io/vertex_input_builtins_struct.wgsl
index d81bcdc..03c295a 100644
--- a/test/shader_io/vertex_input_builtins_struct.wgsl
+++ b/test/shader_io/vertex_input_builtins_struct.wgsl
@@ -1,10 +1,10 @@
 struct VertexInputs {
-  [[builtin(vertex_index)]] vertex_index : u32;
-  [[builtin(instance_index)]] instance_index : u32;
+  @builtin(vertex_index) vertex_index : u32;
+  @builtin(instance_index) instance_index : u32;
 };
 
-[[stage(vertex)]]
-fn main(inputs : VertexInputs) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(inputs : VertexInputs) -> @builtin(position) vec4<f32> {
   let foo : u32 = inputs.vertex_index + inputs.instance_index;
   return vec4<f32>();
 }
diff --git a/test/shader_io/vertex_input_builtins_struct.wgsl.expected.wgsl b/test/shader_io/vertex_input_builtins_struct.wgsl.expected.wgsl
index 7d885b4..e48655f 100644
--- a/test/shader_io/vertex_input_builtins_struct.wgsl.expected.wgsl
+++ b/test/shader_io/vertex_input_builtins_struct.wgsl.expected.wgsl
@@ -1,12 +1,12 @@
 struct VertexInputs {
-  [[builtin(vertex_index)]]
+  @builtin(vertex_index)
   vertex_index : u32;
-  [[builtin(instance_index)]]
+  @builtin(instance_index)
   instance_index : u32;
 }
 
-[[stage(vertex)]]
-fn main(inputs : VertexInputs) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(inputs : VertexInputs) -> @builtin(position) vec4<f32> {
   let foo : u32 = (inputs.vertex_index + inputs.instance_index);
   return vec4<f32>();
 }
diff --git a/test/shader_io/vertex_input_locations.wgsl b/test/shader_io/vertex_input_locations.wgsl
index 13fad04..3627e13 100644
--- a/test/shader_io/vertex_input_locations.wgsl
+++ b/test/shader_io/vertex_input_locations.wgsl
@@ -1,10 +1,10 @@
-[[stage(vertex)]]
+@stage(vertex)
 fn main(
-  [[location(0)]] loc0 : i32,
-  [[location(1)]] loc1 : u32,
-  [[location(2)]] loc2 : f32,
-  [[location(3)]] loc3 : vec4<f32>,
-) -> [[builtin(position)]] vec4<f32> {
+  @location(0) loc0 : i32,
+  @location(1) loc1 : u32,
+  @location(2) loc2 : f32,
+  @location(3) loc3 : vec4<f32>,
+) -> @builtin(position) vec4<f32> {
   let i : i32 = loc0;
   let u : u32 = loc1;
   let f : f32 = loc2;
diff --git a/test/shader_io/vertex_input_locations.wgsl.expected.wgsl b/test/shader_io/vertex_input_locations.wgsl.expected.wgsl
index 3730fec..4964dc7 100644
--- a/test/shader_io/vertex_input_locations.wgsl.expected.wgsl
+++ b/test/shader_io/vertex_input_locations.wgsl.expected.wgsl
@@ -1,5 +1,5 @@
-[[stage(vertex)]]
-fn main([[location(0)]] loc0 : i32, [[location(1)]] loc1 : u32, [[location(2)]] loc2 : f32, [[location(3)]] loc3 : vec4<f32>) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(@location(0) loc0 : i32, @location(1) loc1 : u32, @location(2) loc2 : f32, @location(3) loc3 : vec4<f32>) -> @builtin(position) vec4<f32> {
   let i : i32 = loc0;
   let u : u32 = loc1;
   let f : f32 = loc2;
diff --git a/test/shader_io/vertex_input_locations_struct.wgsl b/test/shader_io/vertex_input_locations_struct.wgsl
index 441ffdc..96a8145 100644
--- a/test/shader_io/vertex_input_locations_struct.wgsl
+++ b/test/shader_io/vertex_input_locations_struct.wgsl
@@ -1,12 +1,12 @@
 struct VertexInputs {
-  [[location(0)]] loc0 : i32;
-  [[location(1)]] loc1 : u32;
-  [[location(2)]] loc2 : f32;
-  [[location(3)]] loc3 : vec4<f32>;
+  @location(0) loc0 : i32;
+  @location(1) loc1 : u32;
+  @location(2) loc2 : f32;
+  @location(3) loc3 : vec4<f32>;
 };
 
-[[stage(vertex)]]
-fn main(inputs : VertexInputs) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(inputs : VertexInputs) -> @builtin(position) vec4<f32> {
   let i : i32 = inputs.loc0;
   let u : u32 = inputs.loc1;
   let f : f32 = inputs.loc2;
diff --git a/test/shader_io/vertex_input_locations_struct.wgsl.expected.wgsl b/test/shader_io/vertex_input_locations_struct.wgsl.expected.wgsl
index 7b7c1b0..c267c60 100644
--- a/test/shader_io/vertex_input_locations_struct.wgsl.expected.wgsl
+++ b/test/shader_io/vertex_input_locations_struct.wgsl.expected.wgsl
@@ -1,16 +1,16 @@
 struct VertexInputs {
-  [[location(0)]]
+  @location(0)
   loc0 : i32;
-  [[location(1)]]
+  @location(1)
   loc1 : u32;
-  [[location(2)]]
+  @location(2)
   loc2 : f32;
-  [[location(3)]]
+  @location(3)
   loc3 : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main(inputs : VertexInputs) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(inputs : VertexInputs) -> @builtin(position) vec4<f32> {
   let i : i32 = inputs.loc0;
   let u : u32 = inputs.loc1;
   let f : f32 = inputs.loc2;
diff --git a/test/shader_io/vertex_input_mixed.wgsl b/test/shader_io/vertex_input_mixed.wgsl
index 7c5eafe..8e3c764 100644
--- a/test/shader_io/vertex_input_mixed.wgsl
+++ b/test/shader_io/vertex_input_mixed.wgsl
@@ -1,19 +1,19 @@
 struct VertexInputs0 {
-  [[builtin(vertex_index)]] vertex_index : u32;
-  [[location(0)]] loc0 : i32;
+  @builtin(vertex_index) vertex_index : u32;
+  @location(0) loc0 : i32;
 };
 struct VertexInputs1 {
-  [[location(2)]] loc2 : f32;
-  [[location(3)]] loc3 : vec4<f32>;
+  @location(2) loc2 : f32;
+  @location(3) loc3 : vec4<f32>;
 };
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main(
   inputs0 : VertexInputs0,
-  [[location(1)]] loc1 : u32,
-  [[builtin(instance_index)]] instance_index : u32,
+  @location(1) loc1 : u32,
+  @builtin(instance_index) instance_index : u32,
   inputs1 : VertexInputs1,
-) -> [[builtin(position)]] vec4<f32> {
+) -> @builtin(position) vec4<f32> {
   let foo : u32 = inputs0.vertex_index + instance_index;
   let i : i32 = inputs0.loc0;
   let u : u32 = loc1;
diff --git a/test/shader_io/vertex_input_mixed.wgsl.expected.wgsl b/test/shader_io/vertex_input_mixed.wgsl.expected.wgsl
index 81a6507..5830ebe 100644
--- a/test/shader_io/vertex_input_mixed.wgsl.expected.wgsl
+++ b/test/shader_io/vertex_input_mixed.wgsl.expected.wgsl
@@ -1,19 +1,19 @@
 struct VertexInputs0 {
-  [[builtin(vertex_index)]]
+  @builtin(vertex_index)
   vertex_index : u32;
-  [[location(0)]]
+  @location(0)
   loc0 : i32;
 }
 
 struct VertexInputs1 {
-  [[location(2)]]
+  @location(2)
   loc2 : f32;
-  [[location(3)]]
+  @location(3)
   loc3 : vec4<f32>;
 }
 
-[[stage(vertex)]]
-fn main(inputs0 : VertexInputs0, [[location(1)]] loc1 : u32, [[builtin(instance_index)]] instance_index : u32, inputs1 : VertexInputs1) -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main(inputs0 : VertexInputs0, @location(1) loc1 : u32, @builtin(instance_index) instance_index : u32, inputs1 : VertexInputs1) -> @builtin(position) vec4<f32> {
   let foo : u32 = (inputs0.vertex_index + instance_index);
   let i : i32 = inputs0.loc0;
   let u : u32 = loc1;
diff --git a/test/shader_io/vertex_output_builtins.wgsl b/test/shader_io/vertex_output_builtins.wgsl
index 46776de..d606b44 100644
--- a/test/shader_io/vertex_output_builtins.wgsl
+++ b/test/shader_io/vertex_output_builtins.wgsl
@@ -1,4 +1,4 @@
-[[stage(vertex)]]
-fn main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main() -> @builtin(position) vec4<f32> {
   return vec4<f32>(1.0, 2.0, 3.0, 4.0);
 }
diff --git a/test/shader_io/vertex_output_builtins.wgsl.expected.wgsl b/test/shader_io/vertex_output_builtins.wgsl.expected.wgsl
index 46776de..d606b44 100644
--- a/test/shader_io/vertex_output_builtins.wgsl.expected.wgsl
+++ b/test/shader_io/vertex_output_builtins.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(vertex)]]
-fn main() -> [[builtin(position)]] vec4<f32> {
+@stage(vertex)
+fn main() -> @builtin(position) vec4<f32> {
   return vec4<f32>(1.0, 2.0, 3.0, 4.0);
 }
diff --git a/test/shader_io/vertex_output_builtins_struct.wgsl b/test/shader_io/vertex_output_builtins_struct.wgsl
index 9e09d38..afdcdf5 100644
--- a/test/shader_io/vertex_output_builtins_struct.wgsl
+++ b/test/shader_io/vertex_output_builtins_struct.wgsl
@@ -1,8 +1,8 @@
 struct VertexOutputs {
-  [[builtin(position)]] position : vec4<f32>;
+  @builtin(position) position : vec4<f32>;
 };
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main() -> VertexOutputs {
   return VertexOutputs(vec4<f32>(1.0, 2.0, 3.0, 4.0));
 }
diff --git a/test/shader_io/vertex_output_builtins_struct.wgsl.expected.wgsl b/test/shader_io/vertex_output_builtins_struct.wgsl.expected.wgsl
index 744325c..f08c3a8 100644
--- a/test/shader_io/vertex_output_builtins_struct.wgsl.expected.wgsl
+++ b/test/shader_io/vertex_output_builtins_struct.wgsl.expected.wgsl
@@ -1,9 +1,9 @@
 struct VertexOutputs {
-  [[builtin(position)]]
+  @builtin(position)
   position : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main() -> VertexOutputs {
   return VertexOutputs(vec4<f32>(1.0, 2.0, 3.0, 4.0));
 }
diff --git a/test/shader_io/vertex_output_locations_struct.wgsl b/test/shader_io/vertex_output_locations_struct.wgsl
index e7c4db1..aca5f94 100644
--- a/test/shader_io/vertex_output_locations_struct.wgsl
+++ b/test/shader_io/vertex_output_locations_struct.wgsl
@@ -1,12 +1,12 @@
 struct VertexOutputs {
-  [[location(0), interpolate(flat)]] loc0 : i32;
-  [[location(1), interpolate(flat)]] loc1 : u32;
-  [[location(2)]] loc2 : f32;
-  [[location(3)]] loc3 : vec4<f32>;
-  [[builtin(position)]] position : vec4<f32>;
+  @location(0) @interpolate(flat) loc0 : i32;
+  @location(1) @interpolate(flat) loc1 : u32;
+  @location(2) loc2 : f32;
+  @location(3) loc3 : vec4<f32>;
+  @builtin(position) position : vec4<f32>;
 };
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main() -> VertexOutputs {
   return VertexOutputs(1, 1u, 1.0, vec4<f32>(1.0, 2.0, 3.0, 4.0), vec4<f32>());
 }
diff --git a/test/shader_io/vertex_output_locations_struct.wgsl.expected.wgsl b/test/shader_io/vertex_output_locations_struct.wgsl.expected.wgsl
index a3df42d..a41d17a 100644
--- a/test/shader_io/vertex_output_locations_struct.wgsl.expected.wgsl
+++ b/test/shader_io/vertex_output_locations_struct.wgsl.expected.wgsl
@@ -1,17 +1,17 @@
 struct VertexOutputs {
-  [[location(0), interpolate(flat)]]
+  @location(0) @interpolate(flat)
   loc0 : i32;
-  [[location(1), interpolate(flat)]]
+  @location(1) @interpolate(flat)
   loc1 : u32;
-  [[location(2)]]
+  @location(2)
   loc2 : f32;
-  [[location(3)]]
+  @location(3)
   loc3 : vec4<f32>;
-  [[builtin(position)]]
+  @builtin(position)
   position : vec4<f32>;
 }
 
-[[stage(vertex)]]
+@stage(vertex)
 fn main() -> VertexOutputs {
   return VertexOutputs(1, 1u, 1.0, vec4<f32>(1.0, 2.0, 3.0, 4.0), vec4<f32>());
 }
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl
index 379856e..54e9eaa 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl
@@ -10,9 +10,9 @@
   a1 : array<InnerS, 8>;

 };

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   var v : InnerS;

   var s1 : OuterS;

diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl.expected.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl.expected.wgsl
index f6394af..70dc145 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl.expected.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_body.wgsl.expected.wgsl
@@ -10,9 +10,9 @@
   a1 : array<InnerS, 8>;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s1 : OuterS;
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl
index 5ca5836..626f7da 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl
@@ -10,9 +10,9 @@
   a1 : array<InnerS, 8>;

 };

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   var v : InnerS;

   var s1 : OuterS;

diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.wgsl
index 85d01c6..6668957 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_continuing.wgsl.expected.wgsl
@@ -10,9 +10,9 @@
   a1 : array<InnerS, 8>;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s1 : OuterS;
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl
index d9dd6b2..f8a0e7c 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl
@@ -10,9 +10,9 @@
   a1 : array<InnerS, 8>;

 };

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   var v : InnerS;

   var s1 : OuterS;

diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.wgsl
index 6d4ee1c..fa0f10b 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/in_for_loop_init.wgsl.expected.wgsl
@@ -10,9 +10,9 @@
   a1 : array<InnerS, 8>;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s1 : OuterS;
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl
index 9d569e3..6ca184c 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl
@@ -21,9 +21,9 @@
   return nextIndex;

 }

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   var v : InnerS;

   var s : OuterS;

diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl.expected.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl.expected.wgsl
index 7ae55be..071143f 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl.expected.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/indexing_with_side_effect_func.wgsl.expected.wgsl
@@ -22,9 +22,9 @@
   return nextIndex;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s : OuterS;
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array.wgsl
index 2268109..0583104 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array.wgsl
@@ -10,9 +10,9 @@
   a1 : array<InnerS, 8>;

 };

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   var v : InnerS;

   var s1 : OuterS;

diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array.wgsl.expected.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array.wgsl.expected.wgsl
index 22548cc..f41f74e 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array.wgsl.expected.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array.wgsl.expected.wgsl
@@ -10,9 +10,9 @@
   a1 : array<InnerS, 8>;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s1 : OuterS;
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_array.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_array.wgsl
index 2f0e920..b2f6451 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_array.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_array.wgsl
@@ -11,9 +11,9 @@
   a1 : array<array<InnerS, 8>, 8>;

 };

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   var v : InnerS;

   var s1 : OuterS;

diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_array.wgsl.expected.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_array.wgsl.expected.wgsl
index 555cf5d..bf83d2c 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_array.wgsl.expected.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_array.wgsl.expected.wgsl
@@ -11,9 +11,9 @@
   a1 : array<array<InnerS, 8>, 8>;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s1 : OuterS;
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct.wgsl
index 2dfdfc8..a03babc 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct.wgsl
@@ -14,9 +14,9 @@
   a1 : array<S1, 8>;

 };

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   var v : InnerS;

   var s1 : OuterS;

diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct.wgsl.expected.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct.wgsl.expected.wgsl
index cae1e5d..6bd5dd7 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct.wgsl.expected.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct.wgsl.expected.wgsl
@@ -14,9 +14,9 @@
   a1 : array<S1, 8>;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s1 : OuterS;
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct_array.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct_array.wgsl
index c8d97e5..6a377ec 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct_array.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct_array.wgsl
@@ -15,9 +15,9 @@
   a1 : array<S1, 8>;

 };

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   var v : InnerS;

   var s : OuterS;

diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct_array.wgsl.expected.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct_array.wgsl.expected.wgsl
index 6969d94..aa1010a 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct_array.wgsl.expected.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_array_struct_array.wgsl.expected.wgsl
@@ -15,9 +15,9 @@
   a1 : array<S1, 8>;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s : OuterS;
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array.wgsl
index 99ad0f0..b4b4f71 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array.wgsl
@@ -10,10 +10,10 @@
   a1 : array<InnerS>;

 };

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

-[[binding(0), group(0)]] var<storage, read_write> s1 : OuterS;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

+@binding(0) @group(0) var<storage, read_write> s1 : OuterS;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   var v : InnerS;

   s1.a1[uniforms.i] = v;

diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array.wgsl.expected.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array.wgsl.expected.wgsl
index c08a5f8..d5c02bc 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array.wgsl.expected.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array.wgsl.expected.wgsl
@@ -10,11 +10,11 @@
   a1 : array<InnerS>;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[binding(0), group(0)]] var<storage, read_write> s1 : OuterS;
+@binding(0) @group(0) var<storage, read_write> s1 : OuterS;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   s1.a1[uniforms.i] = v;
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array_struct_array.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array_struct_array.wgsl
index 0d40e81..711e990 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array_struct_array.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array_struct_array.wgsl
@@ -15,10 +15,10 @@
   a1 : array<S1>;

 };

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

-[[binding(0), group(0)]] var<storage, read_write> s : OuterS;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

+@binding(0) @group(0) var<storage, read_write> s : OuterS;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   var v : InnerS;

   s.a1[uniforms.i].a2[uniforms.j] = v;

diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array_struct_array.wgsl.expected.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array_struct_array.wgsl.expected.wgsl
index c53b90d..56b7fd6 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array_struct_array.wgsl.expected.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_dynamic_array_struct_array.wgsl.expected.wgsl
@@ -15,11 +15,11 @@
   a1 : array<S1>;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[binding(0), group(0)]] var<storage, read_write> s : OuterS;
+@binding(0) @group(0) var<storage, read_write> s : OuterS;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   s.a1[uniforms.i].a2[uniforms.j] = v;
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_matrix.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_matrix.wgsl
index 3c67742..ee95b91 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/struct_matrix.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_matrix.wgsl
@@ -6,9 +6,9 @@
   m1 : mat2x4<f32>;

 };

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   var s1 : OuterS;

   s1.m1[uniforms.i] = vec4<f32>(1.0);

diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_matrix.wgsl.expected.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_matrix.wgsl.expected.wgsl
index aeb5f1b..9cb1a85 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/struct_matrix.wgsl.expected.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_matrix.wgsl.expected.wgsl
@@ -6,9 +6,9 @@
   m1 : mat2x4<f32>;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var s1 : OuterS;
   s1.m1[uniforms.i] = vec4<f32>(1.0);
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_multiple_arrays.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_multiple_arrays.wgsl
index 1fcd397..9d8ac68 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/struct_multiple_arrays.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_multiple_arrays.wgsl
@@ -11,9 +11,9 @@
   a2 : array<InnerS, 8>;

 };

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   var v : InnerS;

   var s1 : OuterS;

diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_multiple_arrays.wgsl.expected.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_multiple_arrays.wgsl.expected.wgsl
index 55091c5..d39372f 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/struct_multiple_arrays.wgsl.expected.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_multiple_arrays.wgsl.expected.wgsl
@@ -11,9 +11,9 @@
   a2 : array<InnerS, 8>;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s1 : OuterS;
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_struct_array.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_struct_array.wgsl
index bff1418..12591b3 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/struct_struct_array.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_struct_array.wgsl
@@ -14,9 +14,9 @@
   s2 : S1;

 };

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   var v : InnerS;

   var s1 : OuterS;

diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_struct_array.wgsl.expected.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_struct_array.wgsl.expected.wgsl
index f2ebffe..2d65b1f 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/struct_struct_array.wgsl.expected.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_struct_array.wgsl.expected.wgsl
@@ -14,9 +14,9 @@
   s2 : S1;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s1 : OuterS;
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_vector.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_vector.wgsl
index 578124f..b5baa12 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/struct_vector.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_vector.wgsl
@@ -6,9 +6,9 @@
   v1 : vec3<f32>;

 };

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   var s1 : OuterS;

   s1.v1[uniforms.i] = 1.0;

diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/struct_vector.wgsl.expected.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/struct_vector.wgsl.expected.wgsl
index da718cf..e47e024 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/struct_vector.wgsl.expected.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/struct_vector.wgsl.expected.wgsl
@@ -6,9 +6,9 @@
   v1 : vec3<f32>;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var s1 : OuterS;
   s1.v1[uniforms.i] = 1.0;
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl
index c8b46c5..49fbde7 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl
@@ -6,13 +6,13 @@
   a1 : array<u32, 8>;

 };

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

 

 fn f(i: u32) -> u32 {

   return i + 1u;

 }

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   var s1 : OuterS;

   var v : vec3<f32>;

diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl.expected.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl.expected.wgsl
index 928e38d..bfa66c2 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl.expected.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/vector_assign.wgsl.expected.wgsl
@@ -6,13 +6,13 @@
   a1 : array<u32, 8>;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
 fn f(i : u32) -> u32 {
   return (i + 1u);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var s1 : OuterS;
   var v : vec3<f32>;
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer.wgsl
index b44dcfa..133c000 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer.wgsl
@@ -10,9 +10,9 @@
   a1 : array<InnerS, 8>;

 };

 

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   var v : InnerS;

   var s1 : OuterS;

diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer.wgsl.expected.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer.wgsl.expected.wgsl
index f65b285..5ae5fca 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer.wgsl.expected.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer.wgsl.expected.wgsl
@@ -10,9 +10,9 @@
   a1 : array<InnerS, 8>;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : InnerS;
   var s1 : OuterS;
diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer_arg.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer_arg.wgsl
index 2391e14..b7cedd0 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer_arg.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer_arg.wgsl
@@ -7,14 +7,14 @@
 struct OuterS {

   a1 : array<InnerS, 8>;

 };

-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;

+@group(1) @binding(4) var<uniform> uniforms : Uniforms;

 

 fn f(p : ptr<function, OuterS>) {

   var v : InnerS;

   (*p).a1[uniforms.i] = v;

 }

 

-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn main() {

   var s1 : OuterS;

   f(&s1);

diff --git a/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer_arg.wgsl.expected.wgsl b/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer_arg.wgsl.expected.wgsl
index 86b031a..75cedf7 100644
--- a/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer_arg.wgsl.expected.wgsl
+++ b/test/statements/assign/indexed_assign_to_array_in_struct/via_pointer_arg.wgsl.expected.wgsl
@@ -10,14 +10,14 @@
   a1 : array<InnerS, 8>;
 }
 
-[[group(1), binding(4)]] var<uniform> uniforms : Uniforms;
+@group(1) @binding(4) var<uniform> uniforms : Uniforms;
 
 fn f(p : ptr<function, OuterS>) {
   var v : InnerS;
   (*(p)).a1[uniforms.i] = v;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var s1 : OuterS;
   f(&(s1));
diff --git a/test/statements/assign/phony/addr_of_non_constructable.wgsl b/test/statements/assign/phony/addr_of_non_constructable.wgsl
index 2ebe66d..f616560 100644
--- a/test/statements/assign/phony/addr_of_non_constructable.wgsl
+++ b/test/statements/assign/phony/addr_of_non_constructable.wgsl
@@ -2,9 +2,9 @@
     arr : array<i32>;
 };
 
-[[binding(0), group(0)]] var<storage, read_write> s : S;
+@binding(0) @group(0) var<storage, read_write> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = &s;
 }
diff --git a/test/statements/assign/phony/addr_of_non_constructable.wgsl.expected.wgsl b/test/statements/assign/phony/addr_of_non_constructable.wgsl.expected.wgsl
index 0952e9d..9a8aa90 100644
--- a/test/statements/assign/phony/addr_of_non_constructable.wgsl.expected.wgsl
+++ b/test/statements/assign/phony/addr_of_non_constructable.wgsl.expected.wgsl
@@ -2,9 +2,9 @@
   arr : array<i32>;
 }
 
-[[binding(0), group(0)]] var<storage, read_write> s : S;
+@binding(0) @group(0) var<storage, read_write> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = &(s);
 }
diff --git a/test/statements/assign/phony/addr_of_runtime_array.wgsl b/test/statements/assign/phony/addr_of_runtime_array.wgsl
index 9121fe8..bbf5448 100644
--- a/test/statements/assign/phony/addr_of_runtime_array.wgsl
+++ b/test/statements/assign/phony/addr_of_runtime_array.wgsl
@@ -2,9 +2,9 @@
     arr : array<i32>;
 };
 
-[[binding(0), group(0)]] var<storage, read_write> s : S;
+@binding(0) @group(0) var<storage, read_write> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = &s.arr;
 }
diff --git a/test/statements/assign/phony/addr_of_runtime_array.wgsl.expected.wgsl b/test/statements/assign/phony/addr_of_runtime_array.wgsl.expected.wgsl
index b6c7441..13a6462 100644
--- a/test/statements/assign/phony/addr_of_runtime_array.wgsl.expected.wgsl
+++ b/test/statements/assign/phony/addr_of_runtime_array.wgsl.expected.wgsl
@@ -2,9 +2,9 @@
   arr : array<i32>;
 }
 
-[[binding(0), group(0)]] var<storage, read_write> s : S;
+@binding(0) @group(0) var<storage, read_write> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = &(s.arr);
 }
diff --git a/test/statements/assign/phony/call.wgsl b/test/statements/assign/phony/call.wgsl
index 8be76ec..5f44585 100644
--- a/test/statements/assign/phony/call.wgsl
+++ b/test/statements/assign/phony/call.wgsl
@@ -2,7 +2,7 @@
     return a * b + c;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = f(1, 2, 3);
 }
diff --git a/test/statements/assign/phony/call.wgsl.expected.wgsl b/test/statements/assign/phony/call.wgsl.expected.wgsl
index c650359..cef5c5f 100644
--- a/test/statements/assign/phony/call.wgsl.expected.wgsl
+++ b/test/statements/assign/phony/call.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   return ((a * b) + c);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = f(1, 2, 3);
 }
diff --git a/test/statements/assign/phony/multiple_side_effects.wgsl b/test/statements/assign/phony/multiple_side_effects.wgsl
index fcfccd1..da2faf8 100644
--- a/test/statements/assign/phony/multiple_side_effects.wgsl
+++ b/test/statements/assign/phony/multiple_side_effects.wgsl
@@ -2,7 +2,7 @@
     return a * b + c;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = f(1, 2, 3) + f(4, 5, 6) * f(7, f(8, 9, 10), 11);
 }
diff --git a/test/statements/assign/phony/multiple_side_effects.wgsl.expected.wgsl b/test/statements/assign/phony/multiple_side_effects.wgsl.expected.wgsl
index 0c7cc23..e438785 100644
--- a/test/statements/assign/phony/multiple_side_effects.wgsl.expected.wgsl
+++ b/test/statements/assign/phony/multiple_side_effects.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   return ((a * b) + c);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = (f(1, 2, 3) + (f(4, 5, 6) * f(7, f(8, 9, 10), 11)));
 }
diff --git a/test/statements/assign/phony/storage_buffer.wgsl b/test/statements/assign/phony/storage_buffer.wgsl
index 9f78472..c8eb0ec 100644
--- a/test/statements/assign/phony/storage_buffer.wgsl
+++ b/test/statements/assign/phony/storage_buffer.wgsl
@@ -2,9 +2,9 @@
     i : i32;
 };
 
-[[binding(0), group(0)]] var<storage, read_write> s : S;
+@binding(0) @group(0) var<storage, read_write> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = s;
     _ = s.i;
diff --git a/test/statements/assign/phony/storage_buffer.wgsl.expected.wgsl b/test/statements/assign/phony/storage_buffer.wgsl.expected.wgsl
index c4caa99..5f2debd 100644
--- a/test/statements/assign/phony/storage_buffer.wgsl.expected.wgsl
+++ b/test/statements/assign/phony/storage_buffer.wgsl.expected.wgsl
@@ -2,9 +2,9 @@
   i : i32;
 }
 
-[[binding(0), group(0)]] var<storage, read_write> s : S;
+@binding(0) @group(0) var<storage, read_write> s : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = s;
   _ = s.i;
diff --git a/test/statements/assign/phony/uniform_buffer.wgsl b/test/statements/assign/phony/uniform_buffer.wgsl
index c0526bc..f7286c9 100644
--- a/test/statements/assign/phony/uniform_buffer.wgsl
+++ b/test/statements/assign/phony/uniform_buffer.wgsl
@@ -2,9 +2,9 @@
     i : i32;
 };
 
-[[binding(0), group(0)]] var<uniform> u : S;
+@binding(0) @group(0) var<uniform> u : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = u;
     _ = u.i;
diff --git a/test/statements/assign/phony/uniform_buffer.wgsl.expected.wgsl b/test/statements/assign/phony/uniform_buffer.wgsl.expected.wgsl
index 3ef1045..d20153a 100644
--- a/test/statements/assign/phony/uniform_buffer.wgsl.expected.wgsl
+++ b/test/statements/assign/phony/uniform_buffer.wgsl.expected.wgsl
@@ -2,9 +2,9 @@
   i : i32;
 }
 
-[[binding(0), group(0)]] var<uniform> u : S;
+@binding(0) @group(0) var<uniform> u : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = u;
   _ = u.i;
diff --git a/test/statements/switch/common.wgsl b/test/statements/switch/common.wgsl
index ada8f5e..bed7942 100644
--- a/test/statements/switch/common.wgsl
+++ b/test/statements/switch/common.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn f() {

     var i : i32;

     var result : i32;

diff --git a/test/statements/switch/common.wgsl.expected.wgsl b/test/statements/switch/common.wgsl.expected.wgsl
index 9aad3f1..8b56b03 100644
--- a/test/statements/switch/common.wgsl.expected.wgsl
+++ b/test/statements/switch/common.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var i : i32;
   var result : i32;
diff --git a/test/statements/switch/fallthrough.wgsl b/test/statements/switch/fallthrough.wgsl
index 20eae21..70691c8 100644
--- a/test/statements/switch/fallthrough.wgsl
+++ b/test/statements/switch/fallthrough.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
     var i : i32;
     switch(i) {
diff --git a/test/statements/switch/fallthrough.wgsl.expected.wgsl b/test/statements/switch/fallthrough.wgsl.expected.wgsl
index 37163f5..b04e882 100644
--- a/test/statements/switch/fallthrough.wgsl.expected.wgsl
+++ b/test/statements/switch/fallthrough.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var i : i32;
   switch(i) {
diff --git a/test/statements/switch/only_default_case.wgsl b/test/statements/switch/only_default_case.wgsl
index cb12fb9..0f61d18 100644
--- a/test/statements/switch/only_default_case.wgsl
+++ b/test/statements/switch/only_default_case.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]

+@stage(compute) @workgroup_size(1)

 fn f() {

     var i : i32;

     var result : i32;

diff --git a/test/statements/switch/only_default_case.wgsl.expected.wgsl b/test/statements/switch/only_default_case.wgsl.expected.wgsl
index bd050b7..234f256 100644
--- a/test/statements/switch/only_default_case.wgsl.expected.wgsl
+++ b/test/statements/switch/only_default_case.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn f() {
   var i : i32;
   var result : i32;
diff --git a/test/struct/type_constructor.wgsl b/test/struct/type_constructor.wgsl
index 1725ffa..f79b527 100644
--- a/test/struct/type_constructor.wgsl
+++ b/test/struct/type_constructor.wgsl
@@ -20,7 +20,7 @@
   a : array<i32, 2>;
 };
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x : i32 = 42;
 
diff --git a/test/struct/type_constructor.wgsl.expected.wgsl b/test/struct/type_constructor.wgsl.expected.wgsl
index c526e3f..d4a5bbd 100644
--- a/test/struct/type_constructor.wgsl.expected.wgsl
+++ b/test/struct/type_constructor.wgsl.expected.wgsl
@@ -20,7 +20,7 @@
   a : array<i32, 2>;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let x : i32 = 42;
   let empty : S1 = S1();
diff --git a/test/types/function_scope_declarations.wgsl b/test/types/function_scope_declarations.wgsl
index 9f13250..fe560bb 100644
--- a/test/types/function_scope_declarations.wgsl
+++ b/test/types/function_scope_declarations.wgsl
@@ -2,7 +2,7 @@
   a : f32;
 };
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var bool_var : bool = bool();
   let bool_let : bool = bool();
diff --git a/test/types/function_scope_declarations.wgsl.expected.wgsl b/test/types/function_scope_declarations.wgsl.expected.wgsl
index 3845786..e5168c2 100644
--- a/test/types/function_scope_declarations.wgsl.expected.wgsl
+++ b/test/types/function_scope_declarations.wgsl.expected.wgsl
@@ -2,7 +2,7 @@
   a : f32;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var bool_var : bool = bool();
   let bool_let : bool = bool();
diff --git a/test/types/function_scope_var_conversions.wgsl b/test/types/function_scope_var_conversions.wgsl
index 66cc378..4f58b71 100644
--- a/test/types/function_scope_var_conversions.wgsl
+++ b/test/types/function_scope_var_conversions.wgsl
@@ -3,7 +3,7 @@
   var b : vec2<f32> = vec2<f32>(f32(i32(1)), a);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var bool_var1 : bool = bool(123u);
   var bool_var2 : bool = bool(123);
diff --git a/test/types/function_scope_var_conversions.wgsl.expected.wgsl b/test/types/function_scope_var_conversions.wgsl.expected.wgsl
index de961c6..53206b3 100644
--- a/test/types/function_scope_var_conversions.wgsl.expected.wgsl
+++ b/test/types/function_scope_var_conversions.wgsl.expected.wgsl
@@ -3,7 +3,7 @@
   var b : vec2<f32> = vec2<f32>(f32(i32(1)), a);
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var bool_var1 : bool = bool(123u);
   var bool_var2 : bool = bool(123);
diff --git a/test/types/module_scope_let.wgsl b/test/types/module_scope_let.wgsl
index 85b317c..54718f4 100644
--- a/test/types/module_scope_let.wgsl
+++ b/test/types/module_scope_let.wgsl
@@ -13,6 +13,6 @@
 let arr_let : array<f32, 4> = array<f32, 4>();
 let struct_let : S = S();
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
 }
diff --git a/test/types/module_scope_let.wgsl.expected.wgsl b/test/types/module_scope_let.wgsl.expected.wgsl
index be35814..8d091d3 100644
--- a/test/types/module_scope_let.wgsl.expected.wgsl
+++ b/test/types/module_scope_let.wgsl.expected.wgsl
@@ -22,6 +22,6 @@
 
 let struct_let : S = S();
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
 }
diff --git a/test/types/module_scope_var.wgsl b/test/types/module_scope_var.wgsl
index e9ab444..a748f59 100644
--- a/test/types/module_scope_var.wgsl
+++ b/test/types/module_scope_var.wgsl
@@ -13,7 +13,7 @@
 var<private> arr_var : array<f32, 4>;
 var<private> struct_var : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   // Reference the module-scope variables to stop them from being removed.
   bool_var = bool();
diff --git a/test/types/module_scope_var.wgsl.expected.wgsl b/test/types/module_scope_var.wgsl.expected.wgsl
index 55f4e0a..31ee7a7 100644
--- a/test/types/module_scope_var.wgsl.expected.wgsl
+++ b/test/types/module_scope_var.wgsl.expected.wgsl
@@ -22,7 +22,7 @@
 
 var<private> struct_var : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   bool_var = bool();
   i32_var = i32();
diff --git a/test/types/module_scope_var_conversions.wgsl b/test/types/module_scope_var_conversions.wgsl
index 935a1e4..ce6fa2e 100644
--- a/test/types/module_scope_var_conversions.wgsl
+++ b/test/types/module_scope_var_conversions.wgsl
@@ -25,7 +25,7 @@
 var<private> v3bool_var4 : vec3<bool> = vec3<bool>(vec2<bool>(vec2<f32>(123.0)), true);
 var<private> v4bool_var5 : vec4<bool> = vec4<bool>(vec2<bool>(vec2<f32>(123.0, 0.0)), vec2<bool>(true, bool(f32(0.0))));
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   // Reference the module-scope variables to stop them from being removed.
   bool_var1 = bool();
diff --git a/test/types/module_scope_var_conversions.wgsl.expected.wgsl b/test/types/module_scope_var_conversions.wgsl.expected.wgsl
index f3b8876..b5373bf 100644
--- a/test/types/module_scope_var_conversions.wgsl.expected.wgsl
+++ b/test/types/module_scope_var_conversions.wgsl.expected.wgsl
@@ -38,7 +38,7 @@
 
 var<private> v4bool_var5 : vec4<bool> = vec4<bool>(vec2<bool>(vec2<f32>(123.0, 0.0)), vec2<bool>(true, bool(f32(0.0))));
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   bool_var1 = bool();
   bool_var2 = bool();
diff --git a/test/types/module_scope_var_initializers.wgsl b/test/types/module_scope_var_initializers.wgsl
index b7402d0..fb2eb8c 100644
--- a/test/types/module_scope_var_initializers.wgsl
+++ b/test/types/module_scope_var_initializers.wgsl
@@ -13,7 +13,7 @@
 var<private> arr_var : array<f32, 4> = array<f32, 4>();
 var<private> struct_var : S = S();
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   // Reference the module-scope variables to stop them from being removed.
   bool_var = bool();
diff --git a/test/types/module_scope_var_initializers.wgsl.expected.wgsl b/test/types/module_scope_var_initializers.wgsl.expected.wgsl
index d9dcf61..e2b011b 100644
--- a/test/types/module_scope_var_initializers.wgsl.expected.wgsl
+++ b/test/types/module_scope_var_initializers.wgsl.expected.wgsl
@@ -22,7 +22,7 @@
 
 var<private> struct_var : S = S();
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   bool_var = bool();
   i32_var = i32();
diff --git a/test/types/parameters.wgsl b/test/types/parameters.wgsl
index 21987c9..1ea45ae 100644
--- a/test/types/parameters.wgsl
+++ b/test/types/parameters.wgsl
@@ -18,6 +18,6 @@
   param_ptr_arr : ptr<function, array<f32, 4>>,
 ) {}
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
 }
diff --git a/test/types/parameters.wgsl.expected.wgsl b/test/types/parameters.wgsl.expected.wgsl
index 2720ce3..2bda0fb 100644
--- a/test/types/parameters.wgsl.expected.wgsl
+++ b/test/types/parameters.wgsl.expected.wgsl
@@ -5,6 +5,6 @@
 fn foo(param_bool : bool, param_i32 : i32, param_u32 : u32, param_f32 : f32, param_v2i32 : vec2<i32>, param_v3u32 : vec3<u32>, param_v4f32 : vec4<f32>, param_m2x3 : mat2x3<f32>, param_arr : array<f32, 4>, param_struct : S, param_ptr_f32 : ptr<function, f32>, param_ptr_vec : ptr<function, vec4<f32>>, param_ptr_arr : ptr<function, array<f32, 4>>) {
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
 }
diff --git a/test/types/return_types.wgsl b/test/types/return_types.wgsl
index c65b996..1ed77ff 100644
--- a/test/types/return_types.wgsl
+++ b/test/types/return_types.wgsl
@@ -13,6 +13,6 @@
 fn ret_arr() -> array<f32, 4> { return array<f32, 4>(); }
 fn ret_struct() -> S { return S(); }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
 }
diff --git a/test/types/return_types.wgsl.expected.wgsl b/test/types/return_types.wgsl.expected.wgsl
index d34a095..c888b19 100644
--- a/test/types/return_types.wgsl.expected.wgsl
+++ b/test/types/return_types.wgsl.expected.wgsl
@@ -42,6 +42,6 @@
   return S();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
 }
diff --git a/test/types/sampler.wgsl b/test/types/sampler.wgsl
index 1085620..edeb51e 100644
--- a/test/types/sampler.wgsl
+++ b/test/types/sampler.wgsl
@@ -1,7 +1,7 @@
-[[group(0), binding(0)]] var s : sampler;
-[[group(0), binding(1)]] var sc : sampler_comparison;
+@group(0) @binding(0) var s : sampler;
+@group(0) @binding(1) var sc : sampler_comparison;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = s;
   _ = sc;
diff --git a/test/types/sampler.wgsl.expected.wgsl b/test/types/sampler.wgsl.expected.wgsl
index 315599b..3d873eb 100644
--- a/test/types/sampler.wgsl.expected.wgsl
+++ b/test/types/sampler.wgsl.expected.wgsl
@@ -1,8 +1,8 @@
-[[group(0), binding(0)]] var s : sampler;
+@group(0) @binding(0) var s : sampler;
 
-[[group(0), binding(1)]] var sc : sampler_comparison;
+@group(0) @binding(1) var sc : sampler_comparison;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = s;
   _ = sc;
diff --git a/test/types/struct_members.wgsl b/test/types/struct_members.wgsl
index 2bd0f33..e179bdb 100644
--- a/test/types/struct_members.wgsl
+++ b/test/types/struct_members.wgsl
@@ -15,7 +15,7 @@
   member_struct : S_inner;
 };
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let s : S = S();
 }
diff --git a/test/types/struct_members.wgsl.expected.wgsl b/test/types/struct_members.wgsl.expected.wgsl
index 7ff178c..6778410 100644
--- a/test/types/struct_members.wgsl.expected.wgsl
+++ b/test/types/struct_members.wgsl.expected.wgsl
@@ -15,7 +15,7 @@
   member_struct : S_inner;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   let s : S = S();
 }
diff --git a/test/types/texture/depth/2d.wgsl b/test/types/texture/depth/2d.wgsl
index 853e277..e3a53cd 100644
--- a/test/types/texture/depth/2d.wgsl
+++ b/test/types/texture/depth/2d.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var t_f : texture_depth_2d;
+@group(0) @binding(0) var t_f : texture_depth_2d;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_f;
 }
diff --git a/test/types/texture/depth/2d.wgsl.expected.wgsl b/test/types/texture/depth/2d.wgsl.expected.wgsl
index 853e277..e3a53cd 100644
--- a/test/types/texture/depth/2d.wgsl.expected.wgsl
+++ b/test/types/texture/depth/2d.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var t_f : texture_depth_2d;
+@group(0) @binding(0) var t_f : texture_depth_2d;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_f;
 }
diff --git a/test/types/texture/depth/2d_array.wgsl b/test/types/texture/depth/2d_array.wgsl
index 9338fe5..e6fac8c 100644
--- a/test/types/texture/depth/2d_array.wgsl
+++ b/test/types/texture/depth/2d_array.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var t_f : texture_depth_2d_array;
+@group(0) @binding(0) var t_f : texture_depth_2d_array;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_f;
 }
diff --git a/test/types/texture/depth/2d_array.wgsl.expected.wgsl b/test/types/texture/depth/2d_array.wgsl.expected.wgsl
index 9338fe5..e6fac8c 100644
--- a/test/types/texture/depth/2d_array.wgsl.expected.wgsl
+++ b/test/types/texture/depth/2d_array.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var t_f : texture_depth_2d_array;
+@group(0) @binding(0) var t_f : texture_depth_2d_array;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_f;
 }
diff --git a/test/types/texture/depth/cube.wgsl b/test/types/texture/depth/cube.wgsl
index bd16ce8..785b96c 100644
--- a/test/types/texture/depth/cube.wgsl
+++ b/test/types/texture/depth/cube.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var t_f : texture_depth_cube;
+@group(0) @binding(0) var t_f : texture_depth_cube;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_f;
 }
diff --git a/test/types/texture/depth/cube.wgsl.expected.wgsl b/test/types/texture/depth/cube.wgsl.expected.wgsl
index bd16ce8..785b96c 100644
--- a/test/types/texture/depth/cube.wgsl.expected.wgsl
+++ b/test/types/texture/depth/cube.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var t_f : texture_depth_cube;
+@group(0) @binding(0) var t_f : texture_depth_cube;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_f;
 }
diff --git a/test/types/texture/depth/cube_array.wgsl b/test/types/texture/depth/cube_array.wgsl
index d30008f..0e1b07e 100644
--- a/test/types/texture/depth/cube_array.wgsl
+++ b/test/types/texture/depth/cube_array.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var t_f : texture_depth_cube_array;
+@group(0) @binding(0) var t_f : texture_depth_cube_array;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_f;
 }
diff --git a/test/types/texture/depth/cube_array.wgsl.expected.wgsl b/test/types/texture/depth/cube_array.wgsl.expected.wgsl
index d30008f..0e1b07e 100644
--- a/test/types/texture/depth/cube_array.wgsl.expected.wgsl
+++ b/test/types/texture/depth/cube_array.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[group(0), binding(0)]] var t_f : texture_depth_cube_array;
+@group(0) @binding(0) var t_f : texture_depth_cube_array;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_f;
 }
diff --git a/test/types/texture/multisampled/2d.wgsl b/test/types/texture/multisampled/2d.wgsl
index 9de9f26..76521e5 100644
--- a/test/types/texture/multisampled/2d.wgsl
+++ b/test/types/texture/multisampled/2d.wgsl
@@ -1,8 +1,8 @@
-[[group(0), binding(0)]] var t_f : texture_multisampled_2d<f32>;
-[[group(0), binding(1)]] var t_i : texture_multisampled_2d<i32>;
-[[group(0), binding(2)]] var t_u : texture_multisampled_2d<u32>;
+@group(0) @binding(0) var t_f : texture_multisampled_2d<f32>;
+@group(0) @binding(1) var t_i : texture_multisampled_2d<i32>;
+@group(0) @binding(2) var t_u : texture_multisampled_2d<u32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_f;
   _ = t_i;
diff --git a/test/types/texture/multisampled/2d.wgsl.expected.wgsl b/test/types/texture/multisampled/2d.wgsl.expected.wgsl
index 4c078ca..d8eb77b 100644
--- a/test/types/texture/multisampled/2d.wgsl.expected.wgsl
+++ b/test/types/texture/multisampled/2d.wgsl.expected.wgsl
@@ -1,10 +1,10 @@
-[[group(0), binding(0)]] var t_f : texture_multisampled_2d<f32>;
+@group(0) @binding(0) var t_f : texture_multisampled_2d<f32>;
 
-[[group(0), binding(1)]] var t_i : texture_multisampled_2d<i32>;
+@group(0) @binding(1) var t_i : texture_multisampled_2d<i32>;
 
-[[group(0), binding(2)]] var t_u : texture_multisampled_2d<u32>;
+@group(0) @binding(2) var t_u : texture_multisampled_2d<u32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_f;
   _ = t_i;
diff --git a/test/types/texture/sampled/1d.wgsl b/test/types/texture/sampled/1d.wgsl
index bfc4cf0..ed97090 100644
--- a/test/types/texture/sampled/1d.wgsl
+++ b/test/types/texture/sampled/1d.wgsl
@@ -1,8 +1,8 @@
-[[group(0), binding(0)]] var t_f : texture_1d<f32>;
-[[group(0), binding(1)]] var t_i : texture_1d<i32>;
-[[group(0), binding(2)]] var t_u : texture_1d<u32>;
+@group(0) @binding(0) var t_f : texture_1d<f32>;
+@group(0) @binding(1) var t_i : texture_1d<i32>;
+@group(0) @binding(2) var t_u : texture_1d<u32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_f;
   _ = t_i;
diff --git a/test/types/texture/sampled/1d.wgsl.expected.wgsl b/test/types/texture/sampled/1d.wgsl.expected.wgsl
index a14ff96..565089e 100644
--- a/test/types/texture/sampled/1d.wgsl.expected.wgsl
+++ b/test/types/texture/sampled/1d.wgsl.expected.wgsl
@@ -1,10 +1,10 @@
-[[group(0), binding(0)]] var t_f : texture_1d<f32>;
+@group(0) @binding(0) var t_f : texture_1d<f32>;
 
-[[group(0), binding(1)]] var t_i : texture_1d<i32>;
+@group(0) @binding(1) var t_i : texture_1d<i32>;
 
-[[group(0), binding(2)]] var t_u : texture_1d<u32>;
+@group(0) @binding(2) var t_u : texture_1d<u32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_f;
   _ = t_i;
diff --git a/test/types/texture/sampled/2d.wgsl b/test/types/texture/sampled/2d.wgsl
index eac8459..b6be42b 100644
--- a/test/types/texture/sampled/2d.wgsl
+++ b/test/types/texture/sampled/2d.wgsl
@@ -1,8 +1,8 @@
-[[group(0), binding(0)]] var t_f : texture_2d<f32>;
-[[group(0), binding(1)]] var t_i : texture_2d<i32>;
-[[group(0), binding(2)]] var t_u : texture_2d<u32>;
+@group(0) @binding(0) var t_f : texture_2d<f32>;
+@group(0) @binding(1) var t_i : texture_2d<i32>;
+@group(0) @binding(2) var t_u : texture_2d<u32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_f;
   _ = t_i;
diff --git a/test/types/texture/sampled/2d.wgsl.expected.wgsl b/test/types/texture/sampled/2d.wgsl.expected.wgsl
index 7536291..007b85f 100644
--- a/test/types/texture/sampled/2d.wgsl.expected.wgsl
+++ b/test/types/texture/sampled/2d.wgsl.expected.wgsl
@@ -1,10 +1,10 @@
-[[group(0), binding(0)]] var t_f : texture_2d<f32>;
+@group(0) @binding(0) var t_f : texture_2d<f32>;
 
-[[group(0), binding(1)]] var t_i : texture_2d<i32>;
+@group(0) @binding(1) var t_i : texture_2d<i32>;
 
-[[group(0), binding(2)]] var t_u : texture_2d<u32>;
+@group(0) @binding(2) var t_u : texture_2d<u32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_f;
   _ = t_i;
diff --git a/test/types/texture/sampled/2d_array.wgsl b/test/types/texture/sampled/2d_array.wgsl
index ff687c1..1dcfc6c 100644
--- a/test/types/texture/sampled/2d_array.wgsl
+++ b/test/types/texture/sampled/2d_array.wgsl
@@ -1,8 +1,8 @@
-[[group(0), binding(0)]] var t_f : texture_2d_array<f32>;
-[[group(0), binding(1)]] var t_i : texture_2d_array<i32>;
-[[group(0), binding(2)]] var t_u : texture_2d_array<u32>;
+@group(0) @binding(0) var t_f : texture_2d_array<f32>;
+@group(0) @binding(1) var t_i : texture_2d_array<i32>;
+@group(0) @binding(2) var t_u : texture_2d_array<u32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_f;
   _ = t_i;
diff --git a/test/types/texture/sampled/2d_array.wgsl.expected.wgsl b/test/types/texture/sampled/2d_array.wgsl.expected.wgsl
index 487e672..5201bbe 100644
--- a/test/types/texture/sampled/2d_array.wgsl.expected.wgsl
+++ b/test/types/texture/sampled/2d_array.wgsl.expected.wgsl
@@ -1,10 +1,10 @@
-[[group(0), binding(0)]] var t_f : texture_2d_array<f32>;
+@group(0) @binding(0) var t_f : texture_2d_array<f32>;
 
-[[group(0), binding(1)]] var t_i : texture_2d_array<i32>;
+@group(0) @binding(1) var t_i : texture_2d_array<i32>;
 
-[[group(0), binding(2)]] var t_u : texture_2d_array<u32>;
+@group(0) @binding(2) var t_u : texture_2d_array<u32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_f;
   _ = t_i;
diff --git a/test/types/texture/sampled/3d.wgsl b/test/types/texture/sampled/3d.wgsl
index cd8f0ec..37a525e 100644
--- a/test/types/texture/sampled/3d.wgsl
+++ b/test/types/texture/sampled/3d.wgsl
@@ -1,8 +1,8 @@
-[[group(0), binding(0)]] var t_f : texture_3d<f32>;
-[[group(0), binding(1)]] var t_i : texture_3d<i32>;
-[[group(0), binding(2)]] var t_u : texture_3d<u32>;
+@group(0) @binding(0) var t_f : texture_3d<f32>;
+@group(0) @binding(1) var t_i : texture_3d<i32>;
+@group(0) @binding(2) var t_u : texture_3d<u32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_f;
   _ = t_i;
diff --git a/test/types/texture/sampled/3d.wgsl.expected.wgsl b/test/types/texture/sampled/3d.wgsl.expected.wgsl
index ddfc2db..747bc8f 100644
--- a/test/types/texture/sampled/3d.wgsl.expected.wgsl
+++ b/test/types/texture/sampled/3d.wgsl.expected.wgsl
@@ -1,10 +1,10 @@
-[[group(0), binding(0)]] var t_f : texture_3d<f32>;
+@group(0) @binding(0) var t_f : texture_3d<f32>;
 
-[[group(0), binding(1)]] var t_i : texture_3d<i32>;
+@group(0) @binding(1) var t_i : texture_3d<i32>;
 
-[[group(0), binding(2)]] var t_u : texture_3d<u32>;
+@group(0) @binding(2) var t_u : texture_3d<u32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_f;
   _ = t_i;
diff --git a/test/types/texture/sampled/cube.wgsl b/test/types/texture/sampled/cube.wgsl
index 3e1d8f0..89859e9 100644
--- a/test/types/texture/sampled/cube.wgsl
+++ b/test/types/texture/sampled/cube.wgsl
@@ -1,8 +1,8 @@
-[[group(0), binding(0)]] var t_f : texture_cube<f32>;
-[[group(0), binding(1)]] var t_i : texture_cube<i32>;
-[[group(0), binding(2)]] var t_u : texture_cube<u32>;
+@group(0) @binding(0) var t_f : texture_cube<f32>;
+@group(0) @binding(1) var t_i : texture_cube<i32>;
+@group(0) @binding(2) var t_u : texture_cube<u32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_f;
   _ = t_i;
diff --git a/test/types/texture/sampled/cube.wgsl.expected.wgsl b/test/types/texture/sampled/cube.wgsl.expected.wgsl
index 151c68f..28c6881 100644
--- a/test/types/texture/sampled/cube.wgsl.expected.wgsl
+++ b/test/types/texture/sampled/cube.wgsl.expected.wgsl
@@ -1,10 +1,10 @@
-[[group(0), binding(0)]] var t_f : texture_cube<f32>;
+@group(0) @binding(0) var t_f : texture_cube<f32>;
 
-[[group(0), binding(1)]] var t_i : texture_cube<i32>;
+@group(0) @binding(1) var t_i : texture_cube<i32>;
 
-[[group(0), binding(2)]] var t_u : texture_cube<u32>;
+@group(0) @binding(2) var t_u : texture_cube<u32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_f;
   _ = t_i;
diff --git a/test/types/texture/sampled/cube_array.wgsl b/test/types/texture/sampled/cube_array.wgsl
index e3bb1b1..c7249c8 100644
--- a/test/types/texture/sampled/cube_array.wgsl
+++ b/test/types/texture/sampled/cube_array.wgsl
@@ -1,8 +1,8 @@
-[[group(0), binding(0)]] var t_f : texture_cube_array<f32>;
-[[group(0), binding(1)]] var t_i : texture_cube_array<i32>;
-[[group(0), binding(2)]] var t_u : texture_cube_array<u32>;
+@group(0) @binding(0) var t_f : texture_cube_array<f32>;
+@group(0) @binding(1) var t_i : texture_cube_array<i32>;
+@group(0) @binding(2) var t_u : texture_cube_array<u32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_f;
   _ = t_i;
diff --git a/test/types/texture/sampled/cube_array.wgsl.expected.wgsl b/test/types/texture/sampled/cube_array.wgsl.expected.wgsl
index bb5c804..12dc114 100644
--- a/test/types/texture/sampled/cube_array.wgsl.expected.wgsl
+++ b/test/types/texture/sampled/cube_array.wgsl.expected.wgsl
@@ -1,10 +1,10 @@
-[[group(0), binding(0)]] var t_f : texture_cube_array<f32>;
+@group(0) @binding(0) var t_f : texture_cube_array<f32>;
 
-[[group(0), binding(1)]] var t_i : texture_cube_array<i32>;
+@group(0) @binding(1) var t_i : texture_cube_array<i32>;
 
-[[group(0), binding(2)]] var t_u : texture_cube_array<u32>;
+@group(0) @binding(2) var t_u : texture_cube_array<u32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_f;
   _ = t_i;
diff --git a/test/types/texture/storage/1d.wgsl b/test/types/texture/storage/1d.wgsl
index 939b921..7adad9e 100644
--- a/test/types/texture/storage/1d.wgsl
+++ b/test/types/texture/storage/1d.wgsl
@@ -1,21 +1,21 @@
-[[group(0), binding(0)]] var t_rgba8unorm : texture_storage_1d<rgba8unorm, write>;
-[[group(0), binding(1)]] var t_rgba8snorm : texture_storage_1d<rgba8snorm, write>;
-[[group(0), binding(2)]] var t_rgba8uint : texture_storage_1d<rgba8uint, write>;
-[[group(0), binding(3)]] var t_rgba8sint : texture_storage_1d<rgba8sint, write>;
-[[group(0), binding(4)]] var t_rgba16uint : texture_storage_1d<rgba16uint, write>;
-[[group(0), binding(5)]] var t_rgba16sint : texture_storage_1d<rgba16sint, write>;
-[[group(0), binding(6)]] var t_rgba16float : texture_storage_1d<rgba16float, write>;
-[[group(0), binding(7)]] var t_r32uint : texture_storage_1d<r32uint, write>;
-[[group(0), binding(8)]] var t_r32sint : texture_storage_1d<r32sint, write>;
-[[group(0), binding(9)]] var t_r32float : texture_storage_1d<r32float, write>;
-[[group(0), binding(10)]] var t_rg32uint : texture_storage_1d<rg32uint, write>;
-[[group(0), binding(11)]] var t_rg32sint : texture_storage_1d<rg32sint, write>;
-[[group(0), binding(12)]] var t_rg32float : texture_storage_1d<rg32float, write>;
-[[group(0), binding(13)]] var t_rgba32uint : texture_storage_1d<rgba32uint, write>;
-[[group(0), binding(14)]] var t_rgba32sint : texture_storage_1d<rgba32sint, write>;
-[[group(0), binding(15)]] var t_rgba32float : texture_storage_1d<rgba32float, write>;
+@group(0) @binding(0) var t_rgba8unorm : texture_storage_1d<rgba8unorm, write>;
+@group(0) @binding(1) var t_rgba8snorm : texture_storage_1d<rgba8snorm, write>;
+@group(0) @binding(2) var t_rgba8uint : texture_storage_1d<rgba8uint, write>;
+@group(0) @binding(3) var t_rgba8sint : texture_storage_1d<rgba8sint, write>;
+@group(0) @binding(4) var t_rgba16uint : texture_storage_1d<rgba16uint, write>;
+@group(0) @binding(5) var t_rgba16sint : texture_storage_1d<rgba16sint, write>;
+@group(0) @binding(6) var t_rgba16float : texture_storage_1d<rgba16float, write>;
+@group(0) @binding(7) var t_r32uint : texture_storage_1d<r32uint, write>;
+@group(0) @binding(8) var t_r32sint : texture_storage_1d<r32sint, write>;
+@group(0) @binding(9) var t_r32float : texture_storage_1d<r32float, write>;
+@group(0) @binding(10) var t_rg32uint : texture_storage_1d<rg32uint, write>;
+@group(0) @binding(11) var t_rg32sint : texture_storage_1d<rg32sint, write>;
+@group(0) @binding(12) var t_rg32float : texture_storage_1d<rg32float, write>;
+@group(0) @binding(13) var t_rgba32uint : texture_storage_1d<rgba32uint, write>;
+@group(0) @binding(14) var t_rgba32sint : texture_storage_1d<rgba32sint, write>;
+@group(0) @binding(15) var t_rgba32float : texture_storage_1d<rgba32float, write>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_rgba8unorm;
   _ = t_rgba8snorm;
diff --git a/test/types/texture/storage/1d.wgsl.expected.wgsl b/test/types/texture/storage/1d.wgsl.expected.wgsl
index 72ebb80..a3e5555 100644
--- a/test/types/texture/storage/1d.wgsl.expected.wgsl
+++ b/test/types/texture/storage/1d.wgsl.expected.wgsl
@@ -1,36 +1,36 @@
-[[group(0), binding(0)]] var t_rgba8unorm : texture_storage_1d<rgba8unorm, write>;
+@group(0) @binding(0) var t_rgba8unorm : texture_storage_1d<rgba8unorm, write>;
 
-[[group(0), binding(1)]] var t_rgba8snorm : texture_storage_1d<rgba8snorm, write>;
+@group(0) @binding(1) var t_rgba8snorm : texture_storage_1d<rgba8snorm, write>;
 
-[[group(0), binding(2)]] var t_rgba8uint : texture_storage_1d<rgba8uint, write>;
+@group(0) @binding(2) var t_rgba8uint : texture_storage_1d<rgba8uint, write>;
 
-[[group(0), binding(3)]] var t_rgba8sint : texture_storage_1d<rgba8sint, write>;
+@group(0) @binding(3) var t_rgba8sint : texture_storage_1d<rgba8sint, write>;
 
-[[group(0), binding(4)]] var t_rgba16uint : texture_storage_1d<rgba16uint, write>;
+@group(0) @binding(4) var t_rgba16uint : texture_storage_1d<rgba16uint, write>;
 
-[[group(0), binding(5)]] var t_rgba16sint : texture_storage_1d<rgba16sint, write>;
+@group(0) @binding(5) var t_rgba16sint : texture_storage_1d<rgba16sint, write>;
 
-[[group(0), binding(6)]] var t_rgba16float : texture_storage_1d<rgba16float, write>;
+@group(0) @binding(6) var t_rgba16float : texture_storage_1d<rgba16float, write>;
 
-[[group(0), binding(7)]] var t_r32uint : texture_storage_1d<r32uint, write>;
+@group(0) @binding(7) var t_r32uint : texture_storage_1d<r32uint, write>;
 
-[[group(0), binding(8)]] var t_r32sint : texture_storage_1d<r32sint, write>;
+@group(0) @binding(8) var t_r32sint : texture_storage_1d<r32sint, write>;
 
-[[group(0), binding(9)]] var t_r32float : texture_storage_1d<r32float, write>;
+@group(0) @binding(9) var t_r32float : texture_storage_1d<r32float, write>;
 
-[[group(0), binding(10)]] var t_rg32uint : texture_storage_1d<rg32uint, write>;
+@group(0) @binding(10) var t_rg32uint : texture_storage_1d<rg32uint, write>;
 
-[[group(0), binding(11)]] var t_rg32sint : texture_storage_1d<rg32sint, write>;
+@group(0) @binding(11) var t_rg32sint : texture_storage_1d<rg32sint, write>;
 
-[[group(0), binding(12)]] var t_rg32float : texture_storage_1d<rg32float, write>;
+@group(0) @binding(12) var t_rg32float : texture_storage_1d<rg32float, write>;
 
-[[group(0), binding(13)]] var t_rgba32uint : texture_storage_1d<rgba32uint, write>;
+@group(0) @binding(13) var t_rgba32uint : texture_storage_1d<rgba32uint, write>;
 
-[[group(0), binding(14)]] var t_rgba32sint : texture_storage_1d<rgba32sint, write>;
+@group(0) @binding(14) var t_rgba32sint : texture_storage_1d<rgba32sint, write>;
 
-[[group(0), binding(15)]] var t_rgba32float : texture_storage_1d<rgba32float, write>;
+@group(0) @binding(15) var t_rgba32float : texture_storage_1d<rgba32float, write>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_rgba8unorm;
   _ = t_rgba8snorm;
diff --git a/test/types/texture/storage/2d.wgsl b/test/types/texture/storage/2d.wgsl
index 0ea57e9..44d0dfd 100644
--- a/test/types/texture/storage/2d.wgsl
+++ b/test/types/texture/storage/2d.wgsl
@@ -1,21 +1,21 @@
-[[group(0), binding(0)]] var t_rgba8unorm : texture_storage_2d<rgba8unorm, write>;
-[[group(0), binding(1)]] var t_rgba8snorm : texture_storage_2d<rgba8snorm, write>;
-[[group(0), binding(2)]] var t_rgba8uint : texture_storage_2d<rgba8uint, write>;
-[[group(0), binding(3)]] var t_rgba8sint : texture_storage_2d<rgba8sint, write>;
-[[group(0), binding(4)]] var t_rgba16uint : texture_storage_2d<rgba16uint, write>;
-[[group(0), binding(5)]] var t_rgba16sint : texture_storage_2d<rgba16sint, write>;
-[[group(0), binding(6)]] var t_rgba16float : texture_storage_2d<rgba16float, write>;
-[[group(0), binding(7)]] var t_r32uint : texture_storage_2d<r32uint, write>;
-[[group(0), binding(8)]] var t_r32sint : texture_storage_2d<r32sint, write>;
-[[group(0), binding(9)]] var t_r32float : texture_storage_2d<r32float, write>;
-[[group(0), binding(10)]] var t_rg32uint : texture_storage_2d<rg32uint, write>;
-[[group(0), binding(11)]] var t_rg32sint : texture_storage_2d<rg32sint, write>;
-[[group(0), binding(12)]] var t_rg32float : texture_storage_2d<rg32float, write>;
-[[group(0), binding(13)]] var t_rgba32uint : texture_storage_2d<rgba32uint, write>;
-[[group(0), binding(14)]] var t_rgba32sint : texture_storage_2d<rgba32sint, write>;
-[[group(0), binding(15)]] var t_rgba32float : texture_storage_2d<rgba32float, write>;
+@group(0) @binding(0) var t_rgba8unorm : texture_storage_2d<rgba8unorm, write>;
+@group(0) @binding(1) var t_rgba8snorm : texture_storage_2d<rgba8snorm, write>;
+@group(0) @binding(2) var t_rgba8uint : texture_storage_2d<rgba8uint, write>;
+@group(0) @binding(3) var t_rgba8sint : texture_storage_2d<rgba8sint, write>;
+@group(0) @binding(4) var t_rgba16uint : texture_storage_2d<rgba16uint, write>;
+@group(0) @binding(5) var t_rgba16sint : texture_storage_2d<rgba16sint, write>;
+@group(0) @binding(6) var t_rgba16float : texture_storage_2d<rgba16float, write>;
+@group(0) @binding(7) var t_r32uint : texture_storage_2d<r32uint, write>;
+@group(0) @binding(8) var t_r32sint : texture_storage_2d<r32sint, write>;
+@group(0) @binding(9) var t_r32float : texture_storage_2d<r32float, write>;
+@group(0) @binding(10) var t_rg32uint : texture_storage_2d<rg32uint, write>;
+@group(0) @binding(11) var t_rg32sint : texture_storage_2d<rg32sint, write>;
+@group(0) @binding(12) var t_rg32float : texture_storage_2d<rg32float, write>;
+@group(0) @binding(13) var t_rgba32uint : texture_storage_2d<rgba32uint, write>;
+@group(0) @binding(14) var t_rgba32sint : texture_storage_2d<rgba32sint, write>;
+@group(0) @binding(15) var t_rgba32float : texture_storage_2d<rgba32float, write>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_rgba8unorm;
   _ = t_rgba8snorm;
diff --git a/test/types/texture/storage/2d.wgsl.expected.wgsl b/test/types/texture/storage/2d.wgsl.expected.wgsl
index 960e724..97824ad 100644
--- a/test/types/texture/storage/2d.wgsl.expected.wgsl
+++ b/test/types/texture/storage/2d.wgsl.expected.wgsl
@@ -1,36 +1,36 @@
-[[group(0), binding(0)]] var t_rgba8unorm : texture_storage_2d<rgba8unorm, write>;
+@group(0) @binding(0) var t_rgba8unorm : texture_storage_2d<rgba8unorm, write>;
 
-[[group(0), binding(1)]] var t_rgba8snorm : texture_storage_2d<rgba8snorm, write>;
+@group(0) @binding(1) var t_rgba8snorm : texture_storage_2d<rgba8snorm, write>;
 
-[[group(0), binding(2)]] var t_rgba8uint : texture_storage_2d<rgba8uint, write>;
+@group(0) @binding(2) var t_rgba8uint : texture_storage_2d<rgba8uint, write>;
 
-[[group(0), binding(3)]] var t_rgba8sint : texture_storage_2d<rgba8sint, write>;
+@group(0) @binding(3) var t_rgba8sint : texture_storage_2d<rgba8sint, write>;
 
-[[group(0), binding(4)]] var t_rgba16uint : texture_storage_2d<rgba16uint, write>;
+@group(0) @binding(4) var t_rgba16uint : texture_storage_2d<rgba16uint, write>;
 
-[[group(0), binding(5)]] var t_rgba16sint : texture_storage_2d<rgba16sint, write>;
+@group(0) @binding(5) var t_rgba16sint : texture_storage_2d<rgba16sint, write>;
 
-[[group(0), binding(6)]] var t_rgba16float : texture_storage_2d<rgba16float, write>;
+@group(0) @binding(6) var t_rgba16float : texture_storage_2d<rgba16float, write>;
 
-[[group(0), binding(7)]] var t_r32uint : texture_storage_2d<r32uint, write>;
+@group(0) @binding(7) var t_r32uint : texture_storage_2d<r32uint, write>;
 
-[[group(0), binding(8)]] var t_r32sint : texture_storage_2d<r32sint, write>;
+@group(0) @binding(8) var t_r32sint : texture_storage_2d<r32sint, write>;
 
-[[group(0), binding(9)]] var t_r32float : texture_storage_2d<r32float, write>;
+@group(0) @binding(9) var t_r32float : texture_storage_2d<r32float, write>;
 
-[[group(0), binding(10)]] var t_rg32uint : texture_storage_2d<rg32uint, write>;
+@group(0) @binding(10) var t_rg32uint : texture_storage_2d<rg32uint, write>;
 
-[[group(0), binding(11)]] var t_rg32sint : texture_storage_2d<rg32sint, write>;
+@group(0) @binding(11) var t_rg32sint : texture_storage_2d<rg32sint, write>;
 
-[[group(0), binding(12)]] var t_rg32float : texture_storage_2d<rg32float, write>;
+@group(0) @binding(12) var t_rg32float : texture_storage_2d<rg32float, write>;
 
-[[group(0), binding(13)]] var t_rgba32uint : texture_storage_2d<rgba32uint, write>;
+@group(0) @binding(13) var t_rgba32uint : texture_storage_2d<rgba32uint, write>;
 
-[[group(0), binding(14)]] var t_rgba32sint : texture_storage_2d<rgba32sint, write>;
+@group(0) @binding(14) var t_rgba32sint : texture_storage_2d<rgba32sint, write>;
 
-[[group(0), binding(15)]] var t_rgba32float : texture_storage_2d<rgba32float, write>;
+@group(0) @binding(15) var t_rgba32float : texture_storage_2d<rgba32float, write>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_rgba8unorm;
   _ = t_rgba8snorm;
diff --git a/test/types/texture/storage/2d_array.wgsl b/test/types/texture/storage/2d_array.wgsl
index 15a3f80..6919fda 100644
--- a/test/types/texture/storage/2d_array.wgsl
+++ b/test/types/texture/storage/2d_array.wgsl
@@ -1,21 +1,21 @@
-[[group(0), binding(0)]] var t_rgba8unorm : texture_storage_2d_array<rgba8unorm, write>;
-[[group(0), binding(1)]] var t_rgba8snorm : texture_storage_2d_array<rgba8snorm, write>;
-[[group(0), binding(2)]] var t_rgba8uint : texture_storage_2d_array<rgba8uint, write>;
-[[group(0), binding(3)]] var t_rgba8sint : texture_storage_2d_array<rgba8sint, write>;
-[[group(0), binding(4)]] var t_rgba16uint : texture_storage_2d_array<rgba16uint, write>;
-[[group(0), binding(5)]] var t_rgba16sint : texture_storage_2d_array<rgba16sint, write>;
-[[group(0), binding(6)]] var t_rgba16float : texture_storage_2d_array<rgba16float, write>;
-[[group(0), binding(7)]] var t_r32uint : texture_storage_2d_array<r32uint, write>;
-[[group(0), binding(8)]] var t_r32sint : texture_storage_2d_array<r32sint, write>;
-[[group(0), binding(9)]] var t_r32float : texture_storage_2d_array<r32float, write>;
-[[group(0), binding(10)]] var t_rg32uint : texture_storage_2d_array<rg32uint, write>;
-[[group(0), binding(11)]] var t_rg32sint : texture_storage_2d_array<rg32sint, write>;
-[[group(0), binding(12)]] var t_rg32float : texture_storage_2d_array<rg32float, write>;
-[[group(0), binding(13)]] var t_rgba32uint : texture_storage_2d_array<rgba32uint, write>;
-[[group(0), binding(14)]] var t_rgba32sint : texture_storage_2d_array<rgba32sint, write>;
-[[group(0), binding(15)]] var t_rgba32float : texture_storage_2d_array<rgba32float, write>;
+@group(0) @binding(0) var t_rgba8unorm : texture_storage_2d_array<rgba8unorm, write>;
+@group(0) @binding(1) var t_rgba8snorm : texture_storage_2d_array<rgba8snorm, write>;
+@group(0) @binding(2) var t_rgba8uint : texture_storage_2d_array<rgba8uint, write>;
+@group(0) @binding(3) var t_rgba8sint : texture_storage_2d_array<rgba8sint, write>;
+@group(0) @binding(4) var t_rgba16uint : texture_storage_2d_array<rgba16uint, write>;
+@group(0) @binding(5) var t_rgba16sint : texture_storage_2d_array<rgba16sint, write>;
+@group(0) @binding(6) var t_rgba16float : texture_storage_2d_array<rgba16float, write>;
+@group(0) @binding(7) var t_r32uint : texture_storage_2d_array<r32uint, write>;
+@group(0) @binding(8) var t_r32sint : texture_storage_2d_array<r32sint, write>;
+@group(0) @binding(9) var t_r32float : texture_storage_2d_array<r32float, write>;
+@group(0) @binding(10) var t_rg32uint : texture_storage_2d_array<rg32uint, write>;
+@group(0) @binding(11) var t_rg32sint : texture_storage_2d_array<rg32sint, write>;
+@group(0) @binding(12) var t_rg32float : texture_storage_2d_array<rg32float, write>;
+@group(0) @binding(13) var t_rgba32uint : texture_storage_2d_array<rgba32uint, write>;
+@group(0) @binding(14) var t_rgba32sint : texture_storage_2d_array<rgba32sint, write>;
+@group(0) @binding(15) var t_rgba32float : texture_storage_2d_array<rgba32float, write>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_rgba8unorm;
   _ = t_rgba8snorm;
diff --git a/test/types/texture/storage/2d_array.wgsl.expected.wgsl b/test/types/texture/storage/2d_array.wgsl.expected.wgsl
index c541689..c4aa337 100644
--- a/test/types/texture/storage/2d_array.wgsl.expected.wgsl
+++ b/test/types/texture/storage/2d_array.wgsl.expected.wgsl
@@ -1,36 +1,36 @@
-[[group(0), binding(0)]] var t_rgba8unorm : texture_storage_2d_array<rgba8unorm, write>;
+@group(0) @binding(0) var t_rgba8unorm : texture_storage_2d_array<rgba8unorm, write>;
 
-[[group(0), binding(1)]] var t_rgba8snorm : texture_storage_2d_array<rgba8snorm, write>;
+@group(0) @binding(1) var t_rgba8snorm : texture_storage_2d_array<rgba8snorm, write>;
 
-[[group(0), binding(2)]] var t_rgba8uint : texture_storage_2d_array<rgba8uint, write>;
+@group(0) @binding(2) var t_rgba8uint : texture_storage_2d_array<rgba8uint, write>;
 
-[[group(0), binding(3)]] var t_rgba8sint : texture_storage_2d_array<rgba8sint, write>;
+@group(0) @binding(3) var t_rgba8sint : texture_storage_2d_array<rgba8sint, write>;
 
-[[group(0), binding(4)]] var t_rgba16uint : texture_storage_2d_array<rgba16uint, write>;
+@group(0) @binding(4) var t_rgba16uint : texture_storage_2d_array<rgba16uint, write>;
 
-[[group(0), binding(5)]] var t_rgba16sint : texture_storage_2d_array<rgba16sint, write>;
+@group(0) @binding(5) var t_rgba16sint : texture_storage_2d_array<rgba16sint, write>;
 
-[[group(0), binding(6)]] var t_rgba16float : texture_storage_2d_array<rgba16float, write>;
+@group(0) @binding(6) var t_rgba16float : texture_storage_2d_array<rgba16float, write>;
 
-[[group(0), binding(7)]] var t_r32uint : texture_storage_2d_array<r32uint, write>;
+@group(0) @binding(7) var t_r32uint : texture_storage_2d_array<r32uint, write>;
 
-[[group(0), binding(8)]] var t_r32sint : texture_storage_2d_array<r32sint, write>;
+@group(0) @binding(8) var t_r32sint : texture_storage_2d_array<r32sint, write>;
 
-[[group(0), binding(9)]] var t_r32float : texture_storage_2d_array<r32float, write>;
+@group(0) @binding(9) var t_r32float : texture_storage_2d_array<r32float, write>;
 
-[[group(0), binding(10)]] var t_rg32uint : texture_storage_2d_array<rg32uint, write>;
+@group(0) @binding(10) var t_rg32uint : texture_storage_2d_array<rg32uint, write>;
 
-[[group(0), binding(11)]] var t_rg32sint : texture_storage_2d_array<rg32sint, write>;
+@group(0) @binding(11) var t_rg32sint : texture_storage_2d_array<rg32sint, write>;
 
-[[group(0), binding(12)]] var t_rg32float : texture_storage_2d_array<rg32float, write>;
+@group(0) @binding(12) var t_rg32float : texture_storage_2d_array<rg32float, write>;
 
-[[group(0), binding(13)]] var t_rgba32uint : texture_storage_2d_array<rgba32uint, write>;
+@group(0) @binding(13) var t_rgba32uint : texture_storage_2d_array<rgba32uint, write>;
 
-[[group(0), binding(14)]] var t_rgba32sint : texture_storage_2d_array<rgba32sint, write>;
+@group(0) @binding(14) var t_rgba32sint : texture_storage_2d_array<rgba32sint, write>;
 
-[[group(0), binding(15)]] var t_rgba32float : texture_storage_2d_array<rgba32float, write>;
+@group(0) @binding(15) var t_rgba32float : texture_storage_2d_array<rgba32float, write>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_rgba8unorm;
   _ = t_rgba8snorm;
diff --git a/test/types/texture/storage/3d.wgsl b/test/types/texture/storage/3d.wgsl
index 915be52..710d0d3 100644
--- a/test/types/texture/storage/3d.wgsl
+++ b/test/types/texture/storage/3d.wgsl
@@ -1,21 +1,21 @@
-[[group(0), binding(0)]] var t_rgba8unorm : texture_storage_3d<rgba8unorm, write>;
-[[group(0), binding(1)]] var t_rgba8snorm : texture_storage_3d<rgba8snorm, write>;
-[[group(0), binding(2)]] var t_rgba8uint : texture_storage_3d<rgba8uint, write>;
-[[group(0), binding(3)]] var t_rgba8sint : texture_storage_3d<rgba8sint, write>;
-[[group(0), binding(4)]] var t_rgba16uint : texture_storage_3d<rgba16uint, write>;
-[[group(0), binding(5)]] var t_rgba16sint : texture_storage_3d<rgba16sint, write>;
-[[group(0), binding(6)]] var t_rgba16float : texture_storage_3d<rgba16float, write>;
-[[group(0), binding(7)]] var t_r32uint : texture_storage_3d<r32uint, write>;
-[[group(0), binding(8)]] var t_r32sint : texture_storage_3d<r32sint, write>;
-[[group(0), binding(9)]] var t_r32float : texture_storage_3d<r32float, write>;
-[[group(0), binding(10)]] var t_rg32uint : texture_storage_3d<rg32uint, write>;
-[[group(0), binding(11)]] var t_rg32sint : texture_storage_3d<rg32sint, write>;
-[[group(0), binding(12)]] var t_rg32float : texture_storage_3d<rg32float, write>;
-[[group(0), binding(13)]] var t_rgba32uint : texture_storage_3d<rgba32uint, write>;
-[[group(0), binding(14)]] var t_rgba32sint : texture_storage_3d<rgba32sint, write>;
-[[group(0), binding(15)]] var t_rgba32float : texture_storage_3d<rgba32float, write>;
+@group(0) @binding(0) var t_rgba8unorm : texture_storage_3d<rgba8unorm, write>;
+@group(0) @binding(1) var t_rgba8snorm : texture_storage_3d<rgba8snorm, write>;
+@group(0) @binding(2) var t_rgba8uint : texture_storage_3d<rgba8uint, write>;
+@group(0) @binding(3) var t_rgba8sint : texture_storage_3d<rgba8sint, write>;
+@group(0) @binding(4) var t_rgba16uint : texture_storage_3d<rgba16uint, write>;
+@group(0) @binding(5) var t_rgba16sint : texture_storage_3d<rgba16sint, write>;
+@group(0) @binding(6) var t_rgba16float : texture_storage_3d<rgba16float, write>;
+@group(0) @binding(7) var t_r32uint : texture_storage_3d<r32uint, write>;
+@group(0) @binding(8) var t_r32sint : texture_storage_3d<r32sint, write>;
+@group(0) @binding(9) var t_r32float : texture_storage_3d<r32float, write>;
+@group(0) @binding(10) var t_rg32uint : texture_storage_3d<rg32uint, write>;
+@group(0) @binding(11) var t_rg32sint : texture_storage_3d<rg32sint, write>;
+@group(0) @binding(12) var t_rg32float : texture_storage_3d<rg32float, write>;
+@group(0) @binding(13) var t_rgba32uint : texture_storage_3d<rgba32uint, write>;
+@group(0) @binding(14) var t_rgba32sint : texture_storage_3d<rgba32sint, write>;
+@group(0) @binding(15) var t_rgba32float : texture_storage_3d<rgba32float, write>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_rgba8unorm;
   _ = t_rgba8snorm;
diff --git a/test/types/texture/storage/3d.wgsl.expected.wgsl b/test/types/texture/storage/3d.wgsl.expected.wgsl
index af8ae71..c3ba672 100644
--- a/test/types/texture/storage/3d.wgsl.expected.wgsl
+++ b/test/types/texture/storage/3d.wgsl.expected.wgsl
@@ -1,36 +1,36 @@
-[[group(0), binding(0)]] var t_rgba8unorm : texture_storage_3d<rgba8unorm, write>;
+@group(0) @binding(0) var t_rgba8unorm : texture_storage_3d<rgba8unorm, write>;
 
-[[group(0), binding(1)]] var t_rgba8snorm : texture_storage_3d<rgba8snorm, write>;
+@group(0) @binding(1) var t_rgba8snorm : texture_storage_3d<rgba8snorm, write>;
 
-[[group(0), binding(2)]] var t_rgba8uint : texture_storage_3d<rgba8uint, write>;
+@group(0) @binding(2) var t_rgba8uint : texture_storage_3d<rgba8uint, write>;
 
-[[group(0), binding(3)]] var t_rgba8sint : texture_storage_3d<rgba8sint, write>;
+@group(0) @binding(3) var t_rgba8sint : texture_storage_3d<rgba8sint, write>;
 
-[[group(0), binding(4)]] var t_rgba16uint : texture_storage_3d<rgba16uint, write>;
+@group(0) @binding(4) var t_rgba16uint : texture_storage_3d<rgba16uint, write>;
 
-[[group(0), binding(5)]] var t_rgba16sint : texture_storage_3d<rgba16sint, write>;
+@group(0) @binding(5) var t_rgba16sint : texture_storage_3d<rgba16sint, write>;
 
-[[group(0), binding(6)]] var t_rgba16float : texture_storage_3d<rgba16float, write>;
+@group(0) @binding(6) var t_rgba16float : texture_storage_3d<rgba16float, write>;
 
-[[group(0), binding(7)]] var t_r32uint : texture_storage_3d<r32uint, write>;
+@group(0) @binding(7) var t_r32uint : texture_storage_3d<r32uint, write>;
 
-[[group(0), binding(8)]] var t_r32sint : texture_storage_3d<r32sint, write>;
+@group(0) @binding(8) var t_r32sint : texture_storage_3d<r32sint, write>;
 
-[[group(0), binding(9)]] var t_r32float : texture_storage_3d<r32float, write>;
+@group(0) @binding(9) var t_r32float : texture_storage_3d<r32float, write>;
 
-[[group(0), binding(10)]] var t_rg32uint : texture_storage_3d<rg32uint, write>;
+@group(0) @binding(10) var t_rg32uint : texture_storage_3d<rg32uint, write>;
 
-[[group(0), binding(11)]] var t_rg32sint : texture_storage_3d<rg32sint, write>;
+@group(0) @binding(11) var t_rg32sint : texture_storage_3d<rg32sint, write>;
 
-[[group(0), binding(12)]] var t_rg32float : texture_storage_3d<rg32float, write>;
+@group(0) @binding(12) var t_rg32float : texture_storage_3d<rg32float, write>;
 
-[[group(0), binding(13)]] var t_rgba32uint : texture_storage_3d<rgba32uint, write>;
+@group(0) @binding(13) var t_rgba32uint : texture_storage_3d<rgba32uint, write>;
 
-[[group(0), binding(14)]] var t_rgba32sint : texture_storage_3d<rgba32sint, write>;
+@group(0) @binding(14) var t_rgba32sint : texture_storage_3d<rgba32sint, write>;
 
-[[group(0), binding(15)]] var t_rgba32float : texture_storage_3d<rgba32float, write>;
+@group(0) @binding(15) var t_rgba32float : texture_storage_3d<rgba32float, write>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = t_rgba8unorm;
   _ = t_rgba8snorm;
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Back_SingleBlock_Back.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Back_SingleBlock_Back.spvasm.expected.hlsl
index ad191b8..545d602 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Back_SingleBlock_Back.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Back_SingleBlock_Back.spvasm.expected.hlsl
@@ -12,7 +12,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Back_SingleBlock_Back.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Back_SingleBlock_Back.spvasm.expected.msl
index ad191b8..545d602 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Back_SingleBlock_Back.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Back_SingleBlock_Back.spvasm.expected.msl
@@ -12,7 +12,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Back_SingleBlock_Back.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Back_SingleBlock_Back.spvasm.expected.spvasm
index ad191b8..9e7e684 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Back_SingleBlock_Back.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Back_SingleBlock_Back.spvasm.expected.spvasm
@@ -1,20 +1,20 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  var_1 = 0u;
-  loop {
-    var_1 = 1u;
-  }
-  var_1 = 5u;
-  return;
-}
+fn main_1
+var_1 = 0u ;
+loop
+var_1 = 1u ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
+var_1 = 5u ;
+return ;
 
-error: loop does not exit
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Back_SingleBlock_Back.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Back_SingleBlock_Back.spvasm.expected.wgsl
index ad191b8..545d602 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Back_SingleBlock_Back.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Back_SingleBlock_Back.spvasm.expected.wgsl
@@ -12,7 +12,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional.spvasm.expected.hlsl
index 791ac1a..ed3372c 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional.spvasm.expected.hlsl
@@ -22,7 +22,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional.spvasm.expected.msl
index 791ac1a..ed3372c 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional.spvasm.expected.msl
@@ -22,7 +22,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional.spvasm.expected.spvasm
index 791ac1a..b9ead81 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional.spvasm.expected.spvasm
@@ -1,30 +1,30 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  var_1 = 0u;
-  loop {
-    var_1 = 1u;
-    var_1 = 2u;
-    if (true) {
-      var_1 = 3u;
-      continue;
-    }
-    var_1 = 4u;
+fn main_1
+var_1 = 0u ;
+loop
+var_1 = 1u ;
+var_1 = 2u ;
+if true
+var_1 = 3u ;
+continue ;
 
-    continuing {
-      var_1 = 5u;
-    }
-  }
-  var_1 = 6u;
-  return;
-}
+var_1 = 4u ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
+continuing
+var_1 = 5u ;
 
-error: loop does not exit
+
+var_1 = 6u ;
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional.spvasm.expected.wgsl
index 791ac1a..ed3372c 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional.spvasm.expected.wgsl
@@ -22,7 +22,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional_EmptyContinuing.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional_EmptyContinuing.spvasm.expected.hlsl
index 776810f..167379a 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional_EmptyContinuing.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional_EmptyContinuing.spvasm.expected.hlsl
@@ -18,7 +18,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional_EmptyContinuing.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional_EmptyContinuing.spvasm.expected.msl
index 776810f..167379a 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional_EmptyContinuing.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional_EmptyContinuing.spvasm.expected.msl
@@ -18,7 +18,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional_EmptyContinuing.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional_EmptyContinuing.spvasm.expected.spvasm
index 776810f..6c6758e 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional_EmptyContinuing.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional_EmptyContinuing.spvasm.expected.spvasm
@@ -1,26 +1,26 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  var_1 = 0u;
-  loop {
-    var_1 = 1u;
-    var_1 = 2u;
-    if (true) {
-      var_1 = 3u;
-      continue;
-    }
-    var_1 = 4u;
-  }
-  var_1 = 6u;
-  return;
-}
+fn main_1
+var_1 = 0u ;
+loop
+var_1 = 1u ;
+var_1 = 2u ;
+if true
+var_1 = 3u ;
+continue ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
+var_1 = 4u ;
 
-error: loop does not exit
+var_1 = 6u ;
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional_EmptyContinuing.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional_EmptyContinuing.spvasm.expected.wgsl
index 776810f..167379a 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional_EmptyContinuing.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional_EmptyContinuing.spvasm.expected.wgsl
@@ -18,7 +18,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Unconditional.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Unconditional.spvasm.expected.hlsl
index 99d5de3..586a7db 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Unconditional.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Unconditional.spvasm.expected.hlsl
@@ -17,7 +17,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Unconditional.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Unconditional.spvasm.expected.msl
index 99d5de3..586a7db 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Unconditional.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Unconditional.spvasm.expected.msl
@@ -17,7 +17,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Unconditional.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Unconditional.spvasm.expected.spvasm
index 99d5de3..b06f4ca 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Unconditional.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Unconditional.spvasm.expected.spvasm
@@ -1,25 +1,25 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  var_1 = 0u;
-  loop {
-    var_1 = 1u;
-    var_1 = 2u;
+fn main_1
+var_1 = 0u ;
+loop
+var_1 = 1u ;
+var_1 = 2u ;
 
-    continuing {
-      var_1 = 4u;
-    }
-  }
-  var_1 = 5u;
-  return;
-}
+continuing
+var_1 = 4u ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
 
-error: loop does not exit
+var_1 = 5u ;
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Unconditional.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Unconditional.spvasm.expected.wgsl
index 99d5de3..586a7db 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Unconditional.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_AfterHeader_Unconditional.spvasm.expected.wgsl
@@ -17,7 +17,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_FromHeader.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_FromHeader.spvasm.expected.hlsl
index d64a6b8..e76fca4 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_FromHeader.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_FromHeader.spvasm.expected.hlsl
@@ -16,7 +16,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_FromHeader.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_FromHeader.spvasm.expected.msl
index d64a6b8..e76fca4 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_FromHeader.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_FromHeader.spvasm.expected.msl
@@ -16,7 +16,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_FromHeader.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_FromHeader.spvasm.expected.spvasm
index d64a6b8..038fea8 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_FromHeader.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_FromHeader.spvasm.expected.spvasm
@@ -1,24 +1,24 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  var_1 = 0u;
-  loop {
-    var_1 = 1u;
+fn main_1
+var_1 = 0u ;
+loop
+var_1 = 1u ;
 
-    continuing {
-      var_1 = 4u;
-    }
-  }
-  var_1 = 5u;
-  return;
-}
+continuing
+var_1 = 4u ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
 
-error: loop does not exit
+var_1 = 5u ;
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_FromHeader.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_FromHeader.spvasm.expected.wgsl
index d64a6b8..e76fca4 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_FromHeader.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Continue_FromHeader.spvasm.expected.wgsl
@@ -16,7 +16,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnFalse.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnFalse.spvasm.expected.hlsl
index d678069..cc547df 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnFalse.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnFalse.spvasm.expected.hlsl
@@ -32,7 +32,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnFalse.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnFalse.spvasm.expected.msl
index d678069..cc547df 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnFalse.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnFalse.spvasm.expected.msl
@@ -32,7 +32,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnFalse.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnFalse.spvasm.expected.spvasm
index d678069..341c905 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnFalse.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnFalse.spvasm.expected.spvasm
@@ -1,40 +1,40 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  var_1 = 0u;
-  loop {
-    var_1 = 1u;
-    var_1 = 2u;
-    switch(42u) {
-      case 40u: {
-        var_1 = 40u;
-        if (false) {
-          continue;
-        }
-        fallthrough;
-      }
-      case 50u: {
-        var_1 = 50u;
-      }
-      default: {
-      }
-    }
-    var_1 = 3u;
+fn main_1
+var_1 = 0u ;
+loop
+var_1 = 1u ;
+var_1 = 2u ;
+switch 42u
+case 40u
+var_1 = 40u ;
+if false
+continue ;
 
-    continuing {
-      var_1 = 4u;
-    }
-  }
-  var_1 = 5u;
-  return;
-}
+fallthrough ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
+case 50u
+var_1 = 50u ;
 
-error: loop does not exit
+default
+
+
+var_1 = 3u ;
+
+continuing
+var_1 = 4u ;
+
+
+var_1 = 5u ;
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnFalse.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnFalse.spvasm.expected.wgsl
index d678069..cc547df 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnFalse.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnFalse.spvasm.expected.wgsl
@@ -32,7 +32,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnTrue.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnTrue.spvasm.expected.hlsl
index 6ee0306..181cd62 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnTrue.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnTrue.spvasm.expected.hlsl
@@ -33,7 +33,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnTrue.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnTrue.spvasm.expected.msl
index 6ee0306..181cd62 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnTrue.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnTrue.spvasm.expected.msl
@@ -33,7 +33,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnTrue.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnTrue.spvasm.expected.spvasm
index 6ee0306..a58bc55 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnTrue.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnTrue.spvasm.expected.spvasm
@@ -1,41 +1,41 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  var_1 = 0u;
-  loop {
-    var_1 = 1u;
-    var_1 = 2u;
-    switch(42u) {
-      case 40u: {
-        var_1 = 40u;
-        if (false) {
-        } else {
-          continue;
-        }
-        fallthrough;
-      }
-      case 50u: {
-        var_1 = 50u;
-      }
-      default: {
-      }
-    }
-    var_1 = 3u;
+fn main_1
+var_1 = 0u ;
+loop
+var_1 = 1u ;
+var_1 = 2u ;
+switch 42u
+case 40u
+var_1 = 40u ;
+if false
+else
+continue ;
 
-    continuing {
-      var_1 = 4u;
-    }
-  }
-  var_1 = 5u;
-  return;
-}
+fallthrough ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
+case 50u
+var_1 = 50u ;
 
-error: loop does not exit
+default
+
+
+var_1 = 3u ;
+
+continuing
+var_1 = 4u ;
+
+
+var_1 = 5u ;
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnTrue.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnTrue.spvasm.expected.wgsl
index 6ee0306..181cd62 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnTrue.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Fallthrough_OnTrue.spvasm.expected.wgsl
@@ -33,7 +33,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnFalse.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnFalse.spvasm.expected.hlsl
index f1f3c5d..bd16703 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnFalse.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnFalse.spvasm.expected.hlsl
@@ -21,7 +21,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnFalse.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnFalse.spvasm.expected.msl
index f1f3c5d..bd16703 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnFalse.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnFalse.spvasm.expected.msl
@@ -21,7 +21,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnFalse.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnFalse.spvasm.expected.spvasm
index f1f3c5d..95953ca 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnFalse.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnFalse.spvasm.expected.spvasm
@@ -1,29 +1,29 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  var_1 = 0u;
-  loop {
-    var_1 = 1u;
-    var_1 = 2u;
-    if (false) {
-      continue;
-    }
-    var_1 = 3u;
+fn main_1
+var_1 = 0u ;
+loop
+var_1 = 1u ;
+var_1 = 2u ;
+if false
+continue ;
 
-    continuing {
-      var_1 = 4u;
-    }
-  }
-  var_1 = 5u;
-  return;
-}
+var_1 = 3u ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
+continuing
+var_1 = 4u ;
 
-error: loop does not exit
+
+var_1 = 5u ;
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnFalse.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnFalse.spvasm.expected.wgsl
index f1f3c5d..bd16703 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnFalse.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnFalse.spvasm.expected.wgsl
@@ -21,7 +21,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnTrue.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnTrue.spvasm.expected.hlsl
index d3f4646..a789380 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnTrue.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnTrue.spvasm.expected.hlsl
@@ -22,7 +22,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnTrue.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnTrue.spvasm.expected.msl
index d3f4646..a789380 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnTrue.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnTrue.spvasm.expected.msl
@@ -22,7 +22,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnTrue.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnTrue.spvasm.expected.spvasm
index d3f4646..faa5d1c 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnTrue.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnTrue.spvasm.expected.spvasm
@@ -1,30 +1,30 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  var_1 = 0u;
-  loop {
-    var_1 = 1u;
-    var_1 = 2u;
-    if (false) {
-    } else {
-      continue;
-    }
-    var_1 = 3u;
+fn main_1
+var_1 = 0u ;
+loop
+var_1 = 1u ;
+var_1 = 2u ;
+if false
+else
+continue ;
 
-    continuing {
-      var_1 = 4u;
-    }
-  }
-  var_1 = 5u;
-  return;
-}
+var_1 = 3u ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
+continuing
+var_1 = 4u ;
 
-error: loop does not exit
+
+var_1 = 5u ;
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnTrue.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnTrue.spvasm.expected.wgsl
index d3f4646..a789380 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnTrue.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_Forward_OnTrue.spvasm.expected.wgsl
@@ -22,7 +22,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnFalse.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnFalse.spvasm.expected.hlsl
index 7f23c27..ec64472 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnFalse.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnFalse.spvasm.expected.hlsl
@@ -24,7 +24,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnFalse.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnFalse.spvasm.expected.msl
index 7f23c27..ec64472 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnFalse.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnFalse.spvasm.expected.msl
@@ -24,7 +24,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnFalse.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnFalse.spvasm.expected.spvasm
index 7f23c27..b5d3c49 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnFalse.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnFalse.spvasm.expected.spvasm
@@ -1,32 +1,32 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  var_1 = 0u;
-  loop {
-    var_1 = 1u;
-    var_1 = 2u;
-    if (true) {
-      var_1 = 3u;
-      if (false) {
-        continue;
-      }
-    }
-    var_1 = 4u;
+fn main_1
+var_1 = 0u ;
+loop
+var_1 = 1u ;
+var_1 = 2u ;
+if true
+var_1 = 3u ;
+if false
+continue ;
 
-    continuing {
-      var_1 = 5u;
-    }
-  }
-  var_1 = 6u;
-  return;
-}
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
+var_1 = 4u ;
 
-error: loop does not exit
+continuing
+var_1 = 5u ;
+
+
+var_1 = 6u ;
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnFalse.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnFalse.spvasm.expected.wgsl
index 7f23c27..ec64472 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnFalse.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnFalse.spvasm.expected.wgsl
@@ -24,7 +24,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnTrue.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnTrue.spvasm.expected.hlsl
index b80786e..457c6ec 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnTrue.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnTrue.spvasm.expected.hlsl
@@ -25,7 +25,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnTrue.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnTrue.spvasm.expected.msl
index b80786e..457c6ec 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnTrue.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnTrue.spvasm.expected.msl
@@ -25,7 +25,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnTrue.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnTrue.spvasm.expected.spvasm
index b80786e..de9fe3c 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnTrue.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnTrue.spvasm.expected.spvasm
@@ -1,33 +1,33 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  var_1 = 0u;
-  loop {
-    var_1 = 1u;
-    var_1 = 2u;
-    if (true) {
-      var_1 = 3u;
-      if (false) {
-      } else {
-        continue;
-      }
-    }
-    var_1 = 4u;
+fn main_1
+var_1 = 0u ;
+loop
+var_1 = 1u ;
+var_1 = 2u ;
+if true
+var_1 = 3u ;
+if false
+else
+continue ;
 
-    continuing {
-      var_1 = 5u;
-    }
-  }
-  var_1 = 6u;
-  return;
-}
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
+var_1 = 4u ;
 
-error: loop does not exit
+continuing
+var_1 = 5u ;
+
+
+var_1 = 6u ;
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnTrue.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnTrue.spvasm.expected.wgsl
index b80786e..457c6ec 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnTrue.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Continue_IfBreak_OnTrue.spvasm.expected.wgsl
@@ -25,7 +25,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_LoopContinue_FromSwitch.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_LoopContinue_FromSwitch.spvasm.expected.hlsl
index 7b5bc4f..82610e2 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_LoopContinue_FromSwitch.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_LoopContinue_FromSwitch.spvasm.expected.hlsl
@@ -26,7 +26,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_LoopContinue_FromSwitch.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_LoopContinue_FromSwitch.spvasm.expected.msl
index 7b5bc4f..82610e2 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_LoopContinue_FromSwitch.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_LoopContinue_FromSwitch.spvasm.expected.msl
@@ -26,7 +26,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_LoopContinue_FromSwitch.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_LoopContinue_FromSwitch.spvasm.expected.spvasm
index 7b5bc4f..992c540 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_LoopContinue_FromSwitch.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_LoopContinue_FromSwitch.spvasm.expected.spvasm
@@ -1,34 +1,34 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  var_1 = 1u;
-  loop {
-    var_1 = 2u;
-    var_1 = 3u;
-    switch(42u) {
-      case 40u: {
-        var_1 = 4u;
-        continue;
-      }
-      default: {
-      }
-    }
-    var_1 = 5u;
+fn main_1
+var_1 = 1u ;
+loop
+var_1 = 2u ;
+var_1 = 3u ;
+switch 42u
+case 40u
+var_1 = 4u ;
+continue ;
 
-    continuing {
-      var_1 = 6u;
-    }
-  }
-  var_1 = 7u;
-  return;
-}
+default
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
 
-error: loop does not exit
+var_1 = 5u ;
+
+continuing
+var_1 = 6u ;
+
+
+var_1 = 7u ;
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_LoopContinue_FromSwitch.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_LoopContinue_FromSwitch.spvasm.expected.wgsl
index 7b5bc4f..82610e2 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_LoopContinue_FromSwitch.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_LoopContinue_FromSwitch.spvasm.expected.wgsl
@@ -26,7 +26,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnFalse.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnFalse.spvasm.expected.hlsl
index 90f16be..9a46eeb 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnFalse.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnFalse.spvasm.expected.hlsl
@@ -29,7 +29,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnFalse.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnFalse.spvasm.expected.msl
index 90f16be..9a46eeb 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnFalse.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnFalse.spvasm.expected.msl
@@ -29,7 +29,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnFalse.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnFalse.spvasm.expected.spvasm
index 90f16be..e31a3d5 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnFalse.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnFalse.spvasm.expected.spvasm
@@ -1,37 +1,37 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  var_1 = 1u;
-  loop {
-    var_1 = 2u;
-    var_1 = 3u;
-    switch(42u) {
-      case 40u: {
-        var_1 = 40u;
-        if (false) {
-        } else {
-          continue;
-        }
-      }
-      default: {
-      }
-    }
-    var_1 = 6u;
+fn main_1
+var_1 = 1u ;
+loop
+var_1 = 2u ;
+var_1 = 3u ;
+switch 42u
+case 40u
+var_1 = 40u ;
+if false
+else
+continue ;
 
-    continuing {
-      var_1 = 7u;
-    }
-  }
-  var_1 = 8u;
-  return;
-}
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
+default
 
-error: loop does not exit
+
+var_1 = 6u ;
+
+continuing
+var_1 = 7u ;
+
+
+var_1 = 8u ;
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnFalse.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnFalse.spvasm.expected.wgsl
index 90f16be..9a46eeb 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnFalse.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnFalse.spvasm.expected.wgsl
@@ -29,7 +29,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnTrue.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnTrue.spvasm.expected.hlsl
index 79d355b..083e426 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnTrue.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnTrue.spvasm.expected.hlsl
@@ -28,7 +28,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnTrue.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnTrue.spvasm.expected.msl
index 79d355b..083e426 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnTrue.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnTrue.spvasm.expected.msl
@@ -28,7 +28,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnTrue.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnTrue.spvasm.expected.spvasm
index 79d355b..01ea61e 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnTrue.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnTrue.spvasm.expected.spvasm
@@ -1,36 +1,36 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  var_1 = 1u;
-  loop {
-    var_1 = 2u;
-    var_1 = 3u;
-    switch(42u) {
-      case 40u: {
-        var_1 = 40u;
-        if (false) {
-          continue;
-        }
-      }
-      default: {
-      }
-    }
-    var_1 = 6u;
+fn main_1
+var_1 = 1u ;
+loop
+var_1 = 2u ;
+var_1 = 3u ;
+switch 42u
+case 40u
+var_1 = 40u ;
+if false
+continue ;
 
-    continuing {
-      var_1 = 7u;
-    }
-  }
-  var_1 = 8u;
-  return;
-}
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
+default
 
-error: loop does not exit
+
+var_1 = 6u ;
+
+continuing
+var_1 = 7u ;
+
+
+var_1 = 8u ;
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnTrue.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnTrue.spvasm.expected.wgsl
index 79d355b..083e426 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnTrue.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Continue_OnTrue.spvasm.expected.wgsl
@@ -28,7 +28,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_MultiBlockLoop.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_MultiBlockLoop.spvasm.expected.hlsl
index 54db413..2efe2a8 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_MultiBlockLoop.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_MultiBlockLoop.spvasm.expected.hlsl
@@ -13,7 +13,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_MultiBlockLoop.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_MultiBlockLoop.spvasm.expected.msl
index 54db413..2efe2a8 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_MultiBlockLoop.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_MultiBlockLoop.spvasm.expected.msl
@@ -13,7 +13,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_MultiBlockLoop.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_MultiBlockLoop.spvasm.expected.spvasm
index 54db413..e4c47d6 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_MultiBlockLoop.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_MultiBlockLoop.spvasm.expected.spvasm
@@ -1,21 +1,21 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  loop {
+fn main_1
+loop
 
-    continuing {
-      var_1 = 1u;
-    }
-  }
-  return;
-}
+continuing
+var_1 = 1u ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
 
-error: loop does not exit
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_MultiBlockLoop.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_MultiBlockLoop.spvasm.expected.wgsl
index 54db413..2efe2a8 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_MultiBlockLoop.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_MultiBlockLoop.spvasm.expected.wgsl
@@ -13,7 +13,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_SingleBlockLoop.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_SingleBlockLoop.spvasm.expected.hlsl
index 8c9f743..12d2d6f 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_SingleBlockLoop.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_SingleBlockLoop.spvasm.expected.hlsl
@@ -10,7 +10,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_SingleBlockLoop.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_SingleBlockLoop.spvasm.expected.msl
index 8c9f743..12d2d6f 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_SingleBlockLoop.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_SingleBlockLoop.spvasm.expected.msl
@@ -10,7 +10,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_SingleBlockLoop.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_SingleBlockLoop.spvasm.expected.spvasm
index 8c9f743..9348637 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_SingleBlockLoop.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_SingleBlockLoop.spvasm.expected.spvasm
@@ -1,18 +1,18 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  loop {
-    var_1 = 1u;
-  }
-  return;
-}
+fn main_1
+loop
+var_1 = 1u ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
+return ;
 
-error: loop does not exit
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_SingleBlockLoop.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_SingleBlockLoop.spvasm.expected.wgsl
index 8c9f743..12d2d6f 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_SingleBlockLoop.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_BackEdge_SingleBlockLoop.spvasm.expected.wgsl
@@ -10,7 +10,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_BeforeLast.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_BeforeLast.spvasm.expected.hlsl
index 084d93f..5709df3 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_BeforeLast.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_BeforeLast.spvasm.expected.hlsl
@@ -18,7 +18,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_BeforeLast.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_BeforeLast.spvasm.expected.msl
index 084d93f..5709df3 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_BeforeLast.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_BeforeLast.spvasm.expected.msl
@@ -18,7 +18,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_BeforeLast.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_BeforeLast.spvasm.expected.spvasm
index 084d93f..23786d8 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_BeforeLast.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_BeforeLast.spvasm.expected.spvasm
@@ -1,26 +1,26 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  loop {
-    if (false) {
-      var_1 = 1u;
-      continue;
-    }
-    var_1 = 2u;
+fn main_1
+loop
+if false
+var_1 = 1u ;
+continue ;
 
-    continuing {
-      var_1 = 3u;
-    }
-  }
-  return;
-}
+var_1 = 2u ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
+continuing
+var_1 = 3u ;
 
-error: loop does not exit
+
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_BeforeLast.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_BeforeLast.spvasm.expected.wgsl
index 084d93f..5709df3 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_BeforeLast.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_BeforeLast.spvasm.expected.wgsl
@@ -18,7 +18,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_FromSwitch.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_FromSwitch.spvasm.expected.hlsl
index 7b5bc4f..82610e2 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_FromSwitch.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_FromSwitch.spvasm.expected.hlsl
@@ -26,7 +26,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_FromSwitch.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_FromSwitch.spvasm.expected.msl
index 7b5bc4f..82610e2 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_FromSwitch.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_FromSwitch.spvasm.expected.msl
@@ -26,7 +26,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_FromSwitch.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_FromSwitch.spvasm.expected.spvasm
index 7b5bc4f..992c540 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_FromSwitch.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_FromSwitch.spvasm.expected.spvasm
@@ -1,34 +1,34 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  var_1 = 1u;
-  loop {
-    var_1 = 2u;
-    var_1 = 3u;
-    switch(42u) {
-      case 40u: {
-        var_1 = 4u;
-        continue;
-      }
-      default: {
-      }
-    }
-    var_1 = 5u;
+fn main_1
+var_1 = 1u ;
+loop
+var_1 = 2u ;
+var_1 = 3u ;
+switch 42u
+case 40u
+var_1 = 4u ;
+continue ;
 
-    continuing {
-      var_1 = 6u;
-    }
-  }
-  var_1 = 7u;
-  return;
-}
+default
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
 
-error: loop does not exit
+var_1 = 5u ;
+
+continuing
+var_1 = 6u ;
+
+
+var_1 = 7u ;
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_FromSwitch.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_FromSwitch.spvasm.expected.wgsl
index 7b5bc4f..82610e2 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_FromSwitch.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_FromSwitch.spvasm.expected.wgsl
@@ -26,7 +26,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_LastInLoopConstruct.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_LastInLoopConstruct.spvasm.expected.hlsl
index d43665e..eb514ee 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_LastInLoopConstruct.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_LastInLoopConstruct.spvasm.expected.hlsl
@@ -14,7 +14,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_LastInLoopConstruct.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_LastInLoopConstruct.spvasm.expected.msl
index d43665e..eb514ee 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_LastInLoopConstruct.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_LastInLoopConstruct.spvasm.expected.msl
@@ -14,7 +14,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_LastInLoopConstruct.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_LastInLoopConstruct.spvasm.expected.spvasm
index d43665e..211cb2c 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_LastInLoopConstruct.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_LastInLoopConstruct.spvasm.expected.spvasm
@@ -1,22 +1,22 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  loop {
-    var_1 = 1u;
+fn main_1
+loop
+var_1 = 1u ;
 
-    continuing {
-      var_1 = 2u;
-    }
-  }
-  return;
-}
+continuing
+var_1 = 2u ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
 
-error: loop does not exit
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_LastInLoopConstruct.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_LastInLoopConstruct.spvasm.expected.wgsl
index d43665e..eb514ee 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_LastInLoopConstruct.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_LoopContinue_LastInLoopConstruct.spvasm.expected.wgsl
@@ -14,7 +14,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_FalseBranch_LoopContinue.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_FalseBranch_LoopContinue.spvasm.expected.hlsl
index b7ad7d3..d538de1 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_FalseBranch_LoopContinue.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_FalseBranch_LoopContinue.spvasm.expected.hlsl
@@ -13,7 +13,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_FalseBranch_LoopContinue.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_FalseBranch_LoopContinue.spvasm.expected.msl
index b7ad7d3..d538de1 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_FalseBranch_LoopContinue.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_FalseBranch_LoopContinue.spvasm.expected.msl
@@ -13,7 +13,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_FalseBranch_LoopContinue.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_FalseBranch_LoopContinue.spvasm.expected.spvasm
index b7ad7d3..42119a0 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_FalseBranch_LoopContinue.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_FalseBranch_LoopContinue.spvasm.expected.spvasm
@@ -1,21 +1,21 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  loop {
-    if (false) {
-    } else {
-      continue;
-    }
-  }
-  return;
-}
+fn main_1
+loop
+if false
+else
+continue ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
 
-error: loop does not exit
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_FalseBranch_LoopContinue.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_FalseBranch_LoopContinue.spvasm.expected.wgsl
index b7ad7d3..d538de1 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_FalseBranch_LoopContinue.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_FalseBranch_LoopContinue.spvasm.expected.wgsl
@@ -13,7 +13,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_LoopInternallyDiverge_Simple.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_LoopInternallyDiverge_Simple.spvasm.expected.hlsl
index c9b1ed7..3122cf9 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_LoopInternallyDiverge_Simple.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_LoopInternallyDiverge_Simple.spvasm.expected.hlsl
@@ -22,7 +22,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_LoopInternallyDiverge_Simple.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_LoopInternallyDiverge_Simple.spvasm.expected.msl
index c9b1ed7..3122cf9 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_LoopInternallyDiverge_Simple.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_LoopInternallyDiverge_Simple.spvasm.expected.msl
@@ -22,7 +22,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_LoopInternallyDiverge_Simple.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_LoopInternallyDiverge_Simple.spvasm.expected.spvasm
index c9b1ed7..bf12209 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_LoopInternallyDiverge_Simple.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_LoopInternallyDiverge_Simple.spvasm.expected.spvasm
@@ -1,30 +1,30 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  var_1 = 10u;
-  loop {
-    var_1 = 20u;
-    if (false) {
-      var_1 = 30u;
-      continue;
-    } else {
-      var_1 = 40u;
-    }
+fn main_1
+var_1 = 10u ;
+loop
+var_1 = 20u ;
+if false
+var_1 = 30u ;
+continue ;
+else
+var_1 = 40u ;
 
-    continuing {
-      var_1 = 90u;
-    }
-  }
-  var_1 = 99u;
-  return;
-}
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
+continuing
+var_1 = 90u ;
 
-error: loop does not exit
+
+var_1 = 99u ;
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_LoopInternallyDiverge_Simple.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_LoopInternallyDiverge_Simple.spvasm.expected.wgsl
index c9b1ed7..3122cf9 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_LoopInternallyDiverge_Simple.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_LoopInternallyDiverge_Simple.spvasm.expected.wgsl
@@ -22,7 +22,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_NestedIfContinue.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_NestedIfContinue.spvasm.expected.hlsl
index 084d93f..5709df3 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_NestedIfContinue.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_NestedIfContinue.spvasm.expected.hlsl
@@ -18,7 +18,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_NestedIfContinue.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_NestedIfContinue.spvasm.expected.msl
index 084d93f..5709df3 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_NestedIfContinue.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_NestedIfContinue.spvasm.expected.msl
@@ -18,7 +18,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_NestedIfContinue.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_NestedIfContinue.spvasm.expected.spvasm
index 084d93f..23786d8 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_NestedIfContinue.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_NestedIfContinue.spvasm.expected.spvasm
@@ -1,26 +1,26 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  loop {
-    if (false) {
-      var_1 = 1u;
-      continue;
-    }
-    var_1 = 2u;
+fn main_1
+loop
+if false
+var_1 = 1u ;
+continue ;
 
-    continuing {
-      var_1 = 3u;
-    }
-  }
-  return;
-}
+var_1 = 2u ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
+continuing
+var_1 = 3u ;
 
-error: loop does not exit
+
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_NestedIfContinue.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_NestedIfContinue.spvasm.expected.wgsl
index 084d93f..5709df3 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_NestedIfContinue.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_NestedIfContinue.spvasm.expected.wgsl
@@ -18,7 +18,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_BothBackedge.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_BothBackedge.spvasm.expected.hlsl
index 0fcda02..bac39a4 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_BothBackedge.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_BothBackedge.spvasm.expected.hlsl
@@ -12,7 +12,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_BothBackedge.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_BothBackedge.spvasm.expected.msl
index 0fcda02..bac39a4 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_BothBackedge.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_BothBackedge.spvasm.expected.msl
@@ -12,7 +12,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_BothBackedge.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_BothBackedge.spvasm.expected.spvasm
index 0fcda02..f712098 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_BothBackedge.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_BothBackedge.spvasm.expected.spvasm
@@ -1,20 +1,20 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  var_1 = 0u;
-  loop {
-    var_1 = 1u;
-  }
-  var_1 = 999u;
-  return;
-}
+fn main_1
+var_1 = 0u ;
+loop
+var_1 = 1u ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
+var_1 = 999u ;
+return ;
 
-error: loop does not exit
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_BothBackedge.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_BothBackedge.spvasm.expected.wgsl
index 0fcda02..bac39a4 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_BothBackedge.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_BothBackedge.spvasm.expected.wgsl
@@ -12,7 +12,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_UnconditionalBackege.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_UnconditionalBackege.spvasm.expected.hlsl
index 0fcda02..bac39a4 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_UnconditionalBackege.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_UnconditionalBackege.spvasm.expected.hlsl
@@ -12,7 +12,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_UnconditionalBackege.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_UnconditionalBackege.spvasm.expected.msl
index 0fcda02..bac39a4 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_UnconditionalBackege.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_UnconditionalBackege.spvasm.expected.msl
@@ -12,7 +12,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_UnconditionalBackege.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_UnconditionalBackege.spvasm.expected.spvasm
index 0fcda02..f712098 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_UnconditionalBackege.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_UnconditionalBackege.spvasm.expected.spvasm
@@ -1,20 +1,20 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  var_1 = 0u;
-  loop {
-    var_1 = 1u;
-  }
-  var_1 = 999u;
-  return;
-}
+fn main_1
+var_1 = 0u ;
+loop
+var_1 = 1u ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
+var_1 = 999u ;
+return ;
 
-error: loop does not exit
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_UnconditionalBackege.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_UnconditionalBackege.spvasm.expected.wgsl
index 0fcda02..bac39a4 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_UnconditionalBackege.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_SingleBlock_UnconditionalBackege.spvasm.expected.wgsl
@@ -12,7 +12,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_ContinueNestIf.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_ContinueNestIf.spvasm.expected.hlsl
index ae96510..74c752d 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_ContinueNestIf.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_ContinueNestIf.spvasm.expected.hlsl
@@ -21,7 +21,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_ContinueNestIf.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_ContinueNestIf.spvasm.expected.msl
index ae96510..74c752d 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_ContinueNestIf.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_ContinueNestIf.spvasm.expected.msl
@@ -21,7 +21,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_ContinueNestIf.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_ContinueNestIf.spvasm.expected.spvasm
index ae96510..bd2e4a6 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_ContinueNestIf.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_ContinueNestIf.spvasm.expected.spvasm
@@ -1,29 +1,29 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  var_1 = 0u;
-  loop {
-    var_1 = 1u;
-    var_1 = 2u;
+fn main_1
+var_1 = 0u ;
+loop
+var_1 = 1u ;
+var_1 = 2u ;
 
-    continuing {
-      var_1 = 3u;
-      if (true) {
-        var_1 = 4u;
-      }
-      var_1 = 5u;
-    }
-  }
-  var_1 = 999u;
-  return;
-}
+continuing
+var_1 = 3u ;
+if true
+var_1 = 4u ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
+var_1 = 5u ;
 
-error: loop does not exit
+
+var_1 = 999u ;
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_ContinueNestIf.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_ContinueNestIf.spvasm.expected.wgsl
index ae96510..74c752d 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_ContinueNestIf.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_ContinueNestIf.spvasm.expected.wgsl
@@ -21,7 +21,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_MultiBlockContinue.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_MultiBlockContinue.spvasm.expected.hlsl
index 9e69952..13fc2c7 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_MultiBlockContinue.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_MultiBlockContinue.spvasm.expected.hlsl
@@ -18,7 +18,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_MultiBlockContinue.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_MultiBlockContinue.spvasm.expected.msl
index 9e69952..13fc2c7 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_MultiBlockContinue.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_MultiBlockContinue.spvasm.expected.msl
@@ -18,7 +18,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_MultiBlockContinue.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_MultiBlockContinue.spvasm.expected.spvasm
index 9e69952..2688c57 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_MultiBlockContinue.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_MultiBlockContinue.spvasm.expected.spvasm
@@ -1,26 +1,26 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  var_1 = 0u;
-  loop {
-    var_1 = 1u;
-    var_1 = 2u;
+fn main_1
+var_1 = 0u ;
+loop
+var_1 = 1u ;
+var_1 = 2u ;
 
-    continuing {
-      var_1 = 3u;
-      var_1 = 4u;
-    }
-  }
-  var_1 = 999u;
-  return;
-}
+continuing
+var_1 = 3u ;
+var_1 = 4u ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
 
-error: loop does not exit
+var_1 = 999u ;
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_MultiBlockContinue.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_MultiBlockContinue.spvasm.expected.wgsl
index 9e69952..13fc2c7 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_MultiBlockContinue.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_MultiBlockContinue.spvasm.expected.wgsl
@@ -18,7 +18,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_SingleBlockContinue.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_SingleBlockContinue.spvasm.expected.hlsl
index e32d9bd..cb60399 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_SingleBlockContinue.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_SingleBlockContinue.spvasm.expected.hlsl
@@ -17,7 +17,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_SingleBlockContinue.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_SingleBlockContinue.spvasm.expected.msl
index e32d9bd..cb60399 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_SingleBlockContinue.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_SingleBlockContinue.spvasm.expected.msl
@@ -17,7 +17,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_SingleBlockContinue.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_SingleBlockContinue.spvasm.expected.spvasm
index e32d9bd..7ba8ccb 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_SingleBlockContinue.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_SingleBlockContinue.spvasm.expected.spvasm
@@ -1,25 +1,25 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  var_1 = 0u;
-  loop {
-    var_1 = 1u;
-    var_1 = 2u;
+fn main_1
+var_1 = 0u ;
+loop
+var_1 = 1u ;
+var_1 = 2u ;
 
-    continuing {
-      var_1 = 3u;
-    }
-  }
-  var_1 = 999u;
-  return;
-}
+continuing
+var_1 = 3u ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
 
-error: loop does not exit
+var_1 = 999u ;
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_SingleBlockContinue.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_SingleBlockContinue.spvasm.expected.wgsl
index e32d9bd..cb60399 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_SingleBlockContinue.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Loop_Unconditional_Body_SingleBlockContinue.spvasm.expected.wgsl
@@ -17,7 +17,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_TrueBranch_LoopContinue.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_TrueBranch_LoopContinue.spvasm.expected.hlsl
index 32e75fb..9de1e7e 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_TrueBranch_LoopContinue.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_TrueBranch_LoopContinue.spvasm.expected.hlsl
@@ -12,7 +12,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_TrueBranch_LoopContinue.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_TrueBranch_LoopContinue.spvasm.expected.msl
index 32e75fb..9de1e7e 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_TrueBranch_LoopContinue.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_TrueBranch_LoopContinue.spvasm.expected.msl
@@ -12,7 +12,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_TrueBranch_LoopContinue.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_TrueBranch_LoopContinue.spvasm.expected.spvasm
index 32e75fb..03faabe 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_TrueBranch_LoopContinue.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_TrueBranch_LoopContinue.spvasm.expected.spvasm
@@ -1,20 +1,20 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  loop {
-    if (false) {
-      continue;
-    }
-  }
-  return;
-}
+fn main_1
+loop
+if false
+continue ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
 
-error: loop does not exit
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_TrueBranch_LoopContinue.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_TrueBranch_LoopContinue.spvasm.expected.wgsl
index 32e75fb..9de1e7e 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_TrueBranch_LoopContinue.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_EmitBody_TrueBranch_LoopContinue.spvasm.expected.wgsl
@@ -12,7 +12,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_FalseBranch_LoopContinue_Ok.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_FalseBranch_LoopContinue_Ok.spvasm.expected.hlsl
index b7ad7d3..d538de1 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_FalseBranch_LoopContinue_Ok.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_FalseBranch_LoopContinue_Ok.spvasm.expected.hlsl
@@ -13,7 +13,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_FalseBranch_LoopContinue_Ok.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_FalseBranch_LoopContinue_Ok.spvasm.expected.msl
index b7ad7d3..d538de1 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_FalseBranch_LoopContinue_Ok.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_FalseBranch_LoopContinue_Ok.spvasm.expected.msl
@@ -13,7 +13,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_FalseBranch_LoopContinue_Ok.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_FalseBranch_LoopContinue_Ok.spvasm.expected.spvasm
index b7ad7d3..42119a0 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_FalseBranch_LoopContinue_Ok.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_FalseBranch_LoopContinue_Ok.spvasm.expected.spvasm
@@ -1,21 +1,21 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  loop {
-    if (false) {
-    } else {
-      continue;
-    }
-  }
-  return;
-}
+fn main_1
+loop
+if false
+else
+continue ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
 
-error: loop does not exit
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_FalseBranch_LoopContinue_Ok.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_FalseBranch_LoopContinue_Ok.spvasm.expected.wgsl
index b7ad7d3..d538de1 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_FalseBranch_LoopContinue_Ok.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_FalseBranch_LoopContinue_Ok.spvasm.expected.wgsl
@@ -13,7 +13,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_TrueBranch_LoopContinue_Ok.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_TrueBranch_LoopContinue_Ok.spvasm.expected.hlsl
index 32e75fb..9de1e7e 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_TrueBranch_LoopContinue_Ok.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_TrueBranch_LoopContinue_Ok.spvasm.expected.hlsl
@@ -12,7 +12,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_TrueBranch_LoopContinue_Ok.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_TrueBranch_LoopContinue_Ok.spvasm.expected.msl
index 32e75fb..9de1e7e 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_TrueBranch_LoopContinue_Ok.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_TrueBranch_LoopContinue_Ok.spvasm.expected.msl
@@ -12,7 +12,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_TrueBranch_LoopContinue_Ok.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_TrueBranch_LoopContinue_Ok.spvasm.expected.spvasm
index 32e75fb..03faabe 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_TrueBranch_LoopContinue_Ok.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_TrueBranch_LoopContinue_Ok.spvasm.expected.spvasm
@@ -1,20 +1,20 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  loop {
-    if (false) {
-      continue;
-    }
-  }
-  return;
-}
+fn main_1
+loop
+if false
+continue ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
 
-error: loop does not exit
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_TrueBranch_LoopContinue_Ok.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_TrueBranch_LoopContinue_Ok.spvasm.expected.wgsl
index 32e75fb..9de1e7e 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_TrueBranch_LoopContinue_Ok.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_FindIfSelectionInternalHeaders_TrueBranch_LoopContinue_Ok.spvasm.expected.wgsl
@@ -12,7 +12,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_LabelControlFlowConstructs_LoopInterallyDiverge.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_LabelControlFlowConstructs_LoopInterallyDiverge.spvasm.expected.hlsl
index 32e75fb..9de1e7e 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_LabelControlFlowConstructs_LoopInterallyDiverge.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_LabelControlFlowConstructs_LoopInterallyDiverge.spvasm.expected.hlsl
@@ -12,7 +12,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_LabelControlFlowConstructs_LoopInterallyDiverge.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_LabelControlFlowConstructs_LoopInterallyDiverge.spvasm.expected.msl
index 32e75fb..9de1e7e 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_LabelControlFlowConstructs_LoopInterallyDiverge.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_LabelControlFlowConstructs_LoopInterallyDiverge.spvasm.expected.msl
@@ -12,7 +12,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_LabelControlFlowConstructs_LoopInterallyDiverge.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_LabelControlFlowConstructs_LoopInterallyDiverge.spvasm.expected.spvasm
index 32e75fb..03faabe 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_LabelControlFlowConstructs_LoopInterallyDiverge.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_LabelControlFlowConstructs_LoopInterallyDiverge.spvasm.expected.spvasm
@@ -1,20 +1,20 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  loop {
-    if (false) {
-      continue;
-    }
-  }
-  return;
-}
+fn main_1
+loop
+if false
+continue ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
 
-error: loop does not exit
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_LabelControlFlowConstructs_LoopInterallyDiverge.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_LabelControlFlowConstructs_LoopInterallyDiverge.spvasm.expected.wgsl
index 32e75fb..9de1e7e 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_LabelControlFlowConstructs_LoopInterallyDiverge.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_LabelControlFlowConstructs_LoopInterallyDiverge.spvasm.expected.wgsl
@@ -12,7 +12,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_RegisterMerges_GoodLoopMerge_MultiBlockLoop_ContinueIsHeader.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserCFGTest_RegisterMerges_GoodLoopMerge_MultiBlockLoop_ContinueIsHeader.spvasm.expected.hlsl
index 2d78e5b..461b205 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_RegisterMerges_GoodLoopMerge_MultiBlockLoop_ContinueIsHeader.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_RegisterMerges_GoodLoopMerge_MultiBlockLoop_ContinueIsHeader.spvasm.expected.hlsl
@@ -9,7 +9,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_RegisterMerges_GoodLoopMerge_MultiBlockLoop_ContinueIsHeader.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserCFGTest_RegisterMerges_GoodLoopMerge_MultiBlockLoop_ContinueIsHeader.spvasm.expected.msl
index 2d78e5b..461b205 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_RegisterMerges_GoodLoopMerge_MultiBlockLoop_ContinueIsHeader.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_RegisterMerges_GoodLoopMerge_MultiBlockLoop_ContinueIsHeader.spvasm.expected.msl
@@ -9,7 +9,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_RegisterMerges_GoodLoopMerge_MultiBlockLoop_ContinueIsHeader.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserCFGTest_RegisterMerges_GoodLoopMerge_MultiBlockLoop_ContinueIsHeader.spvasm.expected.spvasm
index 2d78e5b..6247458 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_RegisterMerges_GoodLoopMerge_MultiBlockLoop_ContinueIsHeader.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_RegisterMerges_GoodLoopMerge_MultiBlockLoop_ContinueIsHeader.spvasm.expected.spvasm
@@ -1,17 +1,17 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-var<private> var_1 : u32;
+var private var_1 u32 ;
 
-fn main_1() {
-  loop {
-  }
-  return;
-}
+fn main_1
+loop
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
+return ;
 
-error: loop does not exit
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserCFGTest_RegisterMerges_GoodLoopMerge_MultiBlockLoop_ContinueIsHeader.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserCFGTest_RegisterMerges_GoodLoopMerge_MultiBlockLoop_ContinueIsHeader.spvasm.expected.wgsl
index 2d78e5b..461b205 100644
--- a/test/unittest/reader/spirv/SpvParserCFGTest_RegisterMerges_GoodLoopMerge_MultiBlockLoop_ContinueIsHeader.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserCFGTest_RegisterMerges_GoodLoopMerge_MultiBlockLoop_ContinueIsHeader.spvasm.expected.wgsl
@@ -9,7 +9,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_CombinatorialValue_Immediate_UsedOnceDifferentConstruct.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_CombinatorialValue_Immediate_UsedOnceDifferentConstruct.spvasm.expected.hlsl
index 016ae84..f7f27eb 100644
--- a/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_CombinatorialValue_Immediate_UsedOnceDifferentConstruct.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_CombinatorialValue_Immediate_UsedOnceDifferentConstruct.spvasm.expected.hlsl
@@ -21,7 +21,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_CombinatorialValue_Immediate_UsedOnceDifferentConstruct.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_CombinatorialValue_Immediate_UsedOnceDifferentConstruct.spvasm.expected.msl
index 016ae84..f7f27eb 100644
--- a/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_CombinatorialValue_Immediate_UsedOnceDifferentConstruct.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_CombinatorialValue_Immediate_UsedOnceDifferentConstruct.spvasm.expected.msl
@@ -21,7 +21,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_CombinatorialValue_Immediate_UsedOnceDifferentConstruct.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_CombinatorialValue_Immediate_UsedOnceDifferentConstruct.spvasm.expected.spvasm
index 016ae84..8d88c46 100644
--- a/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_CombinatorialValue_Immediate_UsedOnceDifferentConstruct.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_CombinatorialValue_Immediate_UsedOnceDifferentConstruct.spvasm.expected.spvasm
@@ -1,29 +1,29 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-struct S {
-  field0 : u32;
-  field1 : f32;
-  field2 : array<u32, 2u>;
-};
+struct S
+field0 u32 ;
+field1 f32 ;
+field2 array u32 2u ;
+;
 
-fn main_1() {
-  var x_25 : u32;
-  let x_2 : u32 = (1u + 1u);
-  x_25 = 1u;
-  loop {
+fn main_1
+var x_25 u32 ;
+let x_2 u32 = 1u + 1u ;
+x_25 = 1u ;
+loop
 
-    continuing {
-      x_25 = x_2;
-    }
-  }
-  x_25 = 2u;
-  return;
-}
+continuing
+x_25 = x_2 ;
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
 
-error: loop does not exit
+x_25 = 2u ;
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_CombinatorialValue_Immediate_UsedOnceDifferentConstruct.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_CombinatorialValue_Immediate_UsedOnceDifferentConstruct.spvasm.expected.wgsl
index 016ae84..f7f27eb 100644
--- a/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_CombinatorialValue_Immediate_UsedOnceDifferentConstruct.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_CombinatorialValue_Immediate_UsedOnceDifferentConstruct.spvasm.expected.wgsl
@@ -21,7 +21,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_Phi_ValueFromLoopBodyAndContinuing.spvasm.expected.hlsl b/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_Phi_ValueFromLoopBodyAndContinuing.spvasm.expected.hlsl
index f9ae993..099f55e 100644
--- a/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_Phi_ValueFromLoopBodyAndContinuing.spvasm.expected.hlsl
+++ b/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_Phi_ValueFromLoopBodyAndContinuing.spvasm.expected.hlsl
@@ -38,7 +38,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_Phi_ValueFromLoopBodyAndContinuing.spvasm.expected.msl b/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_Phi_ValueFromLoopBodyAndContinuing.spvasm.expected.msl
index f9ae993..099f55e 100644
--- a/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_Phi_ValueFromLoopBodyAndContinuing.spvasm.expected.msl
+++ b/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_Phi_ValueFromLoopBodyAndContinuing.spvasm.expected.msl
@@ -38,7 +38,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_Phi_ValueFromLoopBodyAndContinuing.spvasm.expected.spvasm b/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_Phi_ValueFromLoopBodyAndContinuing.spvasm.expected.spvasm
index f9ae993..5bc3ceb 100644
--- a/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_Phi_ValueFromLoopBodyAndContinuing.spvasm.expected.spvasm
+++ b/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_Phi_ValueFromLoopBodyAndContinuing.spvasm.expected.spvasm
@@ -1,46 +1,46 @@
-SKIP: FAILED
+SKIP FAILED
 
 
-struct S {
-  field0 : u32;
-  field1 : f32;
-  field2 : array<u32, 2u>;
-};
+struct S
+field0 u32 ;
+field1 f32 ;
+field2 array u32 2u ;
+;
 
-var<private> x_1 : u32;
+var private x_1 u32 ;
 
-var<private> x_17 : bool;
+var private x_17 bool ;
 
-fn main_1() {
-  let x_101 : bool = x_17;
-  loop {
-    var x_2_phi : u32;
-    var x_5_phi : u32;
-    x_2_phi = 0u;
-    x_5_phi = 1u;
-    loop {
-      var x_7 : u32;
-      let x_2 : u32 = x_2_phi;
-      let x_5 : u32 = x_5_phi;
-      let x_4 : u32 = (x_2 + 1u);
-      let x_6 : u32 = (x_4 + 1u);
-      if (x_101) {
-        break;
-      }
+fn main_1
+let x_101 bool = x_17 ;
+loop
+var x_2_phi u32 ;
+var x_5_phi u32 ;
+x_2_phi = 0u ;
+x_5_phi = 1u ;
+loop
+var x_7 u32 ;
+let x_2 u32 = x_2_phi ;
+let x_5 u32 = x_5_phi ;
+let x_4 u32 = x_2 + 1u ;
+let x_6 u32 = x_4 + 1u ;
+if x_101
+break ;
 
-      continuing {
-        x_7 = (x_4 + x_6);
-        x_2_phi = x_4;
-        x_5_phi = x_7;
-      }
-    }
-  }
-  return;
-}
 
-[[stage(fragment)]]
-fn main() {
-  main_1();
-}
+continuing
+x_7 = x_4 + x_6 ;
+x_2_phi = x_4 ;
+x_5_phi = x_7 ;
 
-error: loop does not exit
+
+
+return ;
+
+
+stage fragment
+fn main
+main_1 ;
+
+
+error loop does not exit
diff --git a/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_Phi_ValueFromLoopBodyAndContinuing.spvasm.expected.wgsl b/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_Phi_ValueFromLoopBodyAndContinuing.spvasm.expected.wgsl
index f9ae993..099f55e 100644
--- a/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_Phi_ValueFromLoopBodyAndContinuing.spvasm.expected.wgsl
+++ b/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_Phi_ValueFromLoopBodyAndContinuing.spvasm.expected.wgsl
@@ -38,7 +38,7 @@
   return;
 }
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() {
   main_1();
 }
diff --git a/test/var/inferred/function.wgsl b/test/var/inferred/function.wgsl
index 0d39fe0..c1bea4c 100644
--- a/test/var/inferred/function.wgsl
+++ b/test/var/inferred/function.wgsl
@@ -33,7 +33,7 @@
     var v15 = ret_MyArray();

 }

 

-[[stage(fragment)]]

-fn main() -> [[location(0)]] vec4<f32> {

+@stage(fragment)

+fn main() -> @location(0) vec4<f32> {

     return vec4<f32>(0.0,0.0,0.0,0.0);

 }

diff --git a/test/var/inferred/function.wgsl.expected.wgsl b/test/var/inferred/function.wgsl.expected.wgsl
index 2c8b7ab..bd60a83 100644
--- a/test/var/inferred/function.wgsl.expected.wgsl
+++ b/test/var/inferred/function.wgsl.expected.wgsl
@@ -42,7 +42,7 @@
   var v15 = ret_MyArray();
 }
 
-[[stage(fragment)]]
-fn main() -> [[location(0)]] vec4<f32> {
+@stage(fragment)
+fn main() -> @location(0) vec4<f32> {
   return vec4<f32>(0.0, 0.0, 0.0, 0.0);
 }
diff --git a/test/var/initialization/function/array.wgsl b/test/var/initialization/function/array.wgsl
index 269c9ed..c261a3a 100644
--- a/test/var/initialization/function/array.wgsl
+++ b/test/var/initialization/function/array.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     var v : array<i32, 3>;
     _ = v;
diff --git a/test/var/initialization/function/array.wgsl.expected.wgsl b/test/var/initialization/function/array.wgsl.expected.wgsl
index 0dd6ece..8ff70f2 100644
--- a/test/var/initialization/function/array.wgsl.expected.wgsl
+++ b/test/var/initialization/function/array.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : array<i32, 3>;
   _ = v;
diff --git a/test/var/initialization/function/matrix.wgsl b/test/var/initialization/function/matrix.wgsl
index 7f3830d..ea336e8 100644
--- a/test/var/initialization/function/matrix.wgsl
+++ b/test/var/initialization/function/matrix.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     var v : mat2x3<f32>;
     _ = v;
diff --git a/test/var/initialization/function/matrix.wgsl.expected.wgsl b/test/var/initialization/function/matrix.wgsl.expected.wgsl
index f4fadc6..d8bb391 100644
--- a/test/var/initialization/function/matrix.wgsl.expected.wgsl
+++ b/test/var/initialization/function/matrix.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : mat2x3<f32>;
   _ = v;
diff --git a/test/var/initialization/function/scalar.wgsl b/test/var/initialization/function/scalar.wgsl
index d945843..5d3b86e 100644
--- a/test/var/initialization/function/scalar.wgsl
+++ b/test/var/initialization/function/scalar.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     var v : i32;
     _ = v;
diff --git a/test/var/initialization/function/scalar.wgsl.expected.wgsl b/test/var/initialization/function/scalar.wgsl.expected.wgsl
index 778a994..67ee18d 100644
--- a/test/var/initialization/function/scalar.wgsl.expected.wgsl
+++ b/test/var/initialization/function/scalar.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : i32;
   _ = v;
diff --git a/test/var/initialization/function/struct.wgsl b/test/var/initialization/function/struct.wgsl
index 5f80b50..55babed 100644
--- a/test/var/initialization/function/struct.wgsl
+++ b/test/var/initialization/function/struct.wgsl
@@ -3,7 +3,7 @@
     b : f32;
 };
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     var v : S;
     _ = v;
diff --git a/test/var/initialization/function/struct.wgsl.expected.wgsl b/test/var/initialization/function/struct.wgsl.expected.wgsl
index 538187c..2dd4381 100644
--- a/test/var/initialization/function/struct.wgsl.expected.wgsl
+++ b/test/var/initialization/function/struct.wgsl.expected.wgsl
@@ -3,7 +3,7 @@
   b : f32;
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : S;
   _ = v;
diff --git a/test/var/initialization/function/vector.wgsl b/test/var/initialization/function/vector.wgsl
index 95516f6..40bc481 100644
--- a/test/var/initialization/function/vector.wgsl
+++ b/test/var/initialization/function/vector.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     var v : vec3<i32>;
     _ = v;
diff --git a/test/var/initialization/function/vector.wgsl.expected.wgsl b/test/var/initialization/function/vector.wgsl.expected.wgsl
index 796b9e3..37600e5 100644
--- a/test/var/initialization/function/vector.wgsl.expected.wgsl
+++ b/test/var/initialization/function/vector.wgsl.expected.wgsl
@@ -1,4 +1,4 @@
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   var v : vec3<i32>;
   _ = v;
diff --git a/test/var/initialization/private/array.wgsl b/test/var/initialization/private/array.wgsl
index 8f7374a..f01730a 100644
--- a/test/var/initialization/private/array.wgsl
+++ b/test/var/initialization/private/array.wgsl
@@ -1,6 +1,6 @@
 var<private> v : array<i32, 3>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = v;
 }
diff --git a/test/var/initialization/private/array.wgsl.expected.wgsl b/test/var/initialization/private/array.wgsl.expected.wgsl
index 6f76127..ba967ec 100644
--- a/test/var/initialization/private/array.wgsl.expected.wgsl
+++ b/test/var/initialization/private/array.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
 var<private> v : array<i32, 3>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = v;
 }
diff --git a/test/var/initialization/private/matrix.wgsl b/test/var/initialization/private/matrix.wgsl
index 2530cc6..e46734c 100644
--- a/test/var/initialization/private/matrix.wgsl
+++ b/test/var/initialization/private/matrix.wgsl
@@ -1,6 +1,6 @@
 var<private> v : mat2x3<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = v;
 }
diff --git a/test/var/initialization/private/matrix.wgsl.expected.wgsl b/test/var/initialization/private/matrix.wgsl.expected.wgsl
index 73501a1..c3042ab 100644
--- a/test/var/initialization/private/matrix.wgsl.expected.wgsl
+++ b/test/var/initialization/private/matrix.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
 var<private> v : mat2x3<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = v;
 }
diff --git a/test/var/initialization/private/scalar.wgsl b/test/var/initialization/private/scalar.wgsl
index 7c298cf..8e46653 100644
--- a/test/var/initialization/private/scalar.wgsl
+++ b/test/var/initialization/private/scalar.wgsl
@@ -1,6 +1,6 @@
 var<private> v : i32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = v;
 }
diff --git a/test/var/initialization/private/scalar.wgsl.expected.wgsl b/test/var/initialization/private/scalar.wgsl.expected.wgsl
index c412580..911081b 100644
--- a/test/var/initialization/private/scalar.wgsl.expected.wgsl
+++ b/test/var/initialization/private/scalar.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
 var<private> v : i32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = v;
 }
diff --git a/test/var/initialization/private/struct.wgsl b/test/var/initialization/private/struct.wgsl
index d1b70f2..db44563 100644
--- a/test/var/initialization/private/struct.wgsl
+++ b/test/var/initialization/private/struct.wgsl
@@ -5,7 +5,7 @@
 
 var<private> v : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = v;
 }
diff --git a/test/var/initialization/private/struct.wgsl.expected.wgsl b/test/var/initialization/private/struct.wgsl.expected.wgsl
index a91da6a..6d46d0d 100644
--- a/test/var/initialization/private/struct.wgsl.expected.wgsl
+++ b/test/var/initialization/private/struct.wgsl.expected.wgsl
@@ -5,7 +5,7 @@
 
 var<private> v : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = v;
 }
diff --git a/test/var/initialization/private/vector.wgsl b/test/var/initialization/private/vector.wgsl
index 621a3ff..2af1bf5 100644
--- a/test/var/initialization/private/vector.wgsl
+++ b/test/var/initialization/private/vector.wgsl
@@ -1,6 +1,6 @@
 var<private> v : vec3<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = v;
 }
diff --git a/test/var/initialization/private/vector.wgsl.expected.wgsl b/test/var/initialization/private/vector.wgsl.expected.wgsl
index 7ed65cd..183418e 100644
--- a/test/var/initialization/private/vector.wgsl.expected.wgsl
+++ b/test/var/initialization/private/vector.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
 var<private> v : vec3<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = v;
 }
diff --git a/test/var/initialization/workgroup/array.wgsl b/test/var/initialization/workgroup/array.wgsl
index 1a91ef5..1d9aa8b 100644
--- a/test/var/initialization/workgroup/array.wgsl
+++ b/test/var/initialization/workgroup/array.wgsl
@@ -1,6 +1,6 @@
 var<workgroup> v : array<i32, 3>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = v;
 }
diff --git a/test/var/initialization/workgroup/array.wgsl.expected.wgsl b/test/var/initialization/workgroup/array.wgsl.expected.wgsl
index e9ea7eb..cc53b73 100644
--- a/test/var/initialization/workgroup/array.wgsl.expected.wgsl
+++ b/test/var/initialization/workgroup/array.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
 var<workgroup> v : array<i32, 3>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = v;
 }
diff --git a/test/var/initialization/workgroup/matrix.wgsl b/test/var/initialization/workgroup/matrix.wgsl
index 2410685..f494319 100644
--- a/test/var/initialization/workgroup/matrix.wgsl
+++ b/test/var/initialization/workgroup/matrix.wgsl
@@ -1,6 +1,6 @@
 var<workgroup> v : mat2x3<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = v;
 }
diff --git a/test/var/initialization/workgroup/matrix.wgsl.expected.wgsl b/test/var/initialization/workgroup/matrix.wgsl.expected.wgsl
index df1a415..62ce905 100644
--- a/test/var/initialization/workgroup/matrix.wgsl.expected.wgsl
+++ b/test/var/initialization/workgroup/matrix.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
 var<workgroup> v : mat2x3<f32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = v;
 }
diff --git a/test/var/initialization/workgroup/scalar.wgsl b/test/var/initialization/workgroup/scalar.wgsl
index b9fcda7..37c8a4f 100644
--- a/test/var/initialization/workgroup/scalar.wgsl
+++ b/test/var/initialization/workgroup/scalar.wgsl
@@ -1,6 +1,6 @@
 var<workgroup> v : i32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = v;
 }
diff --git a/test/var/initialization/workgroup/scalar.wgsl.expected.wgsl b/test/var/initialization/workgroup/scalar.wgsl.expected.wgsl
index 4a2272a..3cfef70 100644
--- a/test/var/initialization/workgroup/scalar.wgsl.expected.wgsl
+++ b/test/var/initialization/workgroup/scalar.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
 var<workgroup> v : i32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = v;
 }
diff --git a/test/var/initialization/workgroup/struct.wgsl b/test/var/initialization/workgroup/struct.wgsl
index 4651335..5fa28ed 100644
--- a/test/var/initialization/workgroup/struct.wgsl
+++ b/test/var/initialization/workgroup/struct.wgsl
@@ -5,7 +5,7 @@
 
 var<workgroup> v : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = v;
 }
diff --git a/test/var/initialization/workgroup/struct.wgsl.expected.wgsl b/test/var/initialization/workgroup/struct.wgsl.expected.wgsl
index b67e95a..c42ae1c 100644
--- a/test/var/initialization/workgroup/struct.wgsl.expected.wgsl
+++ b/test/var/initialization/workgroup/struct.wgsl.expected.wgsl
@@ -5,7 +5,7 @@
 
 var<workgroup> v : S;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = v;
 }
diff --git a/test/var/initialization/workgroup/vector.wgsl b/test/var/initialization/workgroup/vector.wgsl
index c1ff6bb..37ff6f2 100644
--- a/test/var/initialization/workgroup/vector.wgsl
+++ b/test/var/initialization/workgroup/vector.wgsl
@@ -1,6 +1,6 @@
 var<workgroup> v : vec3<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = v;
 }
diff --git a/test/var/initialization/workgroup/vector.wgsl.expected.wgsl b/test/var/initialization/workgroup/vector.wgsl.expected.wgsl
index a3aead5..a6f967c 100644
--- a/test/var/initialization/workgroup/vector.wgsl.expected.wgsl
+++ b/test/var/initialization/workgroup/vector.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
 var<workgroup> v : vec3<i32>;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = v;
 }
diff --git a/test/var/override/named/no_init/bool.wgsl b/test/var/override/named/no_init/bool.wgsl
index 4b58e68..fe69ac3 100644
--- a/test/var/override/named/no_init/bool.wgsl
+++ b/test/var/override/named/no_init/bool.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : bool;
+@override let o : bool;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/named/no_init/bool.wgsl.expected.wgsl b/test/var/override/named/no_init/bool.wgsl.expected.wgsl
index 8fcab9b..c4b5efd 100644
--- a/test/var/override/named/no_init/bool.wgsl.expected.wgsl
+++ b/test/var/override/named/no_init/bool.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : bool;
+@override let o : bool;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/override/named/no_init/f32.wgsl b/test/var/override/named/no_init/f32.wgsl
index c09196d..5328e9d 100644
--- a/test/var/override/named/no_init/f32.wgsl
+++ b/test/var/override/named/no_init/f32.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : f32;
+@override let o : f32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/named/no_init/f32.wgsl.expected.wgsl b/test/var/override/named/no_init/f32.wgsl.expected.wgsl
index 5e60be6..1d09452 100644
--- a/test/var/override/named/no_init/f32.wgsl.expected.wgsl
+++ b/test/var/override/named/no_init/f32.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : f32;
+@override let o : f32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/override/named/no_init/i32.wgsl b/test/var/override/named/no_init/i32.wgsl
index 790c56d..0a3ed57 100644
--- a/test/var/override/named/no_init/i32.wgsl
+++ b/test/var/override/named/no_init/i32.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : i32;
+@override let o : i32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/named/no_init/i32.wgsl.expected.wgsl b/test/var/override/named/no_init/i32.wgsl.expected.wgsl
index 56a81dd..92a7426 100644
--- a/test/var/override/named/no_init/i32.wgsl.expected.wgsl
+++ b/test/var/override/named/no_init/i32.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : i32;
+@override let o : i32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/override/named/no_init/u32.wgsl b/test/var/override/named/no_init/u32.wgsl
index b4826d8..bce0c77 100644
--- a/test/var/override/named/no_init/u32.wgsl
+++ b/test/var/override/named/no_init/u32.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : u32;
+@override let o : u32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/named/no_init/u32.wgsl.expected.wgsl b/test/var/override/named/no_init/u32.wgsl.expected.wgsl
index ad44144..31db066 100644
--- a/test/var/override/named/no_init/u32.wgsl.expected.wgsl
+++ b/test/var/override/named/no_init/u32.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : u32;
+@override let o : u32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/override/named/val_init/bool.wgsl b/test/var/override/named/val_init/bool.wgsl
index 0cb9566..9edeffa 100644
--- a/test/var/override/named/val_init/bool.wgsl
+++ b/test/var/override/named/val_init/bool.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : bool = true;
+@override let o : bool = true;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/named/val_init/bool.wgsl.expected.wgsl b/test/var/override/named/val_init/bool.wgsl.expected.wgsl
index 8e9edf5..cbcd033 100644
--- a/test/var/override/named/val_init/bool.wgsl.expected.wgsl
+++ b/test/var/override/named/val_init/bool.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : bool = true;
+@override let o : bool = true;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/override/named/val_init/f32.wgsl b/test/var/override/named/val_init/f32.wgsl
index 904a8ad..a58f753 100644
--- a/test/var/override/named/val_init/f32.wgsl
+++ b/test/var/override/named/val_init/f32.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : f32 = 1.0;
+@override let o : f32 = 1.0;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/named/val_init/f32.wgsl.expected.wgsl b/test/var/override/named/val_init/f32.wgsl.expected.wgsl
index 32660b8..18e6ceb 100644
--- a/test/var/override/named/val_init/f32.wgsl.expected.wgsl
+++ b/test/var/override/named/val_init/f32.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : f32 = 1.0;
+@override let o : f32 = 1.0;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/override/named/val_init/i32.wgsl b/test/var/override/named/val_init/i32.wgsl
index c94ee67..642096d 100644
--- a/test/var/override/named/val_init/i32.wgsl
+++ b/test/var/override/named/val_init/i32.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : i32 = 1;
+@override let o : i32 = 1;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/named/val_init/i32.wgsl.expected.wgsl b/test/var/override/named/val_init/i32.wgsl.expected.wgsl
index b897fd53..46adcb7 100644
--- a/test/var/override/named/val_init/i32.wgsl.expected.wgsl
+++ b/test/var/override/named/val_init/i32.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : i32 = 1;
+@override let o : i32 = 1;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/override/named/val_init/u32.wgsl b/test/var/override/named/val_init/u32.wgsl
index 8c8df63..582f7ab 100644
--- a/test/var/override/named/val_init/u32.wgsl
+++ b/test/var/override/named/val_init/u32.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : u32 = 1u;
+@override let o : u32 = 1u;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/named/val_init/u32.wgsl.expected.wgsl b/test/var/override/named/val_init/u32.wgsl.expected.wgsl
index 3a62e22..06b1aa0 100644
--- a/test/var/override/named/val_init/u32.wgsl.expected.wgsl
+++ b/test/var/override/named/val_init/u32.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : u32 = 1u;
+@override let o : u32 = 1u;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/override/named/zero_init/bool.wgsl b/test/var/override/named/zero_init/bool.wgsl
index 1e03a45..8869f16 100644
--- a/test/var/override/named/zero_init/bool.wgsl
+++ b/test/var/override/named/zero_init/bool.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : bool = bool();
+@override let o : bool = bool();
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/named/zero_init/bool.wgsl.expected.wgsl b/test/var/override/named/zero_init/bool.wgsl.expected.wgsl
index 511bd67..f686612 100644
--- a/test/var/override/named/zero_init/bool.wgsl.expected.wgsl
+++ b/test/var/override/named/zero_init/bool.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : bool = bool();
+@override let o : bool = bool();
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/override/named/zero_init/f32.wgsl b/test/var/override/named/zero_init/f32.wgsl
index a47d934..4af2466 100644
--- a/test/var/override/named/zero_init/f32.wgsl
+++ b/test/var/override/named/zero_init/f32.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : f32 = f32();
+@override let o : f32 = f32();
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/named/zero_init/f32.wgsl.expected.wgsl b/test/var/override/named/zero_init/f32.wgsl.expected.wgsl
index fe1468f..9398382 100644
--- a/test/var/override/named/zero_init/f32.wgsl.expected.wgsl
+++ b/test/var/override/named/zero_init/f32.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : f32 = f32();
+@override let o : f32 = f32();
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/override/named/zero_init/i32.wgsl b/test/var/override/named/zero_init/i32.wgsl
index 6455227..132987a 100644
--- a/test/var/override/named/zero_init/i32.wgsl
+++ b/test/var/override/named/zero_init/i32.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : i32 = i32();
+@override let o : i32 = i32();
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/named/zero_init/i32.wgsl.expected.wgsl b/test/var/override/named/zero_init/i32.wgsl.expected.wgsl
index 5cde670..afa82db 100644
--- a/test/var/override/named/zero_init/i32.wgsl.expected.wgsl
+++ b/test/var/override/named/zero_init/i32.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : i32 = i32();
+@override let o : i32 = i32();
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/override/named/zero_init/u32.wgsl b/test/var/override/named/zero_init/u32.wgsl
index 9d1205e..047aeb5 100644
--- a/test/var/override/named/zero_init/u32.wgsl
+++ b/test/var/override/named/zero_init/u32.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : u32 = u32();
+@override let o : u32 = u32();
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/named/zero_init/u32.wgsl.expected.wgsl b/test/var/override/named/zero_init/u32.wgsl.expected.wgsl
index f9d5644..9146204 100644
--- a/test/var/override/named/zero_init/u32.wgsl.expected.wgsl
+++ b/test/var/override/named/zero_init/u32.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override]] let o : u32 = u32();
+@override let o : u32 = u32();
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/override/numbered/no_init/bool.wgsl b/test/var/override/numbered/no_init/bool.wgsl
index a8b81c7..407941d 100644
--- a/test/var/override/numbered/no_init/bool.wgsl
+++ b/test/var/override/numbered/no_init/bool.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : bool;
+@override(1234) let o : bool;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/numbered/no_init/bool.wgsl.expected.wgsl b/test/var/override/numbered/no_init/bool.wgsl.expected.wgsl
index e8d6daf..d51cd82 100644
--- a/test/var/override/numbered/no_init/bool.wgsl.expected.wgsl
+++ b/test/var/override/numbered/no_init/bool.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : bool;
+@override(1234) let o : bool;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/override/numbered/no_init/f32.wgsl b/test/var/override/numbered/no_init/f32.wgsl
index 95e9dfd..796c8ad 100644
--- a/test/var/override/numbered/no_init/f32.wgsl
+++ b/test/var/override/numbered/no_init/f32.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : f32;
+@override(1234) let o : f32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/numbered/no_init/f32.wgsl.expected.wgsl b/test/var/override/numbered/no_init/f32.wgsl.expected.wgsl
index cabed6a..2315774 100644
--- a/test/var/override/numbered/no_init/f32.wgsl.expected.wgsl
+++ b/test/var/override/numbered/no_init/f32.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : f32;
+@override(1234) let o : f32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/override/numbered/no_init/i32.wgsl b/test/var/override/numbered/no_init/i32.wgsl
index 74846ef..5778c73 100644
--- a/test/var/override/numbered/no_init/i32.wgsl
+++ b/test/var/override/numbered/no_init/i32.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : i32;
+@override(1234) let o : i32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/numbered/no_init/i32.wgsl.expected.wgsl b/test/var/override/numbered/no_init/i32.wgsl.expected.wgsl
index 68fb678..cdd1bdd 100644
--- a/test/var/override/numbered/no_init/i32.wgsl.expected.wgsl
+++ b/test/var/override/numbered/no_init/i32.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : i32;
+@override(1234) let o : i32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/override/numbered/no_init/u32.wgsl b/test/var/override/numbered/no_init/u32.wgsl
index 152c709..7992da9 100644
--- a/test/var/override/numbered/no_init/u32.wgsl
+++ b/test/var/override/numbered/no_init/u32.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : u32;
+@override(1234) let o : u32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/numbered/no_init/u32.wgsl.expected.wgsl b/test/var/override/numbered/no_init/u32.wgsl.expected.wgsl
index 40cb6c0..2a2fc96 100644
--- a/test/var/override/numbered/no_init/u32.wgsl.expected.wgsl
+++ b/test/var/override/numbered/no_init/u32.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : u32;
+@override(1234) let o : u32;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/override/numbered/val_init/bool.wgsl b/test/var/override/numbered/val_init/bool.wgsl
index c29ec30..91cbe00 100644
--- a/test/var/override/numbered/val_init/bool.wgsl
+++ b/test/var/override/numbered/val_init/bool.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : bool = true;
+@override(1234) let o : bool = true;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/numbered/val_init/bool.wgsl.expected.wgsl b/test/var/override/numbered/val_init/bool.wgsl.expected.wgsl
index 2ab9051..57c6d05 100644
--- a/test/var/override/numbered/val_init/bool.wgsl.expected.wgsl
+++ b/test/var/override/numbered/val_init/bool.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : bool = true;
+@override(1234) let o : bool = true;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/override/numbered/val_init/f32.wgsl b/test/var/override/numbered/val_init/f32.wgsl
index 649d4e8..7251986 100644
--- a/test/var/override/numbered/val_init/f32.wgsl
+++ b/test/var/override/numbered/val_init/f32.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : f32 = 1.0;
+@override(1234) let o : f32 = 1.0;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/numbered/val_init/f32.wgsl.expected.wgsl b/test/var/override/numbered/val_init/f32.wgsl.expected.wgsl
index bb12693..d2a4882 100644
--- a/test/var/override/numbered/val_init/f32.wgsl.expected.wgsl
+++ b/test/var/override/numbered/val_init/f32.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : f32 = 1.0;
+@override(1234) let o : f32 = 1.0;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/override/numbered/val_init/i32.wgsl b/test/var/override/numbered/val_init/i32.wgsl
index d867f6a..1036ba5 100644
--- a/test/var/override/numbered/val_init/i32.wgsl
+++ b/test/var/override/numbered/val_init/i32.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : i32 = 1;
+@override(1234) let o : i32 = 1;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/numbered/val_init/i32.wgsl.expected.wgsl b/test/var/override/numbered/val_init/i32.wgsl.expected.wgsl
index 592dd92..8f8e5f1 100644
--- a/test/var/override/numbered/val_init/i32.wgsl.expected.wgsl
+++ b/test/var/override/numbered/val_init/i32.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : i32 = 1;
+@override(1234) let o : i32 = 1;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/override/numbered/val_init/u32.wgsl b/test/var/override/numbered/val_init/u32.wgsl
index 22c55f2..3ee87d3 100644
--- a/test/var/override/numbered/val_init/u32.wgsl
+++ b/test/var/override/numbered/val_init/u32.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : u32 = 1u;
+@override(1234) let o : u32 = 1u;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/numbered/val_init/u32.wgsl.expected.wgsl b/test/var/override/numbered/val_init/u32.wgsl.expected.wgsl
index 18bb63b..4712fda 100644
--- a/test/var/override/numbered/val_init/u32.wgsl.expected.wgsl
+++ b/test/var/override/numbered/val_init/u32.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : u32 = 1u;
+@override(1234) let o : u32 = 1u;
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/override/numbered/zero_init/bool.wgsl b/test/var/override/numbered/zero_init/bool.wgsl
index 894b584..27a68b3 100644
--- a/test/var/override/numbered/zero_init/bool.wgsl
+++ b/test/var/override/numbered/zero_init/bool.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : bool = bool();
+@override(1234) let o : bool = bool();
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/numbered/zero_init/bool.wgsl.expected.wgsl b/test/var/override/numbered/zero_init/bool.wgsl.expected.wgsl
index 653b1da..2e68a0e 100644
--- a/test/var/override/numbered/zero_init/bool.wgsl.expected.wgsl
+++ b/test/var/override/numbered/zero_init/bool.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : bool = bool();
+@override(1234) let o : bool = bool();
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/override/numbered/zero_init/f32.wgsl b/test/var/override/numbered/zero_init/f32.wgsl
index 0a3908c..a022f0b 100644
--- a/test/var/override/numbered/zero_init/f32.wgsl
+++ b/test/var/override/numbered/zero_init/f32.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : f32 = f32();
+@override(1234) let o : f32 = f32();
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/numbered/zero_init/f32.wgsl.expected.wgsl b/test/var/override/numbered/zero_init/f32.wgsl.expected.wgsl
index 589751b..e5d2086 100644
--- a/test/var/override/numbered/zero_init/f32.wgsl.expected.wgsl
+++ b/test/var/override/numbered/zero_init/f32.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : f32 = f32();
+@override(1234) let o : f32 = f32();
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/override/numbered/zero_init/i32.wgsl b/test/var/override/numbered/zero_init/i32.wgsl
index 4dd63fd..448f14a 100644
--- a/test/var/override/numbered/zero_init/i32.wgsl
+++ b/test/var/override/numbered/zero_init/i32.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : i32 = i32();
+@override(1234) let o : i32 = i32();
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/numbered/zero_init/i32.wgsl.expected.wgsl b/test/var/override/numbered/zero_init/i32.wgsl.expected.wgsl
index 8c0adca..c250241 100644
--- a/test/var/override/numbered/zero_init/i32.wgsl.expected.wgsl
+++ b/test/var/override/numbered/zero_init/i32.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : i32 = i32();
+@override(1234) let o : i32 = i32();
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/override/numbered/zero_init/u32.wgsl b/test/var/override/numbered/zero_init/u32.wgsl
index d525204..ff50cba 100644
--- a/test/var/override/numbered/zero_init/u32.wgsl
+++ b/test/var/override/numbered/zero_init/u32.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : u32 = u32();
+@override(1234) let o : u32 = u32();
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
     _ = o;
 }
diff --git a/test/var/override/numbered/zero_init/u32.wgsl.expected.wgsl b/test/var/override/numbered/zero_init/u32.wgsl.expected.wgsl
index d45213b..1dc6121 100644
--- a/test/var/override/numbered/zero_init/u32.wgsl.expected.wgsl
+++ b/test/var/override/numbered/zero_init/u32.wgsl.expected.wgsl
@@ -1,6 +1,6 @@
-[[override(1234)]] let o : u32 = u32();
+@override(1234) let o : u32 = u32();
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main() {
   _ = o;
 }
diff --git a/test/var/uses/many_workgroup_vars.wgsl b/test/var/uses/many_workgroup_vars.wgsl
index 7857da9..56df492 100644
--- a/test/var/uses/many_workgroup_vars.wgsl
+++ b/test/var/uses/many_workgroup_vars.wgsl
@@ -99,8 +99,8 @@
 var<workgroup> m98 : mat2x2<f32>;
 var<workgroup> m99 : mat2x2<f32>;
 
-[[stage(compute), workgroup_size(1)]]
-fn tint_symbol([[builtin(local_invocation_index)]] idx : u32) {
+@stage(compute) @workgroup_size(1)
+fn tint_symbol(@builtin(local_invocation_index) idx : u32) {
   m00[0][0] = 1.0;
   m01[0][0] = 1.0;
   m02[0][0] = 1.0;
@@ -201,4 +201,4 @@
   m97[0][0] = 1.0;
   m98[0][0] = 1.0;
   m99[0][0] = 1.0;
-}
\ No newline at end of file
+}
diff --git a/test/var/uses/many_workgroup_vars.wgsl.expected.wgsl b/test/var/uses/many_workgroup_vars.wgsl.expected.wgsl
index 873700f..9d1822e 100644
--- a/test/var/uses/many_workgroup_vars.wgsl.expected.wgsl
+++ b/test/var/uses/many_workgroup_vars.wgsl.expected.wgsl
@@ -198,8 +198,8 @@
 
 var<workgroup> m99 : mat2x2<f32>;
 
-[[stage(compute), workgroup_size(1)]]
-fn tint_symbol([[builtin(local_invocation_index)]] idx : u32) {
+@stage(compute) @workgroup_size(1)
+fn tint_symbol(@builtin(local_invocation_index) idx : u32) {
   m00[0][0] = 1.0;
   m01[0][0] = 1.0;
   m02[0][0] = 1.0;
diff --git a/test/var/uses/private.wgsl b/test/var/uses/private.wgsl
index a08e705..6ec289a 100644
--- a/test/var/uses/private.wgsl
+++ b/test/var/uses/private.wgsl
@@ -25,25 +25,25 @@
   no_uses();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main1() {
   a = 42;
   uses_a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main2() {
   b = 7;
   uses_b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main3() {
   outer();
   no_uses();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main4() {
   no_uses();
 }
diff --git a/test/var/uses/private.wgsl.expected.wgsl b/test/var/uses/private.wgsl.expected.wgsl
index ae27b42..4770447 100644
--- a/test/var/uses/private.wgsl.expected.wgsl
+++ b/test/var/uses/private.wgsl.expected.wgsl
@@ -27,25 +27,25 @@
   no_uses();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main1() {
   a = 42;
   uses_a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main2() {
   b = 7;
   uses_b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main3() {
   outer();
   no_uses();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main4() {
   no_uses();
 }
diff --git a/test/var/uses/workgroup.wgsl b/test/var/uses/workgroup.wgsl
index d47c3da..23736b5 100644
--- a/test/var/uses/workgroup.wgsl
+++ b/test/var/uses/workgroup.wgsl
@@ -25,25 +25,25 @@
   no_uses();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main1() {
   a = 42;
   uses_a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main2() {
   b = 7;
   uses_b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main3() {
   outer();
   no_uses();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main4() {
   no_uses();
 }
diff --git a/test/var/uses/workgroup.wgsl.expected.wgsl b/test/var/uses/workgroup.wgsl.expected.wgsl
index 95d9b6b..a3386fe 100644
--- a/test/var/uses/workgroup.wgsl.expected.wgsl
+++ b/test/var/uses/workgroup.wgsl.expected.wgsl
@@ -27,25 +27,25 @@
   no_uses();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main1() {
   a = 42;
   uses_a();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main2() {
   b = 7;
   uses_b();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main3() {
   outer();
   no_uses();
 }
 
-[[stage(compute), workgroup_size(1)]]
+@stage(compute) @workgroup_size(1)
 fn main4() {
   no_uses();
 }
diff --git a/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.wgsl b/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.wgsl
index cd91ab7..cb95b58 100644
--- a/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.wgsl
+++ b/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.wgsl
@@ -16,13 +16,13 @@
   data2 : i32;
 };
 
-[[group(0), binding(3)]] var<storage, read_write> x_4 : result;
+@group(0) @binding(3) var<storage, read_write> x_4 : result;
 
-[[group(0), binding(0)]] var<uniform> x_6 : block0;
+@group(0) @binding(0) var<uniform> x_6 : block0;
 
-[[group(0), binding(1)]] var<uniform> x_8 : block1;
+@group(0) @binding(1) var<uniform> x_8 : block1;
 
-[[group(0), binding(2)]] var<uniform> x_10 : block2;
+@group(0) @binding(2) var<uniform> x_10 : block2;
 
 fn main_1() {
   let x_25 : i32 = x_6.data0;
@@ -34,7 +34,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.wgsl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.wgsl
index 8d78d1e..0e4fce3 100644
--- a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.wgsl
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.wgsl
@@ -2,14 +2,14 @@
   data : vec4<f32>;
 };
 
-[[group(0), binding(1)]] var<storage, read_write> x_4 : block0;
+@group(0) @binding(1) var<storage, read_write> x_4 : block0;
 
 fn main_1() {
   x_4.data = vec4<f32>(1.0, 2.0, 3.0, 4.0);
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.wgsl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.wgsl
index 465aac8..5cdad21 100644
--- a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.wgsl
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.wgsl
@@ -6,7 +6,7 @@
 
 var<private> frag_color : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_8 : block0;
+@group(0) @binding(1) var<uniform> x_8 : block0;
 
 var<private> gl_Position : vec4<f32>;
 
@@ -19,14 +19,14 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
-  [[location(0)]]
+  @location(0)
   frag_color_1 : vec4<f32>;
 };
 
-[[stage(vertex)]]
-fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+@stage(vertex)
+fn main(@location(0) position_param : vec4<f32>) -> main_out {
   position = position_param;
   main_1();
   return main_out(gl_Position, frag_color);
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.wgsl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.wgsl
index 0901c1f..eae3d41 100644
--- a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.wgsl
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.wgsl
@@ -9,12 +9,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   final_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[location(0)]] frag_color_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@location(0) frag_color_param : vec4<f32>) -> main_out {
   frag_color = frag_color_param;
   main_1();
   return main_out(final_color);
diff --git a/test/vk-gl-cts/combined_operations/negintdivand/0-opt.wgsl b/test/vk-gl-cts/combined_operations/negintdivand/0-opt.wgsl
index b9cc524..8e480df 100644
--- a/test/vk-gl-cts/combined_operations/negintdivand/0-opt.wgsl
+++ b/test/vk-gl-cts/combined_operations/negintdivand/0-opt.wgsl
@@ -13,14 +13,14 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
-  [[location(1)]]
+  @location(1)
   frag_color_1 : vec4<f32>;
 };
 
-[[stage(vertex)]]
-fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+@stage(vertex)
+fn main(@location(0) position_param : vec4<f32>) -> main_out {
   position = position_param;
   main_1();
   return main_out(gl_Position, frag_color);
diff --git a/test/vk-gl-cts/combined_operations/negintdivand/1.wgsl b/test/vk-gl-cts/combined_operations/negintdivand/1.wgsl
index cbbd626..0ad4fe9 100644
--- a/test/vk-gl-cts/combined_operations/negintdivand/1.wgsl
+++ b/test/vk-gl-cts/combined_operations/negintdivand/1.wgsl
@@ -16,12 +16,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   color_out_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[location(1)]] frag_color_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@location(1) frag_color_param : vec4<f32>) -> main_out {
   frag_color = frag_color_param;
   main_1();
   return main_out(color_out);
diff --git a/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.wgsl
index 8432d48..6d1ff1f 100644
--- a/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.wgsl
@@ -11,11 +11,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.wgsl
index 32cc07e..ae0c7b0 100644
--- a/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.wgsl
@@ -6,7 +6,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+@group(0) @binding(0) var<uniform> x_11 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -101,11 +101,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.wgsl
index c345dfc..58049a1 100644
--- a/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.wgsl
@@ -10,7 +10,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_30 : buf0;
+@group(0) @binding(0) var<uniform> x_30 : buf0;
 
 fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
   var temp : i32;
@@ -185,11 +185,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.wgsl
index 75f4bd37..db02da6 100644
--- a/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -91,12 +91,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.wgsl
index a09f0d4..63e9675 100644
--- a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.wgsl
@@ -102,12 +102,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.wgsl
index 19735ee..9c19516 100644
--- a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.wgsl
@@ -83,11 +83,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.wgsl
index 5793a6f..6200ff3 100644
--- a/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.wgsl
@@ -1,4 +1,4 @@
-type RTArr = [[stride(4)]] array<i32>;
+type RTArr = @stride(4) array<i32>;
 
 struct doesNotMatter {
   global_seed : i32;
@@ -11,9 +11,9 @@
 
 var<private> gl_LocalInvocationID : vec3<u32>;
 
-[[group(0), binding(0)]] var<storage, read_write> x_7 : doesNotMatter;
+@group(0) @binding(0) var<storage, read_write> x_7 : doesNotMatter;
 
-[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+@group(0) @binding(1) var<uniform> x_10 : buf1;
 
 fn main_1() {
   var lid : i32;
@@ -55,8 +55,8 @@
   return;
 }
 
-[[stage(compute), workgroup_size(16, 1, 1)]]
-fn main([[builtin(local_invocation_id)]] gl_LocalInvocationID_param : vec3<u32>) {
+@stage(compute) @workgroup_size(16, 1, 1)
+fn main(@builtin(local_invocation_id) gl_LocalInvocationID_param : vec3<u32>) {
   gl_LocalInvocationID = gl_LocalInvocationID_param;
   main_1();
 }
diff --git a/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.wgsl
index 5ac0f1a..557b89c 100644
--- a/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 fn main_1() {
   var GLF_live12c5 : bool;
@@ -34,11 +34,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.wgsl
index 817d91b..04662ee 100644
--- a/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.wgsl
@@ -2,7 +2,7 @@
   one : f32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -28,11 +28,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.wgsl
index d68a5ec..f655e42 100644
--- a/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -62,11 +62,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.wgsl
index 520dccb..8af8b73 100644
--- a/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -20,11 +20,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.wgsl b/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.wgsl
index 088c0f8..1f03990 100644
--- a/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.wgsl
@@ -61,12 +61,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.wgsl
index 937a8df..4de0ebd 100644
--- a/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> GLF_live6tree : array<i32, 10>;
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -39,11 +39,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.wgsl
index 4affd4f..2a4df80 100644
--- a/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_25 : buf0;
+@group(0) @binding(0) var<uniform> x_25 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -304,12 +304,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.wgsl
index c7a4fe2..b4400e6 100644
--- a/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.wgsl
@@ -6,7 +6,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+@group(0) @binding(0) var<uniform> x_11 : buf0;
 
 fn func_i1_(b : ptr<function, i32>) -> f32 {
   var ndx : i32;
@@ -112,12 +112,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.wgsl
index 021c3f7..dd80eb3 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 3>;
+type Arr_1 = @stride(16) array<f32, 3>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -54,11 +54,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.wgsl
index b046ca1..c361951 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.wgsl
@@ -2,7 +2,7 @@
   zero : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -63,11 +63,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.wgsl
index 1fff19f..a652c56 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 3>;
+type Arr = @stride(16) array<f32, 3>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
@@ -12,11 +12,11 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 fn main_1() {
   var v : vec2<i32>;
@@ -45,12 +45,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.wgsl
index 6c62828..9630567 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.wgsl
@@ -2,7 +2,7 @@
   two : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -23,11 +23,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.wgsl
index 32c79b7..a4a925f 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<i32, 10>;
+type Arr = @stride(16) array<i32, 10>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 1>;
+type Arr_1 = @stride(16) array<f32, 1>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+@group(0) @binding(1) var<uniform> x_7 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -58,11 +58,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.wgsl
index d1079cb..87c4fe3 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 1>;
+type Arr_1 = @stride(16) array<f32, 1>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -48,11 +48,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl
index 019dd07..9a72028 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 1>;
+type Arr_1 = @stride(16) array<f32, 1>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr_1;
@@ -12,9 +12,9 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
 fn main_1() {
   var f0 : f32;
@@ -77,11 +77,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.wgsl
index e8b285f..fd64516 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<i32, 5>;
+type Arr = @stride(16) array<i32, 5>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 3>;
+type Arr_1 = @stride(16) array<f32, 3>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+@group(0) @binding(1) var<uniform> x_9 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -53,11 +53,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.wgsl
index 57cbd69..3b441f6e 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 1>;
+type Arr_1 = @stride(16) array<f32, 1>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -46,11 +46,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.wgsl
index 8bcb3a5..be02bf8 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.wgsl
@@ -22,11 +22,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.wgsl
index 3c3604a..4861cdf 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.wgsl
@@ -1,20 +1,20 @@
-type Arr = [[stride(16)]] array<i32, 12>;
+type Arr = @stride(16) array<i32, 12>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 1>;
+type Arr_1 = @stride(16) array<f32, 1>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_15 : buf0;
+@group(0) @binding(0) var<uniform> x_15 : buf0;
 
 fn main_1() {
   var m0 : mat3x4<f32>;
@@ -79,11 +79,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.wgsl
index 058b636..f9187ee 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -44,11 +44,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.wgsl
index ba3f0fe..fdeb85a 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.wgsl
@@ -1,20 +1,20 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 1>;
+type Arr_1 = @stride(16) array<f32, 1>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+@group(0) @binding(1) var<uniform> x_11 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -58,12 +58,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.wgsl
index ab2be50..f7f4488 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<i32, 20>;
+type Arr = @stride(16) array<i32, 20>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
@@ -8,11 +8,11 @@
   one : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_19 : buf1;
+@group(0) @binding(1) var<uniform> x_19 : buf1;
 
 fn main_1() {
   var arr0 : array<i32, 10>;
@@ -219,11 +219,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.wgsl
index f95fe55..f71829a 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 7>;
+type Arr = @stride(16) array<f32, 7>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -84,11 +84,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.wgsl
index 74ba82b..2ffa4ac 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 2>;
+type Arr_1 = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -53,11 +53,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.wgsl
index fbe9843..26f7859 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.wgsl
@@ -2,7 +2,7 @@
   zero : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -47,11 +47,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl
index 8cbbc01..383dd2b 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 1>;
+type Arr = @stride(16) array<f32, 1>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 3>;
+type Arr_1 = @stride(16) array<i32, 3>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
@@ -12,9 +12,9 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+@group(0) @binding(1) var<uniform> x_11 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -61,12 +61,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.wgsl
index f5e5913..5ab1ec2 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 4>;
+type Arr = @stride(16) array<i32, 4>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -57,11 +57,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.wgsl
index 1d88159..b8d916b 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.wgsl
@@ -2,23 +2,23 @@
   zero : f32;
 };
 
-type Arr = [[stride(16)]] array<f32, 1>;
+type Arr = @stride(16) array<f32, 1>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(2)]] var<uniform> x_6 : buf2;
+@group(0) @binding(2) var<uniform> x_6 : buf2;
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+@group(0) @binding(1) var<uniform> x_10 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -53,11 +53,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.wgsl
index 73515b9..9b8061d 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.wgsl
@@ -149,12 +149,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.wgsl
index b8f5efd..90b17bf 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<i32, 4>;
+type Arr = @stride(16) array<i32, 4>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 3>;
+type Arr_1 = @stride(16) array<f32, 3>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -137,11 +137,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.wgsl
index 3319941..e8560ca 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
@@ -6,7 +6,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 fn main_1() {
   var f : f32;
@@ -27,11 +27,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.wgsl
index 6cc8571..82acf85 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 3>;
+type Arr_1 = @stride(16) array<i32, 3>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+@group(0) @binding(1) var<uniform> x_9 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -65,11 +65,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.wgsl
index f53bccb..a5ffc0e 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.wgsl
@@ -1,20 +1,20 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+@group(0) @binding(1) var<uniform> x_7 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 fn main_1() {
   var a : f32;
@@ -41,11 +41,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.wgsl
index 6251946..c01653c 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<i32, 5>;
+type Arr = @stride(16) array<i32, 5>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 2>;
+type Arr_1 = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -71,11 +71,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.wgsl
index e0b9928..bbd9843 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.wgsl
@@ -1,20 +1,20 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 fn main_1() {
   var v0 : vec2<f32>;
@@ -42,11 +42,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.wgsl
index dc68ea4..3fc8857 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.wgsl
@@ -1,20 +1,20 @@
-type Arr = [[stride(16)]] array<f32, 3>;
+type Arr = @stride(16) array<f32, 3>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 fn main_1() {
   var v0 : vec2<f32>;
@@ -42,11 +42,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.wgsl
index 8d15f49..4b9df77 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
@@ -8,9 +8,9 @@
   zero : f32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+@group(0) @binding(1) var<uniform> x_9 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -43,11 +43,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.wgsl
index 7094098..f0c0fa1 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 3>;
+type Arr = @stride(16) array<f32, 3>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 4>;
+type Arr_1 = @stride(16) array<i32, 4>;
 
 struct buf2 {
   x_GLF_uniform_int_values : Arr_1;
@@ -14,7 +14,7 @@
   three : i32;
 };
 
-type Arr_2 = [[stride(16)]] array<u32, 1>;
+type Arr_2 = @stride(16) array<u32, 1>;
 
 struct buf0 {
   x_GLF_uniform_uint_values : Arr_2;
@@ -22,15 +22,15 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(2)]] var<uniform> x_12 : buf2;
+@group(0) @binding(2) var<uniform> x_12 : buf2;
 
-[[group(0), binding(3)]] var<uniform> x_14 : buf3;
+@group(0) @binding(3) var<uniform> x_14 : buf3;
 
-[[group(0), binding(0)]] var<uniform> x_16 : buf0;
+@group(0) @binding(0) var<uniform> x_16 : buf0;
 
 fn func0_() {
   var tmp : vec4<f32>;
@@ -128,12 +128,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.wgsl
index 4287868..3468018 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<f32, 5>;
+type Arr = @stride(16) array<f32, 5>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
@@ -6,7 +6,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -32,12 +32,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.wgsl
index 5049fc2..181cfc2 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.wgsl
@@ -2,17 +2,17 @@
   v1 : vec2<f32>;
 };
 
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 fn main_1() {
   var b : bool;
@@ -42,11 +42,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.wgsl
index 8cc5601..0b91056 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -50,11 +50,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.wgsl
index 3860701..fc6c715 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
@@ -8,7 +8,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 1>;
+type Arr_1 = @stride(16) array<f32, 1>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr_1;
@@ -16,11 +16,11 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(2)]] var<uniform> x_9 : buf2;
+@group(0) @binding(2) var<uniform> x_9 : buf2;
 
-[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+@group(0) @binding(1) var<uniform> x_11 : buf1;
 
 fn main_1() {
   var a : i32;
@@ -60,11 +60,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.wgsl
index 279f432..1bf8ce0 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.wgsl
@@ -2,7 +2,7 @@
   quarter : f32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -20,11 +20,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.wgsl
index 367bf40..e0b9f7d 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.wgsl
@@ -28,11 +28,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.wgsl
index c3e6f5d..95c8f9c 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.wgsl
@@ -2,7 +2,7 @@
   zero : f32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -18,11 +18,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.wgsl
index 45f886f..3801059 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 fn main_1() {
   var f : f32;
@@ -23,11 +23,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.wgsl
index b2ed065..cbea4ee 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.wgsl
@@ -2,7 +2,7 @@
   fourtytwo : f32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -29,11 +29,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.wgsl
index 2617e9c..348724f 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.wgsl
@@ -13,11 +13,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.wgsl
index 78b9651..a0b52a6 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -20,12 +20,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.wgsl
index bab28c3..c5e47de 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.wgsl
@@ -2,7 +2,7 @@
   zero : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -68,11 +68,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.wgsl
index 919120b..fe33aad 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
@@ -6,7 +6,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 fn main_1() {
   if (((1.0 % 1.0) <= 0.01)) {
@@ -23,11 +23,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.wgsl
index 9bdf93e..cb84651 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 1>;
+type Arr_1 = @stride(16) array<f32, 1>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -48,11 +48,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.wgsl
index 92d63c5..cf2d376 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 fn main_1() {
   var x_30 : bool;
@@ -40,11 +40,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.wgsl
index f14b530..5dd0328 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -30,11 +30,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.wgsl
index 2d4b641..a9f8c0d 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.wgsl
@@ -42,11 +42,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.wgsl
index aa69903..aff4ac4 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.wgsl
@@ -14,11 +14,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.wgsl
index 0fdf48f..903cd15 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 5>;
+type Arr = @stride(16) array<i32, 5>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -74,11 +74,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.wgsl
index 9853546..9a4d15f 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.wgsl
@@ -2,7 +2,7 @@
   one : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -21,11 +21,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.wgsl
index 3af5bf9..9822ce0 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<i32, 4>;
+type Arr = @stride(16) array<i32, 4>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
@@ -10,9 +10,9 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+@group(0) @binding(1) var<uniform> x_7 : buf1;
 
 fn main_1() {
   let x_28 : i32 = x_5.x_GLF_uniform_int_values[0];
@@ -52,11 +52,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.wgsl
index 91ec687..c0a411d 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.wgsl
@@ -6,7 +6,7 @@
   zero : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -58,11 +58,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.wgsl
index be4b0ae..6c2ce38 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.wgsl
@@ -6,7 +6,7 @@
   zero : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -30,11 +30,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.wgsl
index 1604234..9438771 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.wgsl
@@ -6,7 +6,7 @@
   zero : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -65,11 +65,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.wgsl
index 56180ef..6301e66 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.wgsl
@@ -1,20 +1,20 @@
-type Arr = [[stride(16)]] array<f32, 1>;
+type Arr = @stride(16) array<f32, 1>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 1>;
+type Arr_1 = @stride(16) array<i32, 1>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
 fn main_1() {
   var v : vec4<f32>;
@@ -29,11 +29,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.wgsl
index a5bfcb9..0eaf9df 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 5>;
+type Arr = @stride(16) array<i32, 5>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -91,11 +91,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.wgsl
index c7c18d1..659ece3 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.wgsl
@@ -65,11 +65,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.wgsl
index 645096c..6544198 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 3>;
+type Arr = @stride(16) array<f32, 3>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 3>;
+type Arr_1 = @stride(16) array<i32, 3>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -65,11 +65,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.wgsl
index 5c74b32..ff92b48 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 4>;
+type Arr = @stride(16) array<i32, 4>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -52,11 +52,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.wgsl
index 1a131cd..5cc135e 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 4>;
+type Arr = @stride(16) array<f32, 4>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
@@ -12,9 +12,9 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+@group(0) @binding(1) var<uniform> x_7 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+@group(0) @binding(0) var<uniform> x_12 : buf0;
 
 fn func_f1_(b : ptr<function, f32>) -> f32 {
   let x_90 : f32 = x_7.x_GLF_uniform_float_values[0];
@@ -78,11 +78,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.wgsl
index 06ea4a2..01e8325 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 4>;
+type Arr = @stride(16) array<f32, 4>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -36,11 +36,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.wgsl
index eadf964..1964f4c 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 4>;
+type Arr = @stride(16) array<i32, 4>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -44,11 +44,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.wgsl
index 1a4e159..308fa1a 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.wgsl
@@ -6,9 +6,9 @@
   minusEight : i32;
 };
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -51,11 +51,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.wgsl
index d6f28e9..52f8b42 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.wgsl
@@ -2,7 +2,7 @@
   one : f32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -66,11 +66,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.wgsl
index 14ef8d3..76343c7 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.wgsl
@@ -108,11 +108,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl
index 46da53a..cb78e4d 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl
@@ -8,7 +8,7 @@
 
 var<private> array1 : array<f32, 3>;
 
-[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+@group(0) @binding(0) var<uniform> x_11 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -72,12 +72,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.wgsl
index e1e2a9e..ddd7fa4 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 3>;
+type Arr_1 = @stride(16) array<i32, 3>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
@@ -16,11 +16,11 @@
 
 var<private> x_GLF_global_loop_count : i32;
 
-[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+@group(0) @binding(1) var<uniform> x_7 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
-[[group(0), binding(2)]] var<uniform> x_12 : buf2;
+@group(0) @binding(2) var<uniform> x_12 : buf2;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -79,11 +79,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.wgsl
index 0155704..ffdf893 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 3>;
+type Arr_1 = @stride(16) array<i32, 3>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+@group(0) @binding(1) var<uniform> x_9 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -55,11 +55,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.wgsl
index af5a1c1..cd8f3f0 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.wgsl
@@ -13,11 +13,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.wgsl
index b93b128..6006a29 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -53,11 +53,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.wgsl
index 690c3dd..9237ad8 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -60,11 +60,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.wgsl
index 620e1b8..e09ab73 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.wgsl
@@ -13,11 +13,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.wgsl
index 28e53df..4ca3a57 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 4>;
+type Arr_1 = @stride(16) array<i32, 4>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+@group(0) @binding(1) var<uniform> x_7 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -50,11 +50,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.wgsl
index 35a6b62..af347a5 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.wgsl
@@ -2,7 +2,7 @@
   one : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -42,11 +42,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.wgsl
index 57dfb87..91e2f98 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.wgsl
@@ -2,7 +2,7 @@
   one : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -17,11 +17,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.wgsl
index 76cdd76..92a2bb7 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.wgsl
@@ -2,7 +2,7 @@
   one : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -17,11 +17,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.wgsl
index a475384..4244472 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.wgsl
@@ -16,11 +16,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.wgsl
index 3d02048..7b6d3b1 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.wgsl
@@ -13,11 +13,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.wgsl
index 4fa9901..3926937 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.wgsl
@@ -27,12 +27,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.wgsl
index 56678ab..ad83063 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.wgsl
@@ -13,12 +13,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.wgsl
index 10c8137..cdfde15 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.wgsl
@@ -2,7 +2,7 @@
   minusOne : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -24,11 +24,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.wgsl
index ec3893d..41c2d79 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.wgsl
@@ -13,11 +13,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.wgsl
index 9e985c7..7cb34b0 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.wgsl
@@ -2,7 +2,7 @@
   one : u32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -64,11 +64,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.wgsl
index f04d8e2..45e24a8 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.wgsl
@@ -13,11 +13,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.wgsl
index be6fc47..350df86 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.wgsl
@@ -16,11 +16,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.wgsl
index 6795d45..e86e68c 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.wgsl
@@ -2,7 +2,7 @@
   one : f32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -33,11 +33,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.wgsl
index 485238c..865cffe 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.wgsl
@@ -2,7 +2,7 @@
   one : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -17,11 +17,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.wgsl
index eb49629..3aeb232 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.wgsl
@@ -2,7 +2,7 @@
   twoandthree : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -34,11 +34,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.wgsl
index 017d331..5e92a1d 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.wgsl
@@ -2,7 +2,7 @@
   three : f32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -17,11 +17,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.wgsl
index c832a10..cd134b6 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.wgsl
@@ -2,7 +2,7 @@
   three : f32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -17,11 +17,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.wgsl
index 7c7b28a..1446989 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.wgsl
@@ -24,11 +24,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.wgsl
index eb97819..7e63c10 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.wgsl
@@ -2,7 +2,7 @@
   one : f32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -21,11 +21,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.wgsl
index 82d53fc..b9dc403 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.wgsl
@@ -2,7 +2,7 @@
   four : f32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -21,11 +21,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.wgsl
index 738c840..dbdf48c 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.wgsl
@@ -2,7 +2,7 @@
   one : f32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -21,11 +21,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.wgsl
index 99ec59a..d7f03d8 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.wgsl
@@ -34,11 +34,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.wgsl
index 44ac190..b4a3e58 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.wgsl
@@ -34,11 +34,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.wgsl
index 1bba57f..6ae5084 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.wgsl
@@ -2,7 +2,7 @@
   five : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -31,11 +31,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.wgsl
index 1315b97..fa13a35 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.wgsl
@@ -2,7 +2,7 @@
   one : f32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -24,11 +24,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.wgsl
index a762a7d..115f201 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.wgsl
@@ -2,7 +2,7 @@
   four : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -17,11 +17,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.wgsl
index edfae00..37d278a 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.wgsl
@@ -2,7 +2,7 @@
   one : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -20,11 +20,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.wgsl
index 5938fe4..2397e0e 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -17,11 +17,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.wgsl
index bbb0ca6..16eb822 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -17,11 +17,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.wgsl
index 49c9205..7049b33 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.wgsl
@@ -2,7 +2,7 @@
   threeandfour : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -23,11 +23,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.wgsl
index 13ebbb0..e857996 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.wgsl
@@ -16,11 +16,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.wgsl
index bca2411..479f215 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.wgsl
@@ -2,7 +2,7 @@
   zeroOne : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -25,11 +25,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.wgsl
index c13349f..3d3d0e4 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 4>;
+type Arr = @stride(16) array<i32, 4>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -41,11 +41,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.wgsl
index c5585de..6a728fd 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 4>;
+type Arr = @stride(16) array<f32, 4>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 3>;
+type Arr_1 = @stride(16) array<i32, 3>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+@group(0) @binding(1) var<uniform> x_9 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -59,11 +59,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.wgsl
index af6ec42..b6ec115 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -54,11 +54,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.wgsl
index 05228f7..9e1b201 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 1>;
+type Arr = @stride(16) array<f32, 1>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
@@ -12,11 +12,11 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+@group(0) @binding(1) var<uniform> x_10 : buf1;
 
 fn main_1() {
   var f0 : f32;
@@ -40,12 +40,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.wgsl
index a1ab4e0..089938b 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 1>;
+type Arr = @stride(16) array<f32, 1>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -48,11 +48,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.wgsl
index 9d5718a..3a9c135 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
@@ -6,7 +6,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -36,12 +36,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.wgsl
index 0ea6e7d..a905e60 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 1>;
+type Arr = @stride(16) array<f32, 1>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 4>;
+type Arr_1 = @stride(16) array<i32, 4>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+@group(0) @binding(1) var<uniform> x_10 : buf1;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -85,12 +85,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.wgsl
index baa752e..ddb1417 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 4>;
+type Arr = @stride(16) array<f32, 4>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 1>;
+type Arr_1 = @stride(16) array<i32, 1>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
@@ -12,11 +12,11 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 fn main_1() {
   var icoord : vec2<i32>;
@@ -62,12 +62,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.wgsl
index 0791d46..20851de 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 4>;
+type Arr = @stride(16) array<f32, 4>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
@@ -12,11 +12,11 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+@group(0) @binding(0) var<uniform> x_11 : buf0;
 
 fn func_f1_(x : ptr<function, f32>) -> f32 {
   loop {
@@ -82,12 +82,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.wgsl
index b695c16..85ca151 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
@@ -8,21 +8,21 @@
   zero : f32;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
-[[group(0), binding(2)]] var<uniform> x_10 : buf2;
+@group(0) @binding(2) var<uniform> x_10 : buf2;
 
 var<private> gl_FragCoord : vec4<f32>;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+@group(0) @binding(0) var<uniform> x_13 : buf0;
 
 fn func_vf2_(pos : ptr<function, vec2<f32>>) -> bool {
   let x_62 : f32 = (*(pos)).x;
@@ -60,12 +60,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.wgsl
index 9c26d44..b2ded57 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
@@ -8,7 +8,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 fn main_1() {
   x_GLF_global_loop_count = 0;
@@ -55,11 +55,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.wgsl
index 57432b7..caf4f3a 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 18>;
+type Arr = @stride(16) array<f32, 18>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 4>;
+type Arr_1 = @stride(16) array<i32, 4>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
@@ -16,11 +16,11 @@
 
 var<private> x_GLF_global_loop_count : i32;
 
-[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+@group(0) @binding(1) var<uniform> x_7 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+@group(0) @binding(0) var<uniform> x_12 : buf0;
 
-[[group(0), binding(2)]] var<uniform> x_15 : buf2;
+@group(0) @binding(2) var<uniform> x_15 : buf2;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -130,11 +130,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.wgsl
index 19d84ed..96ce6a3 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
@@ -6,7 +6,7 @@
 
 var<private> x_GLF_global_loop_count : i32;
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -63,11 +63,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.wgsl
index 510a02a..3ae2436 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -68,11 +68,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.wgsl
index 231d414..531a3d4 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
@@ -8,7 +8,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 fn main_1() {
   x_GLF_global_loop_count = 0;
@@ -42,11 +42,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.wgsl
index 080e3ba..c5c2c0c 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.wgsl
@@ -2,7 +2,7 @@
   zero : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -28,11 +28,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.wgsl
index fa50b1e..eae9e89 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
@@ -12,11 +12,11 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
 fn main_1() {
   let x_31 : f32 = x_6.x_GLF_uniform_float_values[1];
@@ -45,12 +45,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.wgsl
index e31894b..aed3c77 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 4>;
+type Arr = @stride(16) array<i32, 4>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -67,11 +67,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.wgsl
index ff058e8..883acb7 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -46,11 +46,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.wgsl
index e18c700..885ecab 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.wgsl
@@ -2,7 +2,7 @@
   three : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -43,11 +43,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.wgsl
index 9dc640b..d210920 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 3>;
+type Arr = @stride(16) array<f32, 3>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 3>;
+type Arr_1 = @stride(16) array<i32, 3>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -77,11 +77,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.wgsl
index d9a10ba..f649776 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 3>;
+type Arr = @stride(16) array<f32, 3>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 3>;
+type Arr_1 = @stride(16) array<i32, 3>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+@group(0) @binding(1) var<uniform> x_10 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -71,11 +71,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.wgsl
index d16fa14..3d51f22 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<i32, 4>;
+type Arr = @stride(16) array<i32, 4>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
@@ -6,7 +6,7 @@
 
 var<private> x_GLF_global_loop_count : i32;
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -81,11 +81,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.wgsl
index 5f11cde..27f748f 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.wgsl
@@ -2,7 +2,7 @@
   one : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -39,11 +39,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.wgsl
index 0bb69b8..a98a0ef 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 5>;
+type Arr = @stride(16) array<i32, 5>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -52,11 +52,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.wgsl
index a1adef2..ba4cf88 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 5>;
+type Arr = @stride(16) array<i32, 5>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -87,11 +87,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.wgsl
index 5a5096d..2a3bb62 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<i32, 4>;
+type Arr = @stride(16) array<i32, 4>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 2>;
+type Arr_1 = @stride(16) array<f32, 2>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+@group(0) @binding(1) var<uniform> x_9 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -58,11 +58,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.wgsl
index 02f7508..02e7cd8 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 4>;
+type Arr_1 = @stride(16) array<f32, 4>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+@group(0) @binding(1) var<uniform> x_9 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -56,11 +56,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.wgsl
index 7d42f20..5ea2613 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.wgsl
@@ -27,12 +27,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.wgsl
index ab1fd10..badcf70 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.wgsl
@@ -2,7 +2,7 @@
   zero : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -68,11 +68,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.wgsl
index c5a9a86..7405541 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.wgsl
@@ -38,11 +38,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.wgsl
index cf1481a..0a01338 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.wgsl
@@ -29,12 +29,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.wgsl
index 95eb9e4..6df84d8 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.wgsl
@@ -1,20 +1,20 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 1>;
+type Arr_1 = @stride(16) array<f32, 1>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+@group(0) @binding(1) var<uniform> x_7 : buf1;
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+@group(0) @binding(0) var<uniform> x_11 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -73,12 +73,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.wgsl
index de17bea..4b2c476 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 1>;
+type Arr_1 = @stride(16) array<f32, 1>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -58,11 +58,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.wgsl
index 46580ae..95e3e82 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 5>;
+type Arr = @stride(16) array<i32, 5>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -74,11 +74,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.wgsl
index 10bc47e..ce4f886 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.wgsl
@@ -1,20 +1,20 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 1>;
+type Arr_1 = @stride(16) array<f32, 1>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+@group(0) @binding(0) var<uniform> x_12 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -79,12 +79,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.wgsl
index d0f8b62..6284f25 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 4>;
+type Arr_1 = @stride(16) array<i32, 4>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+@group(0) @binding(1) var<uniform> x_10 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -89,11 +89,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.wgsl
index 3e90ab3..c40e683 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 5>;
+type Arr = @stride(16) array<i32, 5>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -69,11 +69,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.wgsl
index 8b9be4e..5515fa1 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 2>;
+type Arr_1 = @stride(16) array<f32, 2>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -44,11 +44,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.wgsl
index 41a1c55..9f58cd8 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
@@ -6,7 +6,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 fn main_1() {
   let x_7 : i32 = x_5.x_GLF_uniform_int_values[0];
@@ -24,11 +24,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.wgsl
index a691939..b69d2c2 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.wgsl
@@ -1,20 +1,20 @@
-type Arr = [[stride(16)]] array<f32, 1>;
+type Arr = @stride(16) array<f32, 1>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+@group(0) @binding(1) var<uniform> x_7 : buf1;
 
 fn main_1() {
   let x_29 : f32 = x_5.x_GLF_uniform_float_values[0];
@@ -36,11 +36,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.wgsl
index 5e268e0..4de5b47 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 3>;
+type Arr = @stride(16) array<f32, 3>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
@@ -12,11 +12,11 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_14 : buf1;
+@group(0) @binding(1) var<uniform> x_14 : buf1;
 
 fn f1_f1_(a : ptr<function, f32>) -> f32 {
   var b : i32;
@@ -66,12 +66,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.wgsl
index 4cc9cf8..d9c43db 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 4>;
+type Arr = @stride(16) array<f32, 4>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
@@ -12,11 +12,11 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+@group(0) @binding(1) var<uniform> x_10 : buf1;
 
 fn main_1() {
   var a : i32;
@@ -46,12 +46,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.wgsl
index ed48840..a31725e 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.wgsl
@@ -1,20 +1,20 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 1>;
+type Arr_1 = @stride(16) array<f32, 1>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 fn main_1() {
   var i : i32;
@@ -43,11 +43,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.wgsl
index 585c193..2465cc6 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 2>;
+type Arr_1 = @stride(16) array<f32, 2>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr_1;
@@ -12,11 +12,11 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+@group(0) @binding(1) var<uniform> x_10 : buf1;
 
 fn f1_f1_(a : ptr<function, f32>) -> f32 {
   let x_100 : f32 = *(a);
@@ -64,12 +64,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.wgsl
index 2b819ba..d84f847 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 7>;
+type Arr = @stride(16) array<f32, 7>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 4>;
+type Arr_1 = @stride(16) array<i32, 4>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -85,11 +85,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.wgsl
index eae85ef..62a1158 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 1>;
+type Arr_1 = @stride(16) array<f32, 1>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr_1;
@@ -12,11 +12,11 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+@group(0) @binding(1) var<uniform> x_9 : buf1;
 
 fn main_1() {
   var i : i32;
@@ -59,12 +59,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.wgsl
index 628a5ec..b67d22f 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 2>;
+type Arr_1 = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -82,11 +82,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.wgsl
index c18fcc8..6f2a0b3 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<i32, 4>;
+type Arr = @stride(16) array<i32, 4>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 3>;
+type Arr_1 = @stride(16) array<f32, 3>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -84,11 +84,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.wgsl
index c423f55..d912c18 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 4>;
+type Arr = @stride(16) array<f32, 4>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 4>;
+type Arr_1 = @stride(16) array<i32, 4>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -86,11 +86,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.wgsl
index 7b441cf..b3b842d 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -39,11 +39,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.wgsl
index 58bf348..5daa6ea 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 4>;
+type Arr = @stride(16) array<f32, 4>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 3>;
+type Arr_1 = @stride(16) array<i32, 3>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+@group(0) @binding(1) var<uniform> x_9 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -77,11 +77,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.wgsl
index 3591994..054e604 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -24,11 +24,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.wgsl
index 2c3b18f..2ff0ddf 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -29,11 +29,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.wgsl
index ebf9237..450004f 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 1>;
+type Arr_1 = @stride(16) array<f32, 1>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -38,11 +38,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.wgsl
index 6b0ffef..e6a5f8c 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 12>;
+type Arr = @stride(16) array<i32, 12>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -165,11 +165,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.wgsl
index dbbbe2b..ad8bed6 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 2>;
+type Arr_1 = @stride(16) array<f32, 2>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr_1;
@@ -12,9 +12,9 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
 fn main_1() {
   var a : f32;
@@ -35,11 +35,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.wgsl
index e3df98e..04e7908 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 2>;
+type Arr_1 = @stride(16) array<f32, 2>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr_1;
@@ -12,9 +12,9 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
 fn main_1() {
   var a : f32;
@@ -35,11 +35,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.wgsl
index 43f4562..fd3b6cd 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.wgsl
@@ -1,20 +1,20 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+@group(0) @binding(1) var<uniform> x_7 : buf1;
 
 fn main_1() {
   let x_31 : f32 = x_5.x_GLF_uniform_float_values[0];
@@ -33,11 +33,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.wgsl
index fb49913..9dda7ec 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.wgsl
@@ -6,15 +6,15 @@
   v1 : vec2<f32>;
 };
 
-type Arr = [[stride(16)]] array<i32, 5>;
+type Arr = @stride(16) array<i32, 5>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -147,11 +147,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.wgsl
index 0590a0e..277fb3a 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 2>;
+type Arr_1 = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr_1;
@@ -12,9 +12,9 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_5 : buf1;
+@group(0) @binding(1) var<uniform> x_5 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 fn main_1() {
   var i : i32;
@@ -50,11 +50,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.wgsl
index b584e24..c915bc3 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -30,11 +30,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.wgsl
index ab9a5fd..31c63ab 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
@@ -6,7 +6,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -47,12 +47,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.wgsl
index 054f760..c2cd62a 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -51,11 +51,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.wgsl
index a0443e6..195dfd7 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.wgsl
@@ -91,11 +91,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.wgsl
index a317457..da37a46 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -38,11 +38,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.wgsl
index cf4338c..1736a9c 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -37,11 +37,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.wgsl
index 6029823..0429c3b 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
@@ -6,7 +6,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 fn main_1() {
   var x_32_phi : i32;
@@ -39,11 +39,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.wgsl
index 0a12739..0d9ad36 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.wgsl
@@ -77,11 +77,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.wgsl
index c13d80f..76b7072 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 4>;
+type Arr = @stride(16) array<f32, 4>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 3>;
+type Arr_1 = @stride(16) array<i32, 3>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+@group(0) @binding(1) var<uniform> x_9 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -68,11 +68,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.wgsl
index 4c1cc2e..e839854 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.wgsl
@@ -2,7 +2,7 @@
   one : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -42,11 +42,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.wgsl
index 8f286a3..7f75d10 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 3>;
+type Arr = @stride(16) array<f32, 3>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 3>;
+type Arr_1 = @stride(16) array<i32, 3>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
@@ -12,9 +12,9 @@
 
 var<private> x_GLF_global_loop_count : i32;
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+@group(0) @binding(1) var<uniform> x_10 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -65,11 +65,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.wgsl
index 3dc9b8f..4d7396f 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 6>;
+type Arr = @stride(16) array<i32, 6>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -79,11 +79,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.wgsl
index 4f881f0..da7adbc 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 3>;
+type Arr_1 = @stride(16) array<i32, 3>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+@group(0) @binding(1) var<uniform> x_11 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -71,11 +71,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.wgsl
index d17d686..043f22e 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 4>;
+type Arr_1 = @stride(16) array<i32, 4>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+@group(0) @binding(1) var<uniform> x_7 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -81,12 +81,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.wgsl
index 6bee0d7..c2a9270 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 4>;
+type Arr = @stride(16) array<i32, 4>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -53,11 +53,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.wgsl
index 61e176c..4fb7bb4 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -38,11 +38,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.wgsl
index fbaf576..749e41d 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -33,11 +33,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.wgsl
index 5d36dbd..95223c0 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
@@ -6,7 +6,7 @@
 
 var<private> x_GLF_global_loop_count : i32;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -62,11 +62,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.wgsl
index 3edff4c..5603562 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+@group(0) @binding(1) var<uniform> x_9 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -81,11 +81,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.wgsl
index b2a62e1..1afd0fb 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 6>;
+type Arr = @stride(16) array<i32, 6>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 1>;
+type Arr_1 = @stride(16) array<f32, 1>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr_1;
@@ -12,11 +12,11 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+@group(0) @binding(0) var<uniform> x_12 : buf0;
 
 fn main_1() {
   var data : array<i32, 5>;
@@ -119,12 +119,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.wgsl
index f9b028d..e4181c5 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 4>;
+type Arr = @stride(16) array<f32, 4>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
@@ -12,9 +12,9 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+@group(0) @binding(0) var<uniform> x_12 : buf0;
 
 var<private> x_GLF_v1 : vec4<f32>;
 
@@ -81,12 +81,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_v1_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_v1);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.wgsl
index 633587b..92c33ac 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -40,11 +40,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.wgsl
index 97d05ee..595d15c 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
@@ -6,7 +6,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -61,12 +61,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.wgsl
index bacb0e9..6063cf2 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 5>;
+type Arr = @stride(16) array<i32, 5>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -85,11 +85,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.wgsl
index 745d306..80a5f2f 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -32,11 +32,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.wgsl
index 7556722..3000605 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -37,11 +37,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.wgsl
index 6847d17..0b552c2 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.wgsl
@@ -2,7 +2,7 @@
   one : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -19,11 +19,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.wgsl
index 4168f03..7c8e12d 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
@@ -8,7 +8,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 fn main_1() {
   var a : i32;
@@ -29,12 +29,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.wgsl
index 7987ab9..beb04a2 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.wgsl
@@ -8,7 +8,7 @@
   one : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -86,11 +86,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.wgsl
index 9c1a3af..dcf3f7d 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.wgsl
@@ -2,7 +2,7 @@
   two : f32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -32,11 +32,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.wgsl
index a30ca1f..3860032 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.wgsl
@@ -2,7 +2,7 @@
   three : f32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -50,11 +50,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.wgsl
index 194355f..75ef009 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 1>;
+type Arr = @stride(16) array<f32, 1>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
@@ -12,11 +12,11 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+@group(0) @binding(1) var<uniform> x_9 : buf1;
 
 fn main_1() {
   var f : f32;
@@ -37,12 +37,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.wgsl
index 6c6f442..c91bc5b 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.wgsl
@@ -12,12 +12,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.wgsl
index 0eacd57..970ec3a 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.wgsl
@@ -2,7 +2,7 @@
   one : u32;
 };
 
-type Arr = [[stride(16)]] array<i32, 1>;
+type Arr = @stride(16) array<i32, 1>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
@@ -10,11 +10,11 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
 fn func_() -> f32 {
   switch(1) {
@@ -51,12 +51,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.wgsl
index ee397ee..4e092af 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<f32, 3>;
+type Arr = @stride(16) array<f32, 3>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
@@ -6,7 +6,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 fn main_1() {
   var a : f32;
@@ -26,11 +26,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.wgsl
index 45050a1..8dc1059 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.wgsl
@@ -1,28 +1,28 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf2 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 1>;
+type Arr_1 = @stride(16) array<f32, 1>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-type Arr_2 = [[stride(16)]] array<u32, 1>;
+type Arr_2 = @stride(16) array<u32, 1>;
 
 struct buf1 {
   x_GLF_uniform_uint_values : Arr_2;
 };
 
-[[group(0), binding(2)]] var<uniform> x_8 : buf2;
+@group(0) @binding(2) var<uniform> x_8 : buf2;
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_12 : buf1;
+@group(0) @binding(1) var<uniform> x_12 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -56,12 +56,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.wgsl
index 6dbe667..c840fa9 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.wgsl
@@ -648,11 +648,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.wgsl
index 85ab856..c5a7eec 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.wgsl
@@ -2,13 +2,13 @@
   one : f32;
 };
 
-type Arr = [[stride(16)]] array<f32, 1>;
+type Arr = @stride(16) array<f32, 1>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 4>;
+type Arr_1 = @stride(16) array<i32, 4>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
@@ -16,13 +16,13 @@
 
 var<private> m : mat4x2<f32>;
 
-[[group(0), binding(2)]] var<uniform> x_10 : buf2;
+@group(0) @binding(2) var<uniform> x_10 : buf2;
 
-[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+@group(0) @binding(0) var<uniform> x_12 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_16 : buf1;
+@group(0) @binding(1) var<uniform> x_16 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -118,12 +118,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.wgsl
index 888c7e3..fa8927b 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 4>;
+type Arr_1 = @stride(16) array<i32, 4>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+@group(0) @binding(1) var<uniform> x_10 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -88,11 +88,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.wgsl
index 6961cb2..bc23f2a 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 3>;
+type Arr = @stride(16) array<f32, 3>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 4>;
+type Arr_1 = @stride(16) array<i32, 4>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
@@ -12,9 +12,9 @@
 
 var<private> x_GLF_global_loop_count : i32;
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+@group(0) @binding(1) var<uniform> x_10 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -319,11 +319,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.wgsl
index 3542b4b..45c6006 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 19>;
+type Arr = @stride(16) array<i32, 19>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -116,11 +116,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.wgsl
index 014de3f..07176d9 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 3>;
+type Arr_1 = @stride(16) array<i32, 3>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+@group(0) @binding(1) var<uniform> x_9 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -63,11 +63,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.wgsl
index 8033cb9..ab44f55 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
@@ -12,9 +12,9 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
 fn main_1() {
   var a : f32;
@@ -63,11 +63,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.wgsl
index c83f471..ebcbd97 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 5>;
+type Arr = @stride(16) array<f32, 5>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 3>;
+type Arr_1 = @stride(16) array<i32, 3>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+@group(0) @binding(1) var<uniform> x_10 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -64,11 +64,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.wgsl
index 045939d..503dd1c 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -31,11 +31,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.wgsl
index 40c7d3e..892a12c 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.wgsl
@@ -1,20 +1,20 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 1>;
+type Arr_1 = @stride(16) array<f32, 1>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+@group(0) @binding(1) var<uniform> x_7 : buf1;
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+@group(0) @binding(0) var<uniform> x_11 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -94,12 +94,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.wgsl
index 07eb0ab..9439fb8 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 3>;
+type Arr_1 = @stride(16) array<i32, 3>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+@group(0) @binding(1) var<uniform> x_11 : buf1;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -219,12 +219,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.wgsl
index 25ac138..7ea4c74 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 4>;
+type Arr = @stride(16) array<f32, 4>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 4>;
+type Arr_1 = @stride(16) array<i32, 4>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+@group(0) @binding(1) var<uniform> x_10 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -91,11 +91,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.wgsl
index 967e25d..fbcbd37 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.wgsl
@@ -2,7 +2,7 @@
   one : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -29,11 +29,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.wgsl
index 23deeb0..a562dab 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.wgsl
@@ -2,7 +2,7 @@
   three : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -17,11 +17,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.wgsl
index 9526fa4..d437610 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 2>;
+type Arr_1 = @stride(16) array<f32, 2>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr_1;
@@ -12,11 +12,11 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+@group(0) @binding(1) var<uniform> x_9 : buf1;
 
 fn main_1() {
   var i : i32;
@@ -71,12 +71,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.wgsl
index 45a9af8..21a1811 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
@@ -8,17 +8,17 @@
   one : f32;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(2)]] var<uniform> x_11 : buf2;
+@group(0) @binding(2) var<uniform> x_11 : buf2;
 
-[[group(0), binding(1)]] var<uniform> x_13 : buf1;
+@group(0) @binding(1) var<uniform> x_13 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -57,11 +57,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.wgsl
index ed5b89a..76a7c6f 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
@@ -8,17 +8,17 @@
   zero : i32;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
-[[group(0), binding(2)]] var<uniform> x_8 : buf2;
+@group(0) @binding(2) var<uniform> x_8 : buf2;
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -54,11 +54,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.wgsl
index 7418f6e..a213691 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
@@ -6,7 +6,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 fn main_1() {
   var a : f32;
@@ -35,11 +35,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.wgsl
index c40a4c6..3dc8f01 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -29,11 +29,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.wgsl
index 04d4193..04e7a73 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -29,11 +29,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.wgsl
index dad9c78..c72ff22 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.wgsl
@@ -4,7 +4,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 fn main_1() {
   var x_9 : array<i32, 1>;
@@ -32,11 +32,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.wgsl
index 9d610146..af3e4e9 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.wgsl
@@ -7,7 +7,7 @@
   one : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -57,11 +57,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.wgsl
index 8e1fa65..41448e1 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 2>;
+type Arr_1 = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+@group(0) @binding(1) var<uniform> x_7 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -70,12 +70,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_v1_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_v1);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.wgsl
index 149bcab..de85f78 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 4>;
+type Arr = @stride(16) array<i32, 4>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -75,11 +75,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.wgsl
index 708e046..8fcba9c 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.wgsl
@@ -6,7 +6,7 @@
   one : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+@group(0) @binding(0) var<uniform> x_11 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -77,11 +77,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.wgsl
index d902f3f..25b4aee 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr;
@@ -6,7 +6,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf1;
+@group(0) @binding(0) var<uniform> x_5 : buf1;
 
 fn main_1() {
   let x_22 : i32 = x_5.x_GLF_uniform_int_values[0];
@@ -37,11 +37,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.wgsl
index 5fbcdd9..8d05b1d 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 1>;
+type Arr_1 = @stride(16) array<f32, 1>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr_1;
@@ -16,13 +16,13 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+@group(0) @binding(1) var<uniform> x_7 : buf1;
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
-[[group(0), binding(2)]] var<uniform> x_11 : buf2;
+@group(0) @binding(2) var<uniform> x_11 : buf2;
 
 fn main_1() {
   var i : i32;
@@ -58,12 +58,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.wgsl
index 4f29ab6..d1c4406 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.wgsl
@@ -1,20 +1,20 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+@group(0) @binding(1) var<uniform> x_11 : buf1;
 
 fn func_() -> vec2<f32> {
   var v : vec2<f32>;
@@ -50,11 +50,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.wgsl
index 97c49ab..5e613ad 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<i32, 7>;
+type Arr = @stride(16) array<i32, 7>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 3>;
+type Arr_1 = @stride(16) array<f32, 3>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -218,11 +218,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.wgsl
index 3e5c910..5dac995 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.wgsl
@@ -2,7 +2,7 @@
   one : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -179,11 +179,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.wgsl
index 2794ec5..7428919 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 5>;
+type Arr = @stride(16) array<f32, 5>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -44,11 +44,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.wgsl
index d74e3c2..b903685 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
@@ -6,7 +6,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 fn main_1() {
   var v : vec4<f32>;
@@ -24,11 +24,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.wgsl
index b2a778b..5229944 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -48,11 +48,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.wgsl
index 27faee3..776fce0 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.wgsl
@@ -2,17 +2,17 @@
   v1 : vec2<f32>;
 };
 
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(1)]] var<uniform> x_5 : buf1;
+@group(0) @binding(1) var<uniform> x_5 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 fn main_1() {
   let x_29 : f32 = x_5.v1.x;
@@ -40,11 +40,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.wgsl
index b48fce6..530c5ac 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 fn main_1() {
   var x_29 : bool;
@@ -28,11 +28,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.wgsl
index 8b99a56..a683057 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 6>;
+type Arr = @stride(16) array<i32, 6>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -101,11 +101,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.wgsl
index 75a7f4c..133ac57 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -69,12 +69,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.wgsl
index 30873ed..58cee81 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.wgsl
@@ -6,7 +6,7 @@
   one : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -77,11 +77,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.wgsl
index 47c21ce..f0082cf 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.wgsl
@@ -8,9 +8,9 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+@group(0) @binding(1) var<uniform> x_9 : buf1;
 
 fn main_1() {
   var i : i32;
@@ -51,11 +51,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.wgsl
index 3fd60e5..0cf0b49 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.wgsl
@@ -2,7 +2,7 @@
   sequence : vec4<i32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -52,11 +52,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.wgsl
index 4480579..8100eda 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -30,11 +30,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.wgsl
index 36eceec..a9510ff 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.wgsl
@@ -2,7 +2,7 @@
   two : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -38,11 +38,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.wgsl
index 99296b4..0d58bc3 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.wgsl
@@ -2,7 +2,7 @@
   two : u32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -20,11 +20,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.wgsl
index 98b5b4c..b58a8b9 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -49,11 +49,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.wgsl
index 66ce6c9..7c308e3 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.wgsl
@@ -2,7 +2,7 @@
   three : f32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -20,11 +20,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.wgsl
index 2336efa..a92ccaf 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 5>;
+type Arr = @stride(16) array<i32, 5>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -86,11 +86,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.wgsl
index 2ac7c5e..b5acf65 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.wgsl
@@ -1,20 +1,20 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 1>;
+type Arr_1 = @stride(16) array<i32, 1>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
 fn main_1() {
   var a : f32;
@@ -36,11 +36,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.wgsl
index a54df57..65a65c4 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.wgsl
@@ -2,7 +2,7 @@
   one : f32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -24,11 +24,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.wgsl
index 8395eda..cd777be 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.wgsl
@@ -2,7 +2,7 @@
   three : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -29,12 +29,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.wgsl
index 318f16a..68db28f 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -25,11 +25,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.wgsl
index a903014..6b82628 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.wgsl
@@ -2,7 +2,7 @@
   one : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -26,11 +26,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.wgsl
index 2b24d07..648957e 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -44,12 +44,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.wgsl
index a3418a9..853116d 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+@group(0) @binding(1) var<uniform> x_9 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -76,11 +76,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.wgsl
index 2e51071..99d7851 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> g : i32;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -45,11 +45,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.wgsl
index 0814ab2..9875dc8 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 4>;
+type Arr = @stride(16) array<f32, 4>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -58,11 +58,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.wgsl
index cc2ab67..878b143 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.wgsl
@@ -2,7 +2,7 @@
   one : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -51,11 +51,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.wgsl
index a52a30a..71aaee0 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.wgsl
@@ -15,11 +15,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.wgsl
index ba81461..5656cd6 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.wgsl
@@ -2,7 +2,7 @@
   numbers : array<f32, 3>;
 };
 
-type Arr = [[stride(16)]] array<f32, 5>;
+type Arr = @stride(16) array<f32, 5>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
@@ -16,19 +16,19 @@
   oneVec : vec2<f32>;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+@group(0) @binding(1) var<uniform> x_7 : buf1;
 
-[[group(0), binding(2)]] var<uniform> x_9 : buf2;
+@group(0) @binding(2) var<uniform> x_9 : buf2;
 
-[[group(0), binding(3)]] var<uniform> x_12 : buf3;
+@group(0) @binding(3) var<uniform> x_12 : buf3;
 
-[[group(0), binding(0)]] var<uniform> x_15 : buf0;
+@group(0) @binding(0) var<uniform> x_15 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -78,11 +78,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.wgsl
index 5174f36..be7e4b8 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<f32, 3>;
+type Arr = @stride(16) array<f32, 3>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
@@ -8,19 +8,19 @@
   resolution : vec2<f32>;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
-[[group(0), binding(2)]] var<uniform> x_8 : buf2;
+@group(0) @binding(2) var<uniform> x_8 : buf2;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
 fn main_1() {
   var f : f32;
@@ -47,11 +47,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.wgsl
index 0397e5b..47f7183 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 1>;
+type Arr_1 = @stride(16) array<f32, 1>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+@group(0) @binding(1) var<uniform> x_11 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -91,11 +91,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.wgsl
index 210236b..a95343e 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
@@ -8,7 +8,7 @@
   zero : f32;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
@@ -16,11 +16,11 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_5 : buf1;
+@group(0) @binding(1) var<uniform> x_5 : buf1;
 
-[[group(0), binding(2)]] var<uniform> x_7 : buf2;
+@group(0) @binding(2) var<uniform> x_7 : buf2;
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
 fn main_1() {
   var i : i32;
@@ -84,11 +84,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.wgsl
index c1757e6..496f779 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -27,12 +27,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.wgsl
index 0ee891d..0f1c0bb 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.wgsl
@@ -6,15 +6,15 @@
   v1 : vec2<f32>;
 };
 
-type Arr = [[stride(16)]] array<i32, 5>;
+type Arr = @stride(16) array<i32, 5>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -153,11 +153,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.wgsl
index 891a913..49874e8 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.wgsl
@@ -18,11 +18,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.wgsl
index d2a1597..a0ae7b1 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
@@ -12,11 +12,11 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+@group(0) @binding(1) var<uniform> x_7 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 fn main_1() {
   var f : f32;
@@ -40,12 +40,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.wgsl
index cb2e891..7e44271 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 fn main_1() {
   var x_24 : vec4<f32>;
@@ -19,11 +19,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.wgsl
index 97b93bc..f73e0ea 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.wgsl
@@ -1,4 +1,4 @@
-type Arr = [[stride(16)]] array<f32, 1>;
+type Arr = @stride(16) array<f32, 1>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr;
@@ -8,9 +8,9 @@
   v1 : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -46,11 +46,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.wgsl
index 8691174..a2cb24f 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.wgsl
@@ -2,13 +2,13 @@
   data : i32;
 };
 
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -85,11 +85,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.wgsl
index ce444a3..2255ea4 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.wgsl
@@ -1,26 +1,26 @@
-type Arr = [[stride(16)]] array<u32, 1>;
+type Arr = @stride(16) array<u32, 1>;
 
 struct buf0 {
   x_GLF_uniform_uint_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 2>;
+type Arr_1 = @stride(16) array<i32, 2>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-type Arr_2 = [[stride(16)]] array<f32, 3>;
+type Arr_2 = @stride(16) array<f32, 3>;
 
 struct buf2 {
   x_GLF_uniform_float_values : Arr_2;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
-[[group(0), binding(2)]] var<uniform> x_10 : buf2;
+@group(0) @binding(2) var<uniform> x_10 : buf2;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -51,11 +51,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.wgsl
index b2e8650..eb55b50 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 3>;
+type Arr = @stride(16) array<f32, 3>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 4>;
+type Arr_1 = @stride(16) array<i32, 4>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -84,11 +84,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.wgsl
index f99a3bc..a353c90 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<i32, 4>;
+type Arr = @stride(16) array<i32, 4>;
 
 struct buf1 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 1>;
+type Arr_1 = @stride(16) array<f32, 1>;
 
 struct buf0 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -83,11 +83,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.wgsl
index 4aa9d43..f74488d 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.wgsl
@@ -2,7 +2,7 @@
   one : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -31,11 +31,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.wgsl
index 00262c5..b301222 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 3>;
+type Arr = @stride(16) array<i32, 3>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -51,11 +51,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.wgsl
index 4c3b34b..18e91bc 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 4>;
+type Arr = @stride(16) array<i32, 4>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -52,11 +52,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.wgsl
index 36afb2f..d5df523 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 fn main_1() {
   var a : i32;
@@ -35,11 +35,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.wgsl
index c80f332..5cd4d7e 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 4>;
+type Arr = @stride(16) array<i32, 4>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -55,11 +55,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.wgsl
index 240d9d9..d54fa3d 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.wgsl
@@ -1,28 +1,28 @@
-type Arr = [[stride(16)]] array<u32, 1>;
+type Arr = @stride(16) array<u32, 1>;
 
 struct buf2 {
   x_GLF_uniform_uint_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 1>;
+type Arr_1 = @stride(16) array<f32, 1>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-type Arr_2 = [[stride(16)]] array<i32, 2>;
+type Arr_2 = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_2;
 };
 
-[[group(0), binding(2)]] var<uniform> x_6 : buf2;
+@group(0) @binding(2) var<uniform> x_6 : buf2;
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
 fn main_1() {
   var f : f32;
@@ -45,11 +45,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.wgsl
index 2c1e642..6e1e0ba 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.wgsl
@@ -1,10 +1,10 @@
-type Arr = [[stride(16)]] array<i32, 16>;
+type Arr = @stride(16) array<i32, 16>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -149,11 +149,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.wgsl
index da47422..22314e6 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.wgsl
@@ -2,7 +2,7 @@
   quarter : f32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -29,11 +29,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.wgsl
index 941df15..50fc802 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.wgsl
@@ -2,7 +2,7 @@
   zero : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -27,11 +27,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.wgsl
index 5be7339..d431a77 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.wgsl
@@ -18,11 +18,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.wgsl
index 2cecb75..d7062ee 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.wgsl
@@ -14,11 +14,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.wgsl
index c5a9449..85f68d3 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 2>;
+type Arr = @stride(16) array<f32, 2>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 3>;
+type Arr_1 = @stride(16) array<i32, 3>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -55,11 +55,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.wgsl
index 9a7681c..007b027 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.wgsl
@@ -1,20 +1,20 @@
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 2>;
+type Arr_1 = @stride(16) array<f32, 2>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+@group(0) @binding(1) var<uniform> x_8 : buf1;
 
 fn main_1() {
   var v1 : vec2<f32>;
@@ -50,11 +50,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.wgsl
index f3f84a4..549b310 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.wgsl
@@ -1,28 +1,28 @@
-type Arr = [[stride(16)]] array<u32, 2>;
+type Arr = @stride(16) array<u32, 2>;
 
 struct buf1 {
   x_GLF_uniform_uint_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<f32, 1>;
+type Arr_1 = @stride(16) array<f32, 1>;
 
 struct buf2 {
   x_GLF_uniform_float_values : Arr_1;
 };
 
-type Arr_2 = [[stride(16)]] array<i32, 2>;
+type Arr_2 = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_2;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
-[[group(0), binding(2)]] var<uniform> x_8 : buf2;
+@group(0) @binding(2) var<uniform> x_8 : buf2;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+@group(0) @binding(0) var<uniform> x_12 : buf0;
 
 fn main_1() {
   var a : u32;
@@ -51,11 +51,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.wgsl
index 814eae3..854255f 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(16)]] array<f32, 3>;
+type Arr = @stride(16) array<f32, 3>;
 
 struct buf1 {
   x_GLF_uniform_float_values : Arr;
 };
 
-type Arr_1 = [[stride(16)]] array<i32, 4>;
+type Arr_1 = @stride(16) array<i32, 4>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr_1;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -103,11 +103,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.wgsl
index 8551242..4440fe2 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.wgsl
@@ -4,13 +4,13 @@
   c : i32;
 };
 
-type Arr = [[stride(16)]] array<i32, 2>;
+type Arr = @stride(16) array<i32, 2>;
 
 struct buf0 {
   x_GLF_uniform_int_values : Arr;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -52,11 +52,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.wgsl
index d154e28..54c80fc 100644
--- a/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -87,12 +87,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.wgsl
index 765114d..6f1e3d1 100644
--- a/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.wgsl
@@ -6,9 +6,9 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<storage, read_write> x_4 : theSSBO;
+@group(0) @binding(0) var<storage, read_write> x_4 : theSSBO;
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
 fn main_1() {
   var i : i32;
@@ -101,7 +101,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.wgsl
index c416382..8a5dbfb 100644
--- a/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -65,11 +65,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.wgsl
index 549895b..0be3eee 100644
--- a/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -44,12 +44,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.wgsl
index 6981641..d043efa 100644
--- a/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.wgsl
@@ -32,12 +32,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.wgsl
index 8ff5ce8..724ac94 100644
--- a/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -39,12 +39,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.wgsl
index 83948ce..12ab32e 100644
--- a/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.wgsl
@@ -50,12 +50,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.wgsl
index 926c273..8d86b69 100644
--- a/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.wgsl
@@ -33,12 +33,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.wgsl
index c2fa551..e826d0a 100644
--- a/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.wgsl
@@ -43,11 +43,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.wgsl
index 45e2a65..9784c8b 100644
--- a/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -64,11 +64,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.wgsl
index 2c077a3..60ed7c9 100644
--- a/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.wgsl
@@ -24,12 +24,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.wgsl b/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.wgsl
index 82a7bae..1267e46 100644
--- a/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.wgsl
@@ -2,7 +2,7 @@
   out_data : i32;
 };
 
-[[group(0), binding(0)]] var<storage, read_write> x_4 : theSSBO;
+@group(0) @binding(0) var<storage, read_write> x_4 : theSSBO;
 
 fn main_1() {
   var x_30 : mat2x2<f32>;
@@ -37,7 +37,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.wgsl
index c02f2ce..b468753 100644
--- a/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -73,12 +73,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.wgsl
index 3817d55..bf208d3 100644
--- a/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.wgsl
@@ -31,11 +31,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(color);
diff --git a/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.wgsl b/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.wgsl
index 1478c3b..f8bd3f3 100644
--- a/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.wgsl
@@ -17,11 +17,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.wgsl
index 869d8a9..0eff67b 100644
--- a/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.wgsl
@@ -31,12 +31,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.wgsl
index 64ef616..1eefb0f 100644
--- a/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -77,12 +77,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.wgsl
index 2fffb92..2285d25 100644
--- a/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -50,12 +50,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.wgsl
index 999c03a..b57810b 100644
--- a/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.wgsl
@@ -2,7 +2,7 @@
   one : f32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -139,11 +139,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.wgsl b/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.wgsl
index 7948d49..58d409d 100644
--- a/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -37,11 +37,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.wgsl b/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.wgsl
index 944e589..751210a 100644
--- a/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -261,12 +261,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.wgsl b/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.wgsl
index 8d4edc0..b98eed5 100644
--- a/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -100,11 +100,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.wgsl
index 132e8f0..10bf29a 100644
--- a/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.wgsl
@@ -34,12 +34,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.wgsl
index 2002e51..c8a6e22 100644
--- a/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -73,11 +73,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.wgsl
index b8234b5..f4302e5 100644
--- a/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.wgsl
@@ -37,11 +37,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.wgsl b/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.wgsl
index eb27e35..14c39b0 100644
--- a/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.wgsl
@@ -6,7 +6,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -80,11 +80,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.wgsl b/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.wgsl
index ee6e11e..b582c1b 100644
--- a/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.wgsl
@@ -25,12 +25,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.wgsl
index 03312ac..235bcc2 100644
--- a/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> gv : vec4<f32>;
 
@@ -28,11 +28,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.wgsl
index 99c613e..7dbb3e0 100644
--- a/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.wgsl
@@ -11,11 +11,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.wgsl b/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.wgsl
index a1058d6..599f7fb 100644
--- a/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -61,12 +61,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.wgsl
index f37535c..e5ed27a 100644
--- a/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.wgsl
@@ -31,12 +31,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.wgsl
index 515f38a..ae18c57 100644
--- a/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 fn main_1() {
   var i : i32;
@@ -34,11 +34,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.wgsl b/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.wgsl
index 1921a1c..0f6d9e5 100644
--- a/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -109,11 +109,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.wgsl
index ac98e18..a1432ca 100644
--- a/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -36,12 +36,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.wgsl
index 3a6e54e..428f9a3 100644
--- a/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 fn main_1() {
   var x_10 : array<i32, 1>;
@@ -37,11 +37,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.wgsl
index c9c712e..610bced 100644
--- a/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -43,12 +43,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.wgsl
index 8e2cc4c..f16375f 100644
--- a/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.wgsl
@@ -49,11 +49,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.wgsl b/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.wgsl
index def4326..3be5acb 100644
--- a/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.wgsl
@@ -63,11 +63,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.wgsl
index dc15751..39c139e 100644
--- a/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -101,11 +101,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.wgsl b/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.wgsl
index ff67040..96f0064 100644
--- a/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.wgsl
@@ -6,7 +6,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 fn main_1() {
   loop {
@@ -89,12 +89,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.wgsl
index 6af14a0..077959b 100644
--- a/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> gv : f32;
 
@@ -66,12 +66,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.wgsl
index 3f8d86d..23403a2 100644
--- a/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.wgsl
@@ -21,11 +21,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.wgsl
index df653e8..f45ccdd 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> map : array<i32, 256>;
 
@@ -335,12 +335,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.wgsl
index 532521f..fd017fb 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.wgsl
@@ -2,7 +2,7 @@
   resolution : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -184,12 +184,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.wgsl
index ec923c0..8ab78ee 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.wgsl
@@ -2,7 +2,7 @@
   resolution : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -189,12 +189,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.wgsl
index 2081172..bbc0147 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -43,12 +43,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.wgsl
index f104dd3..eace056 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -44,12 +44,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composites/0.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composites/0.wgsl
index 57ef309..e9cce2e 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-composites/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composites/0.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -81,12 +81,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composites/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composites/1.wgsl
index 57c0006..0ee298a 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-composites/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composites/1.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -86,12 +86,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.wgsl
index 8400b67..b09ced5 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> map : array<i32, 256>;
 
@@ -344,12 +344,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.wgsl
index 4d73d20..3d8680e 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_20 : buf0;
+@group(0) @binding(0) var<uniform> x_20 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -100,12 +100,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.wgsl
index 1d54a26..1deee30 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_20 : buf0;
+@group(0) @binding(0) var<uniform> x_20 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -101,12 +101,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.wgsl
index e41e03c..12607ba 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.wgsl
@@ -10,13 +10,13 @@
 
 var<private> temp : array<i32, 10>;
 
-[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+@group(0) @binding(0) var<uniform> x_28 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_32 : buf1;
+@group(0) @binding(1) var<uniform> x_32 : buf1;
 
 fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
   var k : i32;
@@ -299,12 +299,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.wgsl
index 39cf669..2e55508 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.wgsl
@@ -10,13 +10,13 @@
 
 var<private> temp : array<i32, 10>;
 
-[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+@group(0) @binding(0) var<uniform> x_28 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_32 : buf1;
+@group(0) @binding(1) var<uniform> x_32 : buf1;
 
 fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
   var k : i32;
@@ -303,12 +303,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.wgsl
index 7899f1b..2a098b0 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.wgsl
@@ -8,9 +8,9 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -106,12 +106,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.wgsl
index 6d8202a..78974c6 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.wgsl
@@ -8,9 +8,9 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -106,12 +106,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.wgsl
index 03f5d4a..c38f746 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.wgsl
@@ -10,13 +10,13 @@
 
 var<private> temp : array<i32, 10>;
 
-[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+@group(0) @binding(0) var<uniform> x_28 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_32 : buf1;
+@group(0) @binding(1) var<uniform> x_32 : buf1;
 
 fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
   var k : i32;
@@ -303,12 +303,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.wgsl
index 0c19b19..333d424 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.wgsl
@@ -644,11 +644,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.wgsl
index 62fb33d..f8056fa 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -84,12 +84,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.wgsl
index 913b37e..016470f 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -47,12 +47,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.wgsl
index 8954930..310e34e 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -44,12 +44,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.wgsl
index 6ee1e3f..e666f6f 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.wgsl
@@ -8,9 +8,9 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+@group(0) @binding(1) var<uniform> x_9 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+@group(0) @binding(0) var<uniform> x_13 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -126,12 +126,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.wgsl
index ce2fc53..9564b95 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.wgsl
@@ -8,9 +8,9 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+@group(0) @binding(1) var<uniform> x_9 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+@group(0) @binding(0) var<uniform> x_13 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -183,12 +183,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.wgsl
index 502e8b7..dba5558 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -50,12 +50,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.wgsl
index 0f6f3db..188c3b9 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -57,12 +57,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.wgsl
index 3626dd3..a57be40 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.wgsl
@@ -2,7 +2,7 @@
   resolution : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -184,12 +184,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.wgsl
index a2c109a..f652923 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> map : array<i32, 256>;
 
@@ -379,12 +379,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.wgsl
index 1012c1f..26ad9ba 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> map : array<i32, 256>;
 
@@ -341,12 +341,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.wgsl
index 633a6d5..322b118 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -328,12 +328,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.wgsl
index bafcb6d..b480a86 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -325,12 +325,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.wgsl
index 5b0e2fe..066c0ac 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.wgsl
@@ -6,7 +6,7 @@
 
 var<private> temp : array<i32, 10>;
 
-[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+@group(0) @binding(0) var<uniform> x_28 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -293,12 +293,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.wgsl
index 2f33bdb..a61c509 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.wgsl
@@ -6,7 +6,7 @@
 
 var<private> temp : array<i32, 10>;
 
-[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+@group(0) @binding(0) var<uniform> x_28 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -308,12 +308,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.wgsl
index f9628e7..c1fb481 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.wgsl
@@ -6,7 +6,7 @@
 
 var<private> temp : array<i32, 10>;
 
-[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+@group(0) @binding(0) var<uniform> x_28 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -401,12 +401,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.wgsl
index 1007714..4b36bd5 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.wgsl
@@ -6,7 +6,7 @@
 
 var<private> temp : array<i32, 10>;
 
-[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+@group(0) @binding(0) var<uniform> x_28 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -400,12 +400,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.wgsl
index c2695fb..8c64b73 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.wgsl
@@ -6,7 +6,7 @@
 
 var<private> temp : array<i32, 10>;
 
-[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+@group(0) @binding(0) var<uniform> x_28 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -291,12 +291,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.wgsl
index 90086b8..ac0f111 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.wgsl
@@ -6,7 +6,7 @@
 
 var<private> temp : array<i32, 10>;
 
-[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+@group(0) @binding(0) var<uniform> x_28 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -288,12 +288,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.wgsl
index 6c17b27..66ff6af 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -92,12 +92,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.wgsl
index 6821821..7f55dec 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -95,12 +95,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.wgsl
index 6afaa07..49dd9ad 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -92,12 +92,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.wgsl
index 12209a3..a7bed31 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -96,12 +96,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.wgsl
index a28de2c..4f2ceb5 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -93,12 +93,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.wgsl
index af34df2..67a46a0 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -93,12 +93,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.wgsl
index fdca5df..6bceeee 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -86,12 +86,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.wgsl
index de4a473..ddb4094 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+@group(0) @binding(0) var<uniform> x_13 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -71,12 +71,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.wgsl
index 8ec24b1..9300937 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+@group(0) @binding(0) var<uniform> x_13 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -77,12 +77,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.wgsl
index bb41ccf..339dc23 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.wgsl
@@ -10,7 +10,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_32 : buf0;
+@group(0) @binding(0) var<uniform> x_32 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -243,12 +243,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.wgsl
index 843a743..e30253e 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.wgsl
@@ -10,7 +10,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_32 : buf0;
+@group(0) @binding(0) var<uniform> x_32 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -243,12 +243,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.wgsl
index 9c26329..45b69b1 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -90,12 +90,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.wgsl
index 2f0c558..31783ae 100644
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -87,12 +87,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.wgsl
index 76d569e..fb898a5 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.wgsl
@@ -642,11 +642,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.wgsl
index dcb31b3..5e42687 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.wgsl
@@ -8,7 +8,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -964,12 +964,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.wgsl
index 0016d4c..fa23bb3 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.wgsl
@@ -253,11 +253,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.wgsl
index 4d268f6..a546ac5 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.wgsl
@@ -265,12 +265,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.wgsl
index 1f17892..571ad7a 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.wgsl
@@ -10,7 +10,7 @@
 
 var<private> tree_1 : array<BST, 10>;
 
-[[group(0), binding(0)]] var<uniform> x_16 : buf0;
+@group(0) @binding(0) var<uniform> x_16 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -281,11 +281,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.wgsl
index 19d6c9d..495c99b 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.wgsl
@@ -253,11 +253,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl
index 80872f4..3831d37 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl
@@ -16,7 +16,7 @@
 
 var<private> tree : array<BST, 10>;
 
-[[group(0), binding(0)]] var<uniform> x_50 : buf0;
+@group(0) @binding(0) var<uniform> x_50 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -307,11 +307,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.wgsl
index e1656b7..1eb7ba1 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -55,12 +55,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.wgsl
index eaaaea2..9c0e908 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.wgsl
@@ -6,9 +6,9 @@
   resolution : vec2<f32>;
 };
 
-[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+@group(0) @binding(1) var<uniform> x_6 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -205,12 +205,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.wgsl
index b30f116..c51aa77 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.wgsl
@@ -2,7 +2,7 @@
   resolution : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+@group(0) @binding(0) var<uniform> x_13 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -103,12 +103,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.wgsl
index 7520419..c089d3b 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.wgsl
@@ -6,13 +6,13 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+@group(0) @binding(0) var<uniform> x_13 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_20 : buf1;
+@group(0) @binding(1) var<uniform> x_20 : buf1;
 
 fn compute_value_f1_f1_(limit : ptr<function, f32>, thirty_two : ptr<function, f32>) -> f32 {
   var result : f32;
@@ -119,12 +119,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.wgsl
index 848cfcd..f0d8b20 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.wgsl
@@ -2,7 +2,7 @@
   resolution : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -106,12 +106,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.wgsl
index 046ec18..c1ee8ba 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.wgsl
@@ -6,11 +6,11 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_16 : buf1;
+@group(0) @binding(1) var<uniform> x_16 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -120,12 +120,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.wgsl
index f3cb6eb..c97f756 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.wgsl
@@ -6,11 +6,11 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+@group(0) @binding(0) var<uniform> x_13 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_19 : buf1;
+@group(0) @binding(1) var<uniform> x_19 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -135,12 +135,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.wgsl
index 3bafe44..ebbb314 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.wgsl
@@ -2,7 +2,7 @@
   resolution : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+@group(0) @binding(0) var<uniform> x_13 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -108,12 +108,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.wgsl
index eca86f4..5fd4664 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.wgsl
@@ -8,7 +8,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_34 : buf0;
+@group(0) @binding(0) var<uniform> x_34 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -327,12 +327,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.wgsl
index 30d100d..f58028b 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -331,12 +331,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.wgsl
index 13e6965..b471144 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.wgsl
@@ -6,7 +6,7 @@
 
 var<private> temp : array<i32, 10>;
 
-[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+@group(0) @binding(0) var<uniform> x_28 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -303,12 +303,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.wgsl
index a800ba9..d6dc1ae 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.wgsl
@@ -10,7 +10,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_34 : buf0;
+@group(0) @binding(0) var<uniform> x_34 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -267,12 +267,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.wgsl
index c3d31af..cf9871e 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.wgsl
@@ -12,7 +12,7 @@
 
 var<private> x_GLF_pos : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_34 : buf0;
+@group(0) @binding(0) var<uniform> x_34 : buf0;
 
 var<private> frag_color : vec4<f32>;
 
@@ -249,14 +249,14 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   frag_color_1 : vec4<f32>;
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
 };
 
-[[stage(vertex)]]
-fn main([[location(0)]] x_GLF_pos_param : vec4<f32>) -> main_out {
+@stage(vertex)
+fn main(@location(0) x_GLF_pos_param : vec4<f32>) -> main_out {
   x_GLF_pos = x_GLF_pos_param;
   main_1();
   return main_out(frag_color, gl_Position);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.wgsl
index b7d3ed1..99980d9 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.wgsl
@@ -9,12 +9,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[location(0)]] frag_color_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@location(0) frag_color_param : vec4<f32>) -> main_out {
   frag_color = frag_color_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.wgsl
index 7a24166..71d617e 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.wgsl
@@ -16,9 +16,9 @@
 
 var<private> x_GLF_pos : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_33 : buf0;
+@group(0) @binding(0) var<uniform> x_33 : buf0;
 
-[[group(0), binding(1)]] var<uniform> x_36 : buf1;
+@group(0) @binding(1) var<uniform> x_36 : buf1;
 
 var<private> frag_color : vec4<f32>;
 
@@ -260,14 +260,14 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   frag_color_1 : vec4<f32>;
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
 };
 
-[[stage(vertex)]]
-fn main([[location(0)]] x_GLF_pos_param : vec4<f32>) -> main_out {
+@stage(vertex)
+fn main(@location(0) x_GLF_pos_param : vec4<f32>) -> main_out {
   x_GLF_pos = x_GLF_pos_param;
   main_1();
   return main_out(frag_color, gl_Position);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.wgsl
index a6b6c61..877d1cb 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.wgsl
@@ -12,7 +12,7 @@
 
 var<private> x_GLF_pos : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_34 : buf0;
+@group(0) @binding(0) var<uniform> x_34 : buf0;
 
 var<private> frag_color : vec4<f32>;
 
@@ -247,14 +247,14 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   frag_color_1 : vec4<f32>;
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
 };
 
-[[stage(vertex)]]
-fn main([[location(0)]] x_GLF_pos_param : vec4<f32>) -> main_out {
+@stage(vertex)
+fn main(@location(0) x_GLF_pos_param : vec4<f32>) -> main_out {
   x_GLF_pos = x_GLF_pos_param;
   main_1();
   return main_out(frag_color, gl_Position);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.wgsl
index 89fc186..ad578ea 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.wgsl
@@ -12,7 +12,7 @@
 
 var<private> x_GLF_pos : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_34 : buf0;
+@group(0) @binding(0) var<uniform> x_34 : buf0;
 
 var<private> frag_color : vec4<f32>;
 
@@ -253,14 +253,14 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   frag_color_1 : vec4<f32>;
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
 };
 
-[[stage(vertex)]]
-fn main([[location(0)]] x_GLF_pos_param : vec4<f32>) -> main_out {
+@stage(vertex)
+fn main(@location(0) x_GLF_pos_param : vec4<f32>) -> main_out {
   x_GLF_pos = x_GLF_pos_param;
   main_1();
   return main_out(frag_color, gl_Position);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.wgsl
index 8f8de06..fe18daa 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.wgsl
@@ -16,9 +16,9 @@
 
 var<private> x_GLF_pos : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_34 : buf1;
+@group(0) @binding(1) var<uniform> x_34 : buf1;
 
-[[group(0), binding(0)]] var<uniform> x_37 : buf0;
+@group(0) @binding(0) var<uniform> x_37 : buf0;
 
 var<private> frag_color : vec4<f32>;
 
@@ -258,14 +258,14 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   frag_color_1 : vec4<f32>;
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
 };
 
-[[stage(vertex)]]
-fn main([[location(0)]] x_GLF_pos_param : vec4<f32>) -> main_out {
+@stage(vertex)
+fn main(@location(0) x_GLF_pos_param : vec4<f32>) -> main_out {
   x_GLF_pos = x_GLF_pos_param;
   main_1();
   return main_out(frag_color, gl_Position);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.wgsl
index 518cf6b..448c4ce 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_20 : buf0;
+@group(0) @binding(0) var<uniform> x_20 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -113,12 +113,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.wgsl
index 697b608..c2deab3 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_24 : buf0;
+@group(0) @binding(0) var<uniform> x_24 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -130,12 +130,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.wgsl
index 357f622..6aa6b53 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_24 : buf0;
+@group(0) @binding(0) var<uniform> x_24 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -121,12 +121,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.wgsl
index 048a25e..2c60f19 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.wgsl
@@ -2,7 +2,7 @@
   resolution : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_15 : buf0;
+@group(0) @binding(0) var<uniform> x_15 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -150,12 +150,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.wgsl
index 12eb944..1f81ee1 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_24 : buf0;
+@group(0) @binding(0) var<uniform> x_24 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -121,12 +121,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.wgsl
index 6b3a7b0..7ba773c 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_17 : buf0;
+@group(0) @binding(0) var<uniform> x_17 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -115,12 +115,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.wgsl
index acb40bf..a3eecf8 100644
--- a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.wgsl
@@ -6,13 +6,13 @@
   resolution : vec2<f32>;
 };
 
-[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+@group(0) @binding(1) var<uniform> x_11 : buf1;
 
 var<private> x_GLF_color : vec4<f32>;
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_19 : buf0;
+@group(0) @binding(0) var<uniform> x_19 : buf0;
 
 fn pointInTriangle_vf2_vf2_vf2_vf2_(p : ptr<function, vec2<f32>>, a : ptr<function, vec2<f32>>, b : ptr<function, vec2<f32>>, c : ptr<function, vec2<f32>>) -> i32 {
   var x_78 : f32;
@@ -159,12 +159,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.wgsl b/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.wgsl
index f28293a..5540bb1 100644
--- a/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.wgsl
@@ -10,7 +10,7 @@
 
 var<private> struct_array : array<struct_base, 3>;
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -39,11 +39,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.wgsl
index a46cd46..646af01 100644
--- a/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.wgsl
@@ -7,7 +7,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -40,11 +40,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.wgsl
index 0ea59c0..703abb7 100644
--- a/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.wgsl
@@ -8,7 +8,7 @@
 
 var<private> x_3 : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_5 : S;
+@group(0) @binding(0) var<uniform> x_5 : S;
 
 fn main_1() {
   let x_20 : vec4<f32> = x_5.field0;
@@ -20,11 +20,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_3_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_3);
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.wgsl
index 1fe3437..148481e 100644
--- a/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -24,11 +24,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.wgsl
index 027c6a7..121453e 100644
--- a/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.wgsl
@@ -2,7 +2,7 @@
   zero : f32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -43,11 +43,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.wgsl
index a458da5..893499c 100644
--- a/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -62,11 +62,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.wgsl b/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.wgsl
index cdab78b..95517da 100644
--- a/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.wgsl
@@ -14,11 +14,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.wgsl
index 7c355bb..718f257 100644
--- a/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -62,11 +62,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.wgsl b/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.wgsl
index cf0d932..6199c0e 100644
--- a/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.wgsl
@@ -29,12 +29,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.wgsl
index d9ba1c9..f5a69b7 100644
--- a/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.wgsl
@@ -6,7 +6,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 fn main_1() {
   var odd_index : i32;
@@ -97,12 +97,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.wgsl
index 73c71d0..3588452 100644
--- a/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-type RTArr = [[stride(4)]] array<u32>;
+type RTArr = @stride(4) array<u32>;
 
 struct doesNotMatter {
   x_compute_data : RTArr;
@@ -10,9 +10,9 @@
 
 var<private> GLF_live2gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(1)]] var<uniform> x_9 : buf0;
+@group(0) @binding(1) var<uniform> x_9 : buf0;
 
-[[group(0), binding(0)]] var<storage, read_write> x_12 : doesNotMatter;
+@group(0) @binding(0) var<storage, read_write> x_12 : doesNotMatter;
 
 fn main_1() {
   var GLF_live2_looplimiter1 : i32;
@@ -91,7 +91,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 18, 6)]]
+@stage(compute) @workgroup_size(1, 18, 6)
 fn main() {
   main_1();
 }
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.wgsl b/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.wgsl
index 3177b79..e307b1e 100644
--- a/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.wgsl
@@ -2,7 +2,7 @@
   matrix_a_uni : mat4x4<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+@group(0) @binding(0) var<uniform> x_8 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -57,11 +57,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.wgsl b/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.wgsl
index 027fc0f..c2ae08c 100644
--- a/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.wgsl
@@ -7,7 +7,7 @@
   bbbb : vec4<bool>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -67,11 +67,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.wgsl
index a5541a2..6fd343d 100644
--- a/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.wgsl
@@ -56,11 +56,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.wgsl
index b68fb06..fff1f46 100644
--- a/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -80,12 +80,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.wgsl
index 21c6a7b..e38b6c6 100644
--- a/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.wgsl
@@ -1,10 +1,10 @@
-type RTArr = [[stride(4)]] array<f32>;
+type RTArr = @stride(4) array<f32>;
 
 struct doesNotMatter {
   x_compute_data : RTArr;
 };
 
-[[group(0), binding(0)]] var<storage, read_write> x_9 : doesNotMatter;
+@group(0) @binding(0) var<storage, read_write> x_9 : doesNotMatter;
 
 fn nb_mod_() -> f32 {
   var s : f32;
@@ -55,7 +55,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.wgsl b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.wgsl
index 2124377..4ac1a23 100644
--- a/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.wgsl
@@ -4,7 +4,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 fn main_1() {
   var GLF_dead6index : i32;
@@ -30,11 +30,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.wgsl
index b6321d8..e684e37 100644
--- a/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 fn performPartition_() -> i32 {
   var GLF_live0i : i32;
@@ -60,11 +60,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.wgsl
index dd73656..91df442 100644
--- a/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -32,11 +32,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.wgsl
index 3b84978..fbd4862 100644
--- a/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.wgsl
@@ -22,12 +22,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.wgsl
index aed1aee..5df2899 100644
--- a/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.wgsl
@@ -6,7 +6,7 @@
   resolution : vec2<f32>;
 };
 
-type RTArr = [[stride(4)]] array<i32>;
+type RTArr = @stride(4) array<i32>;
 
 struct doesNotMatter {
   x_compute_data : RTArr;
@@ -14,11 +14,11 @@
 
 var<private> gl_GlobalInvocationID : vec3<u32>;
 
-[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+@group(0) @binding(1) var<uniform> x_10 : buf1;
 
-[[group(0), binding(2)]] var<uniform> x_13 : buf2;
+@group(0) @binding(2) var<uniform> x_13 : buf2;
 
-[[group(0), binding(0)]] var<storage, read_write> x_15 : doesNotMatter;
+@group(0) @binding(0) var<storage, read_write> x_15 : doesNotMatter;
 
 fn main_1() {
   var A : array<f32, 1>;
@@ -135,8 +135,8 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
-fn main([[builtin(global_invocation_id)]] gl_GlobalInvocationID_param : vec3<u32>) {
+@stage(compute) @workgroup_size(1, 1, 1)
+fn main(@builtin(global_invocation_id) gl_GlobalInvocationID_param : vec3<u32>) {
   gl_GlobalInvocationID = gl_GlobalInvocationID_param;
   main_1();
 }
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.wgsl
index a7740fe..f448ed4 100644
--- a/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.wgsl
@@ -4,7 +4,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 fn computeColor_() -> vec3<f32> {
   var x_injected_loop_counter : i32;
@@ -32,11 +32,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.wgsl
index 54af3d3..d4b87d8 100644
--- a/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+@group(0) @binding(0) var<uniform> x_7 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -35,12 +35,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.wgsl
index 473428a..6c95054 100644
--- a/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.wgsl
@@ -52,11 +52,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.wgsl
index e6da47e..2fc3c26 100644
--- a/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+@group(0) @binding(0) var<uniform> x_5 : buf0;
 
 fn main_1() {
   var m : i32;
@@ -34,11 +34,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.wgsl
index 005fa19..4fbd06f 100644
--- a/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.wgsl
@@ -38,11 +38,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.wgsl b/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.wgsl
index bd4cfad..2606dcd 100644
--- a/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.wgsl
@@ -37,11 +37,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.wgsl
index 3761ab1..e5dac5c 100644
--- a/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> gl_FragCoord : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+@group(0) @binding(0) var<uniform> x_10 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -99,12 +99,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.wgsl b/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.wgsl
index 3461a66..83ac163 100644
--- a/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.wgsl
@@ -29,11 +29,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.wgsl
index 9770d45..1cb22a3 100644
--- a/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.wgsl
@@ -4,7 +4,7 @@
 
 var<private> x_GLF_color : vec4<f32>;
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 fn main_1() {
   var j : i32;
@@ -35,11 +35,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl
index ad7b1a1..1aded6e 100644
--- a/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl
@@ -2,7 +2,7 @@
   injected : i32;
 };
 
-[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+@group(0) @binding(0) var<uniform> x_9 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -94,11 +94,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.wgsl
index 086a895..b0aa989 100644
--- a/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.wgsl
@@ -15,7 +15,7 @@
 
 var<private> tree_1 : array<BST, 10>;
 
-[[group(0), binding(0)]] var<uniform> x_27 : buf0;
+@group(0) @binding(0) var<uniform> x_27 : buf0;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -407,12 +407,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.wgsl
index dd18573..dbb226a 100644
--- a/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.wgsl
@@ -87,11 +87,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.wgsl
index aabebad..acfcdf2 100644
--- a/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.wgsl
+++ b/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.wgsl
@@ -2,7 +2,7 @@
   injectionSwitch : vec2<f32>;
 };
 
-[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+@group(0) @binding(0) var<uniform> x_6 : buf0;
 
 var<private> x_GLF_color : vec4<f32>;
 
@@ -19,11 +19,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_GLF_color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(x_GLF_color);
diff --git a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.wgsl b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.wgsl
index ef817f7..6b386e9 100644
--- a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.wgsl
+++ b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(4)]] array<i32, 8>;
+type Arr = @stride(4) array<i32, 8>;
 
 struct In2 {
   data_in2 : Arr;
 };
 
-type Arr_1 = [[stride(4)]] array<i32, 1024>;
+type Arr_1 = @stride(4) array<i32, 1024>;
 
 struct Out0 {
   data_out0 : Arr_1;
 };
 
-type Arr_2 = [[stride(4)]] array<i32, 512>;
+type Arr_2 = @stride(4) array<i32, 512>;
 
-type Arr_3 = [[stride(4)]] array<i32, 512>;
+type Arr_3 = @stride(4) array<i32, 512>;
 
 struct In1 {
   data_in1 : Arr_3;
@@ -24,13 +24,13 @@
 
 var<private> gl_WorkGroupID : vec3<u32>;
 
-[[group(0), binding(2)]] var<storage, read> x_13 : In2;
+@group(0) @binding(2) var<storage, read> x_13 : In2;
 
-[[group(0), binding(3)]] var<storage, read_write> x_15 : Out0;
+@group(0) @binding(3) var<storage, read_write> x_15 : Out0;
 
-[[group(0), binding(1)]] var<storage, read> x_17 : In1;
+@group(0) @binding(1) var<storage, read> x_17 : In1;
 
-[[group(0), binding(0)]] var<storage, read> x_19 : In0;
+@group(0) @binding(0) var<storage, read> x_19 : In0;
 
 fn main_1() {
   var base_index_in : u32;
@@ -109,8 +109,8 @@
   return;
 }
 
-[[stage(compute), workgroup_size(4, 1, 1)]]
-fn main([[builtin(workgroup_id)]] gl_WorkGroupID_param : vec3<u32>) {
+@stage(compute) @workgroup_size(4, 1, 1)
+fn main(@builtin(workgroup_id) gl_WorkGroupID_param : vec3<u32>) {
   gl_WorkGroupID = gl_WorkGroupID_param;
   main_1();
 }
diff --git a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.wgsl b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.wgsl
index 7665283..646cf0f 100644
--- a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.wgsl
+++ b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.wgsl
@@ -1,18 +1,18 @@
-type Arr = [[stride(4)]] array<i32, 8>;
+type Arr = @stride(4) array<i32, 8>;
 
 struct In2 {
   data_in2 : Arr;
 };
 
-type Arr_1 = [[stride(4)]] array<i32, 1024>;
+type Arr_1 = @stride(4) array<i32, 1024>;
 
 struct Out0 {
   data_out0 : Arr_1;
 };
 
-type Arr_2 = [[stride(4)]] array<i32, 512>;
+type Arr_2 = @stride(4) array<i32, 512>;
 
-type Arr_3 = [[stride(4)]] array<i32, 512>;
+type Arr_3 = @stride(4) array<i32, 512>;
 
 struct In0 {
   data_in0 : Arr_3;
@@ -24,13 +24,13 @@
 
 var<private> gl_WorkGroupID : vec3<u32>;
 
-[[group(0), binding(2)]] var<storage, read> x_13 : In2;
+@group(0) @binding(2) var<storage, read> x_13 : In2;
 
-[[group(0), binding(3)]] var<storage, read_write> x_15 : Out0;
+@group(0) @binding(3) var<storage, read_write> x_15 : Out0;
 
-[[group(0), binding(0)]] var<storage, read> x_17 : In0;
+@group(0) @binding(0) var<storage, read> x_17 : In0;
 
-[[group(0), binding(1)]] var<storage, read> x_19 : In1;
+@group(0) @binding(1) var<storage, read> x_19 : In1;
 
 fn main_1() {
   var base_index_in : u32;
@@ -109,8 +109,8 @@
   return;
 }
 
-[[stage(compute), workgroup_size(4, 1, 1)]]
-fn main([[builtin(workgroup_id)]] gl_WorkGroupID_param : vec3<u32>) {
+@stage(compute) @workgroup_size(4, 1, 1)
+fn main(@builtin(workgroup_id) gl_WorkGroupID_param : vec3<u32>) {
   gl_WorkGroupID = gl_WorkGroupID_param;
   main_1();
 }
diff --git a/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.wgsl b/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.wgsl
index c1d101c..a4fc561 100644
--- a/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.wgsl
+++ b/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.wgsl
@@ -6,11 +6,11 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   color_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(color);
diff --git a/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.wgsl b/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.wgsl
index 702b117..6f3e895 100644
--- a/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.wgsl
+++ b/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.wgsl
@@ -1,6 +1,6 @@
 var<private> color_out : vec4<f32>;
 
-[[group(0), binding(0)]] var texture : texture_2d<f32>;
+@group(0) @binding(0) var texture : texture_2d<f32>;
 
 var<private> gl_FragCoord : vec4<f32>;
 
@@ -12,12 +12,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   color_out_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(color_out);
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.wgsl
index 2b3b645..dfcbf44 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.wgsl
@@ -2,15 +2,15 @@
   result : i32;
 };
 
-type RTArr = [[stride(4)]] array<u32>;
+type RTArr = @stride(4) array<u32>;
 
 struct Buf0 {
   values : RTArr;
 };
 
-[[group(0), binding(1)]] var<storage, read_write> x_4 : Buf1;
+@group(0) @binding(1) var<storage, read_write> x_4 : Buf1;
 
-[[group(0), binding(0)]] var<storage, read_write> x_7 : Buf0;
+@group(0) @binding(0) var<storage, read_write> x_7 : Buf0;
 
 fn main_1() {
   var i : u32;
@@ -37,7 +37,7 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
+@stage(compute) @workgroup_size(1, 1, 1)
 fn main() {
   main_1();
 }
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.wgsl
index 0fee5ee..bed026c 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.wgsl
@@ -1,4 +1,4 @@
-type RTArr = [[stride(4)]] array<u32>;
+type RTArr = @stride(4) array<u32>;
 
 struct S {
   field0 : RTArr;
@@ -6,11 +6,11 @@
 
 var<private> x_2 : vec3<u32>;
 
-[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+@group(0) @binding(0) var<storage, read_write> x_5 : S;
 
-[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+@group(0) @binding(1) var<storage, read_write> x_6 : S;
 
-[[group(0), binding(2)]] var<storage, read_write> x_7 : S;
+@group(0) @binding(2) var<storage, read_write> x_7 : S;
 
 fn main_1() {
   let x_21 : u32 = x_2.x;
@@ -20,8 +20,8 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
-fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+@stage(compute) @workgroup_size(1, 1, 1)
+fn main(@builtin(global_invocation_id) x_2_param : vec3<u32>) {
   x_2 = x_2_param;
   main_1();
 }
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.wgsl
index cf2536e..98535f6 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.wgsl
@@ -1,4 +1,4 @@
-type RTArr = [[stride(4)]] array<u32>;
+type RTArr = @stride(4) array<u32>;
 
 struct S {
   field0 : RTArr;
@@ -6,11 +6,11 @@
 
 var<private> x_2 : vec3<u32>;
 
-[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+@group(0) @binding(0) var<storage, read_write> x_5 : S;
 
-[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+@group(0) @binding(1) var<storage, read_write> x_6 : S;
 
-[[group(0), binding(2)]] var<storage, read_write> x_7 : S;
+@group(0) @binding(2) var<storage, read_write> x_7 : S;
 
 fn main_1() {
   let x_21 : u32 = x_2.x;
@@ -20,8 +20,8 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
-fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+@stage(compute) @workgroup_size(1, 1, 1)
+fn main(@builtin(global_invocation_id) x_2_param : vec3<u32>) {
   x_2 = x_2_param;
   main_1();
 }
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.wgsl
index f842e24..516e08b 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.wgsl
@@ -1,4 +1,4 @@
-type RTArr = [[stride(4)]] array<u32>;
+type RTArr = @stride(4) array<u32>;
 
 struct S {
   field0 : RTArr;
@@ -6,11 +6,11 @@
 
 var<private> x_2 : vec3<u32>;
 
-[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+@group(0) @binding(0) var<storage, read_write> x_5 : S;
 
-[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+@group(0) @binding(1) var<storage, read_write> x_6 : S;
 
-[[group(0), binding(2)]] var<storage, read_write> x_7 : S;
+@group(0) @binding(2) var<storage, read_write> x_7 : S;
 
 fn main_1() {
   let x_21 : u32 = x_2.x;
@@ -20,8 +20,8 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
-fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+@stage(compute) @workgroup_size(1, 1, 1)
+fn main(@builtin(global_invocation_id) x_2_param : vec3<u32>) {
   x_2 = x_2_param;
   main_1();
 }
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.wgsl
index 21548c6..fc4ae4a 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.wgsl
@@ -1,4 +1,4 @@
-type RTArr = [[stride(4)]] array<u32>;
+type RTArr = @stride(4) array<u32>;
 
 struct S {
   field0 : RTArr;
@@ -6,11 +6,11 @@
 
 var<private> x_2 : vec3<u32>;
 
-[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+@group(0) @binding(0) var<storage, read_write> x_5 : S;
 
-[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+@group(0) @binding(1) var<storage, read_write> x_6 : S;
 
-[[group(0), binding(2)]] var<storage, read_write> x_7 : S;
+@group(0) @binding(2) var<storage, read_write> x_7 : S;
 
 fn main_1() {
   let x_21 : u32 = x_2.x;
@@ -20,8 +20,8 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
-fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+@stage(compute) @workgroup_size(1, 1, 1)
+fn main(@builtin(global_invocation_id) x_2_param : vec3<u32>) {
   x_2 = x_2_param;
   main_1();
 }
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.wgsl
index 51319ac..4f4872e 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.wgsl
@@ -1,4 +1,4 @@
-type RTArr = [[stride(4)]] array<i32>;
+type RTArr = @stride(4) array<i32>;
 
 struct S {
   field0 : RTArr;
@@ -6,13 +6,13 @@
 
 var<private> x_3 : vec3<u32>;
 
-[[group(0), binding(0)]] var<storage, read_write> x_6 : S;
+@group(0) @binding(0) var<storage, read_write> x_6 : S;
 
-[[group(0), binding(1)]] var<storage, read_write> x_7 : S;
+@group(0) @binding(1) var<storage, read_write> x_7 : S;
 
-[[group(0), binding(2)]] var<storage, read_write> x_8 : S;
+@group(0) @binding(2) var<storage, read_write> x_8 : S;
 
-[[group(0), binding(3)]] var<storage, read_write> x_9 : S;
+@group(0) @binding(3) var<storage, read_write> x_9 : S;
 
 fn main_1() {
   let x_26 : u32 = x_3.x;
@@ -23,8 +23,8 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
-fn main([[builtin(global_invocation_id)]] x_3_param : vec3<u32>) {
+@stage(compute) @workgroup_size(1, 1, 1)
+fn main(@builtin(global_invocation_id) x_3_param : vec3<u32>) {
   x_3 = x_3_param;
   main_1();
 }
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.wgsl
index 8abb109..0a7a6fd 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.wgsl
@@ -1,4 +1,4 @@
-type RTArr = [[stride(4)]] array<u32>;
+type RTArr = @stride(4) array<u32>;
 
 struct S {
   field0 : RTArr;
@@ -6,9 +6,9 @@
 
 var<private> x_3 : vec3<u32>;
 
-[[group(0), binding(0)]] var<storage, read_write> x_6 : S;
+@group(0) @binding(0) var<storage, read_write> x_6 : S;
 
-[[group(0), binding(1)]] var<storage, read_write> x_7 : S;
+@group(0) @binding(1) var<storage, read_write> x_7 : S;
 
 fn main_1() {
   let x_21 : u32 = x_3.x;
@@ -17,8 +17,8 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
-fn main([[builtin(global_invocation_id)]] x_3_param : vec3<u32>) {
+@stage(compute) @workgroup_size(1, 1, 1)
+fn main(@builtin(global_invocation_id) x_3_param : vec3<u32>) {
   x_3 = x_3_param;
   main_1();
 }
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.wgsl
index fce79f04..52902a4 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.wgsl
@@ -1,4 +1,4 @@
-type RTArr = [[stride(4)]] array<u32>;
+type RTArr = @stride(4) array<u32>;
 
 struct S {
   field0 : RTArr;
@@ -6,13 +6,13 @@
 
 var<private> x_3 : vec3<u32>;
 
-[[group(0), binding(0)]] var<storage, read_write> x_6 : S;
+@group(0) @binding(0) var<storage, read_write> x_6 : S;
 
-[[group(0), binding(1)]] var<storage, read_write> x_7 : S;
+@group(0) @binding(1) var<storage, read_write> x_7 : S;
 
-[[group(0), binding(2)]] var<storage, read_write> x_8 : S;
+@group(0) @binding(2) var<storage, read_write> x_8 : S;
 
-[[group(0), binding(3)]] var<storage, read_write> x_9 : S;
+@group(0) @binding(3) var<storage, read_write> x_9 : S;
 
 fn main_1() {
   let x_23 : u32 = x_3.x;
@@ -23,8 +23,8 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
-fn main([[builtin(global_invocation_id)]] x_3_param : vec3<u32>) {
+@stage(compute) @workgroup_size(1, 1, 1)
+fn main(@builtin(global_invocation_id) x_3_param : vec3<u32>) {
   x_3 = x_3_param;
   main_1();
 }
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.wgsl
index c21661d..04a0297 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.wgsl
@@ -1,4 +1,4 @@
-type RTArr = [[stride(4)]] array<u32>;
+type RTArr = @stride(4) array<u32>;
 
 struct S {
   field0 : RTArr;
@@ -6,11 +6,11 @@
 
 var<private> x_3 : vec3<u32>;
 
-[[group(0), binding(0)]] var<storage, read_write> x_6 : S;
+@group(0) @binding(0) var<storage, read_write> x_6 : S;
 
-[[group(0), binding(1)]] var<storage, read_write> x_7 : S;
+@group(0) @binding(1) var<storage, read_write> x_7 : S;
 
-[[group(0), binding(2)]] var<storage, read_write> x_8 : S;
+@group(0) @binding(2) var<storage, read_write> x_8 : S;
 
 fn main_1() {
   let x_21 : u32 = x_3.x;
@@ -20,8 +20,8 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
-fn main([[builtin(global_invocation_id)]] x_3_param : vec3<u32>) {
+@stage(compute) @workgroup_size(1, 1, 1)
+fn main(@builtin(global_invocation_id) x_3_param : vec3<u32>) {
   x_3 = x_3_param;
   main_1();
 }
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.wgsl
index f83857f..fd0938c 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.wgsl
@@ -1,4 +1,4 @@
-type RTArr = [[stride(4)]] array<u32>;
+type RTArr = @stride(4) array<u32>;
 
 struct S {
   field0 : RTArr;
@@ -6,11 +6,11 @@
 
 var<private> x_3 : vec3<u32>;
 
-[[group(0), binding(0)]] var<storage, read_write> x_6 : S;
+@group(0) @binding(0) var<storage, read_write> x_6 : S;
 
-[[group(0), binding(1)]] var<storage, read_write> x_7 : S;
+@group(0) @binding(1) var<storage, read_write> x_7 : S;
 
-[[group(0), binding(2)]] var<storage, read_write> x_8 : S;
+@group(0) @binding(2) var<storage, read_write> x_8 : S;
 
 fn main_1() {
   let x_21 : u32 = x_3.x;
@@ -20,8 +20,8 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
-fn main([[builtin(global_invocation_id)]] x_3_param : vec3<u32>) {
+@stage(compute) @workgroup_size(1, 1, 1)
+fn main(@builtin(global_invocation_id) x_3_param : vec3<u32>) {
   x_3 = x_3_param;
   main_1();
 }
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.wgsl
index de05c79..2bbbe0b 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.wgsl
@@ -1,4 +1,4 @@
-type RTArr = [[stride(4)]] array<u32>;
+type RTArr = @stride(4) array<u32>;
 
 struct S {
   field0 : RTArr;
@@ -6,11 +6,11 @@
 
 var<private> x_2 : vec3<u32>;
 
-[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+@group(0) @binding(0) var<storage, read_write> x_5 : S;
 
-[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+@group(0) @binding(1) var<storage, read_write> x_6 : S;
 
-[[group(0), binding(2)]] var<storage, read_write> x_7 : S;
+@group(0) @binding(2) var<storage, read_write> x_7 : S;
 
 fn main_1() {
   let x_20 : u32 = x_2.x;
@@ -20,8 +20,8 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
-fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+@stage(compute) @workgroup_size(1, 1, 1)
+fn main(@builtin(global_invocation_id) x_2_param : vec3<u32>) {
   x_2 = x_2_param;
   main_1();
 }
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.wgsl
index 3e60e98..f34494a 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.wgsl
@@ -1,4 +1,4 @@
-type RTArr = [[stride(4)]] array<u32>;
+type RTArr = @stride(4) array<u32>;
 
 struct S {
   field0 : RTArr;
@@ -6,9 +6,9 @@
 
 var<private> x_2 : vec3<u32>;
 
-[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+@group(0) @binding(0) var<storage, read_write> x_5 : S;
 
-[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+@group(0) @binding(1) var<storage, read_write> x_6 : S;
 
 fn main_1() {
   let x_20 : u32 = x_2.x;
@@ -17,8 +17,8 @@
   return;
 }
 
-[[stage(compute), workgroup_size(1, 1, 1)]]
-fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+@stage(compute) @workgroup_size(1, 1, 1)
+fn main(@builtin(global_invocation_id) x_2_param : vec3<u32>) {
   x_2 = x_2_param;
   main_1();
 }
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.wgsl
index eef9fd1..5c734e3 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.wgsl
@@ -14,14 +14,14 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_4_1 : u32;
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
 };
 
-[[stage(vertex)]]
-fn main([[location(0)]] x_3_param : vec2<f32>) -> main_out {
+@stage(vertex)
+fn main(@location(0) x_3_param : vec2<f32>) -> main_out {
   x_3 = x_3_param;
   main_1();
   return main_out(x_4, gl_Position);
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.wgsl
index bf7b1a4..74923da 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.wgsl
@@ -10,12 +10,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
 };
 
-[[stage(vertex)]]
-fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+@stage(vertex)
+fn main(@location(0) position_param : vec4<f32>) -> main_out {
   position = position_param;
   main_1();
   return main_out(gl_Position);
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.wgsl
index 48a9583..1c90a48 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.wgsl
@@ -9,13 +9,13 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   color_out_1 : vec4<f32>;
-  [[builtin(frag_depth)]]
+  @builtin(frag_depth)
   gl_FragDepth_1 : f32;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(color_out, gl_FragDepth);
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.wgsl
index 574d2de..5707fa3 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.wgsl
@@ -10,12 +10,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
 };
 
-[[stage(vertex)]]
-fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+@stage(vertex)
+fn main(@location(0) position_param : vec4<f32>) -> main_out {
   position = position_param;
   main_1();
   return main_out(gl_Position);
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.wgsl
index df3c7e3..1620bac 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.wgsl
@@ -9,13 +9,13 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   color_out_1 : vec4<f32>;
-  [[builtin(frag_depth)]]
+  @builtin(frag_depth)
   gl_FragDepth_1 : f32;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(color_out, gl_FragDepth);
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.wgsl
index f3aec87..507511d 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.wgsl
@@ -10,12 +10,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
 };
 
-[[stage(vertex)]]
-fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+@stage(vertex)
+fn main(@location(0) position_param : vec4<f32>) -> main_out {
   position = position_param;
   main_1();
   return main_out(gl_Position);
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.wgsl
index 8bf833a..d20dbea 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.wgsl
@@ -9,13 +9,13 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   color_out_1 : vec4<f32>;
-  [[builtin(frag_depth)]]
+  @builtin(frag_depth)
   gl_FragDepth_1 : f32;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(color_out, gl_FragDepth);
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.wgsl
index 1cc00dd..6e13950 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.wgsl
@@ -10,12 +10,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
 };
 
-[[stage(vertex)]]
-fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+@stage(vertex)
+fn main(@location(0) position_param : vec4<f32>) -> main_out {
   position = position_param;
   main_1();
   return main_out(gl_Position);
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.wgsl
index 5051169..eabe436 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.wgsl
@@ -9,13 +9,13 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   color_out_1 : vec4<f32>;
-  [[builtin(frag_depth)]]
+  @builtin(frag_depth)
   gl_FragDepth_1 : f32;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(color_out, gl_FragDepth);
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.wgsl
index 788ee5b..ac55a23 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.wgsl
@@ -10,12 +10,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
 };
 
-[[stage(vertex)]]
-fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+@stage(vertex)
+fn main(@location(0) position_param : vec4<f32>) -> main_out {
   position = position_param;
   main_1();
   return main_out(gl_Position);
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.wgsl
index f71b320..7b85214 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.wgsl
@@ -10,12 +10,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
 };
 
-[[stage(vertex)]]
-fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+@stage(vertex)
+fn main(@location(0) position_param : vec4<f32>) -> main_out {
   position = position_param;
   main_1();
   return main_out(gl_Position);
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.wgsl
index b6e0701..1566cc9 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.wgsl
@@ -9,13 +9,13 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   outColor_1 : vec4<f32>;
-  [[builtin(frag_depth)]]
+  @builtin(frag_depth)
   gl_FragDepth_1 : f32;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(outColor, gl_FragDepth);
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.wgsl
index 9f726a7..310e6db 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.wgsl
@@ -9,13 +9,13 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   outColor_1 : vec4<f32>;
-  [[builtin(frag_depth)]]
+  @builtin(frag_depth)
   gl_FragDepth_1 : f32;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(outColor, gl_FragDepth);
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.wgsl
index bc535ca..293f469 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.wgsl
@@ -9,13 +9,13 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   outColor_1 : vec4<f32>;
-  [[builtin(frag_depth)]]
+  @builtin(frag_depth)
   gl_FragDepth_1 : f32;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(outColor, gl_FragDepth);
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.wgsl
index 0fe24e6..269e7da 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.wgsl
@@ -12,14 +12,14 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   outColor_1 : vec4<f32>;
-  [[builtin(frag_depth)]]
+  @builtin(frag_depth)
   gl_FragDepth_1 : f32;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(outColor, gl_FragDepth);
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.wgsl
index 04a6db7..656c0ed 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.wgsl
@@ -9,13 +9,13 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   outColor_1 : vec4<f32>;
-  [[builtin(frag_depth)]]
+  @builtin(frag_depth)
   gl_FragDepth_1 : f32;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(outColor, gl_FragDepth);
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.wgsl
index f6cb3ea..7c01a5c 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.wgsl
@@ -9,13 +9,13 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   outColor_1 : vec4<f32>;
-  [[builtin(frag_depth)]]
+  @builtin(frag_depth)
   gl_FragDepth_1 : f32;
 };
 
-[[stage(fragment)]]
+@stage(fragment)
 fn main() -> main_out {
   main_1();
   return main_out(outColor, gl_FragDepth);
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.wgsl
index 081740c..1ab42ae 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.wgsl
@@ -12,14 +12,14 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
-  [[location(0)]]
+  @location(0)
   pos_1 : u32;
 };
 
-[[stage(vertex)]]
-fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+@stage(vertex)
+fn main(@location(0) position_param : vec4<f32>) -> main_out {
   position = position_param;
   main_1();
   return main_out(gl_Position, pos);
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.wgsl
index 9959aa6..0e32731 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.wgsl
@@ -14,14 +14,14 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_4_1 : i32;
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
 };
 
-[[stage(vertex)]]
-fn main([[location(0)]] x_2_param : vec3<f32>, [[location(1)]] x_3_param : i32) -> main_out {
+@stage(vertex)
+fn main(@location(0) x_2_param : vec3<f32>, @location(1) x_3_param : i32) -> main_out {
   x_2 = x_2_param;
   x_3 = x_3_param;
   main_1();
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl
index 0f3c732..2cd673e 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl
@@ -4,7 +4,7 @@
 
 var<private> x_4 : i32;
 
-[[group(0), binding(0)]] var x_5 : texture_storage_2d<r32sint, write>;
+@group(0) @binding(0) var x_5 : texture_storage_2d<r32sint, write>;
 
 fn main_1() {
   x_4 = 1;
@@ -19,12 +19,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_4_1 : i32;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) x_2_param : vec4<f32>, @location(0) x_3_param : i32) -> main_out {
   x_2 = x_2_param;
   x_3 = x_3_param;
   main_1();
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl.expected.glsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl.expected.glsl
index f63590e..34862ac 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl.expected.glsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl.expected.glsl
@@ -1,7 +1,7 @@
 SKIP: FAILED
 
 vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl:27:70 warning: integral user-defined fragment inputs must have a flat interpolation attribute
-fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+fn main(@builtin(position) x_2_param : vec4<f32>, @location(0) x_3_param : i32) -> main_out {
                                                                      ^^^^^^^^^
 
 #version 310 es
@@ -62,7 +62,7 @@
 
 Error parsing GLSL shader:
 ERROR: 0:45: 'int' : must be qualified as flat in
-ERROR: 0:45: '' : compilation terminated 
+ERROR: 0:45: '' : compilation terminated
 ERROR: 2 compilation errors.  No code generated.
 
 
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl
index affcd63..07e6992 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl
@@ -14,12 +14,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_4_1 : i32;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) x_2_param : vec4<f32>, @location(0) x_3_param : i32) -> main_out {
   x_2 = x_2_param;
   x_3 = x_3_param;
   main_1();
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl.expected.glsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl.expected.glsl
index c7468bb..2da1cc8 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl.expected.glsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl.expected.glsl
@@ -1,7 +1,7 @@
 SKIP: FAILED
 
 vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl:22:70 warning: integral user-defined fragment inputs must have a flat interpolation attribute
-fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+fn main(@builtin(position) x_2_param : vec4<f32>, @location(0) x_3_param : i32) -> main_out {
                                                                      ^^^^^^^^^
 
 #version 310 es
@@ -58,7 +58,7 @@
 
 Error parsing GLSL shader:
 ERROR: 0:41: 'int' : must be qualified as flat in
-ERROR: 0:41: '' : compilation terminated 
+ERROR: 0:41: '' : compilation terminated
 ERROR: 2 compilation errors.  No code generated.
 
 
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.wgsl
index 3820a70..e1c76c9 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.wgsl
@@ -16,12 +16,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   out_data_1 : i32;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(out_data);
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl
index e0e933a..a849b1d 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl
@@ -14,12 +14,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_4_1 : i32;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) x_2_param : vec4<f32>, @location(0) x_3_param : i32) -> main_out {
   x_2 = x_2_param;
   x_3 = x_3_param;
   main_1();
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl.expected.glsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl.expected.glsl
index 42a8717..fe31b1c 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl.expected.glsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl.expected.glsl
@@ -1,7 +1,7 @@
 SKIP: FAILED
 
 vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl:22:70 warning: integral user-defined fragment inputs must have a flat interpolation attribute
-fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+fn main(@builtin(position) x_2_param : vec4<f32>, @location(0) x_3_param : i32) -> main_out {
                                                                      ^^^^^^^^^
 
 #version 310 es
@@ -59,7 +59,7 @@
 
 Error parsing GLSL shader:
 ERROR: 0:42: 'int' : must be qualified as flat in
-ERROR: 0:42: '' : compilation terminated 
+ERROR: 0:42: '' : compilation terminated
 ERROR: 2 compilation errors.  No code generated.
 
 
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl
index fd8dd5f..da18d12 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl
@@ -1,4 +1,4 @@
-type RTArr = [[stride(4)]] array<i32>;
+type RTArr = @stride(4) array<i32>;
 
 struct S {
   field0 : RTArr;
@@ -10,7 +10,7 @@
 
 var<private> x_4 : i32;
 
-[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+@group(0) @binding(0) var<storage, read_write> x_5 : S;
 
 fn main_1() {
   x_4 = 1;
@@ -25,12 +25,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_4_1 : i32;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) x_2_param : vec4<f32>, @location(0) x_3_param : i32) -> main_out {
   x_2 = x_2_param;
   x_3 = x_3_param;
   main_1();
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl.expected.glsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl.expected.glsl
index 41b83dd..f7d8197 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl.expected.glsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl.expected.glsl
@@ -1,7 +1,7 @@
 SKIP: FAILED
 
 vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl:33:70 warning: integral user-defined fragment inputs must have a flat interpolation attribute
-fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+fn main(@builtin(position) x_2_param : vec4<f32>, @location(0) x_3_param : i32) -> main_out {
                                                                      ^^^^^^^^^
 
 #version 310 es
@@ -67,8 +67,8 @@
 
 
 Error parsing GLSL shader:
-ERROR: 0:5: '' : array size required 
-ERROR: 0:6: '' : compilation terminated 
+ERROR: 0:5: '' : array size required
+ERROR: 0:6: '' : compilation terminated
 ERROR: 2 compilation errors.  No code generated.
 
 
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl
index 4a8c8a7..48083ee 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl
@@ -1,4 +1,4 @@
-type RTArr = [[stride(4)]] array<i32>;
+type RTArr = @stride(4) array<i32>;
 
 struct S {
   field0 : RTArr;
@@ -10,7 +10,7 @@
 
 var<private> x_4 : i32;
 
-[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+@group(0) @binding(0) var<storage, read_write> x_5 : S;
 
 fn main_1() {
   x_4 = 1;
@@ -25,12 +25,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_4_1 : i32;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) x_2_param : vec4<f32>, @location(0) x_3_param : i32) -> main_out {
   x_2 = x_2_param;
   x_3 = x_3_param;
   main_1();
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl.expected.glsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl.expected.glsl
index 4b8208a..6fe04b3 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl.expected.glsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl.expected.glsl
@@ -1,7 +1,7 @@
 SKIP: FAILED
 
 vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl:33:70 warning: integral user-defined fragment inputs must have a flat interpolation attribute
-fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+fn main(@builtin(position) x_2_param : vec4<f32>, @location(0) x_3_param : i32) -> main_out {
                                                                      ^^^^^^^^^
 
 #version 310 es
@@ -68,8 +68,8 @@
 
 
 Error parsing GLSL shader:
-ERROR: 0:5: '' : array size required 
-ERROR: 0:6: '' : compilation terminated 
+ERROR: 0:5: '' : array size required
+ERROR: 0:6: '' : compilation terminated
 ERROR: 2 compilation errors.  No code generated.
 
 
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl
index 5142f3d..78ca88f 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl
@@ -29,12 +29,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   x_4_1 : i32;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) x_2_param : vec4<f32>, @location(0) x_3_param : i32) -> main_out {
   x_2 = x_2_param;
   x_3 = x_3_param;
   main_1();
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl.expected.glsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl.expected.glsl
index 2d61612..b9ab85d 100644
--- a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl.expected.glsl
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl.expected.glsl
@@ -1,7 +1,7 @@
 SKIP: FAILED
 
 vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl:37:70 warning: integral user-defined fragment inputs must have a flat interpolation attribute
-fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+fn main(@builtin(position) x_2_param : vec4<f32>, @location(0) x_3_param : i32) -> main_out {
                                                                      ^^^^^^^^^
 
 #version 310 es
@@ -73,7 +73,7 @@
 
 Error parsing GLSL shader:
 ERROR: 0:56: 'int' : must be qualified as flat in
-ERROR: 0:56: '' : compilation terminated 
+ERROR: 0:56: '' : compilation terminated
 ERROR: 2 compilation errors.  No code generated.
 
 
diff --git a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.wgsl b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.wgsl
index cfebf74..e62f918 100644
--- a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.wgsl
+++ b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.wgsl
@@ -9,12 +9,12 @@
 }
 
 struct main_out {
-  [[builtin(position)]]
+  @builtin(position)
   gl_Position : vec4<f32>;
 };
 
-[[stage(vertex)]]
-fn main([[location(0)]] position_param : vec3<f32>) -> main_out {
+@stage(vertex)
+fn main(@location(0) position_param : vec3<f32>) -> main_out {
   position = position_param;
   main_1();
   return main_out(gl_Position);
diff --git a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.wgsl b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.wgsl
index a3e9f61..bdf8be5 100644
--- a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.wgsl
+++ b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.wgsl
@@ -22,12 +22,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   expect_1 : i32;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(expect);
diff --git a/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.wgsl b/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.wgsl
index cd7d76c..711a401 100644
--- a/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.wgsl
+++ b/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.wgsl
@@ -9,12 +9,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   color_out_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[location(0)]] color_in_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@location(0) color_in_param : vec4<f32>) -> main_out {
   color_in = color_in_param;
   main_1();
   return main_out(color_out);
diff --git a/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.wgsl b/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.wgsl
index 2130c1a..ac4ba8a 100644
--- a/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.wgsl
+++ b/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.wgsl
@@ -10,12 +10,12 @@
 }
 
 struct main_out {
-  [[location(0)]]
+  @location(0)
   result_1 : vec4<f32>;
 };
 
-[[stage(fragment)]]
-fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+@stage(fragment)
+fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
   gl_FragCoord = gl_FragCoord_param;
   main_1();
   return main_out(result);
diff --git a/tools/src/cmd/check-spec-examples/main.go b/tools/src/cmd/check-spec-examples/main.go
index 733b340..760fb68 100644
--- a/tools/src/cmd/check-spec-examples/main.go
+++ b/tools/src/cmd/check-spec-examples/main.go
@@ -202,7 +202,7 @@
 func tryCompile(compiler, wd string, e example) error {
 	code := e.code
 	if e.functionScope {
-		code = "\n[[stage(vertex)]] fn main() -> [[builtin(position)]] vec4<f32> {\n" + code + " return vec4<f32>();}\n"
+		code = "\n@stage(vertex) fn main() -> @builtin(position) vec4<f32> {\n" + code + " return vec4<f32>();}\n"
 	}
 
 	addedStubFunction := false
@@ -213,7 +213,7 @@
 		}
 
 		if !addedStubFunction {
-			code += "\n[[stage(vertex)]] fn main() {}\n"
+			code += "\n@stage(vertex) fn main() {}\n"
 			addedStubFunction = true
 			continue
 		}