[tint][intrinsics] Change intrinsic template syntax from <...> to [...]

[...] will be used to declare a list of implicit template arguments.
The resolver special cases certain intrinsics so that the first template
argument is explicitly pre-defined. This special-casing will be moved
into the definition file, by re-introducing <...> as an explicit
template list in a later CL.

Change-Id: Ib0b5f5870fe2bc727df758142c724d85e205b4a3
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/175243
Reviewed-by: James Price <jrprice@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/core/core.def b/src/tint/lang/core/core.def
index f4350ec..001ebd0 100644
--- a/src/tint/lang/core/core.def
+++ b/src/tint/lang/core/core.def
@@ -366,7 +366,7 @@
 //                                                                            //
 // * Template type example without constraint:                                //
 //                                                                            //
-//    fn arrayLength<T>(array<T>) -> u32                                      //
+//    fn arrayLength[T](array<T>) -> u32                                      //
 //                                                                            //
 //    Declares an overload of the function 'arrayLength' that accepts a       //
 //    single argument of an array type with no constraints on the array       //
@@ -375,7 +375,7 @@
 //                                                                            //
 // * Template type example with constraint:                                   //
 //                                                                            //
-//    fn abs<T: fiu32>(T) -> T                                                //
+//    fn abs[T: fiu32](T) -> T                                                //
 //                                                                            //
 //    Declares an overload of the function 'abs' that accepts a single        //
 //    argument of type 'f32', 'i32' or 'u32', which returns a value of the    //
@@ -386,7 +386,7 @@
 //                                                                            //
 // * Template number example:                                                 //
 //                                                                            //
-//    fn dpdx<N: num>(vec<N, f32>) -> vec<N, f32>                             //
+//    fn dpdx[N: num](vec<N, f32>) -> vec<N, f32>                             //
 //                                                                            //
 //    Declares an overload of the function 'dpdx' that accepts a single       //
 //    argument of a variable-sized vector of 'f32', which returns a value of  //
@@ -420,7 +420,7 @@
 // To better understand, let's consider the following hypothetical overload   //
 // declaration:                                                               //
 //                                                                            //
-//    fn foo<T: scalar>(T, T);                                                //
+//    fn foo[T: scalar](T, T);                                                //
 //                                                                            //
 //    T           - is the template type name                                 //
 //    scalar      - is a matcher for the types 'f32', 'i32', 'u32' or 'bool'  //
@@ -491,21 +491,21 @@
 //       Note: Parameter names are used by Tint to infer parameter order for  //
 //       some builtin functions                                               //
 //                                                                            //
-//   fn F<T>(T)                                                               //
+//   fn F[T](T)                                                               //
 //     - Single parameter of unconstrained template type T (any type)         //
 //                                                                            //
-//   fn F<T: scalar>(T)                                                       //
+//   fn F[T: scalar](T)                                                       //
 //     - Single parameter of constrained template type T (must be a scalar)   //
 //                                                                            //
-//   fn F<T: fiu32>(T) -> T                                                   //
+//   fn F[T: fiu32](T) -> T                                                   //
 //     - Single parameter of constrained template type T (must be a one of    //
 //       fiu32) Return type matches parameter type                            //
 //                                                                            //
-//   fn F<T, N: num>(vec<N, T>)                                               //
+//   fn F[T, N: num](vec<N, T>)                                               //
 //     - Single parameter of vector type with template number size N and      //
 //       element template type T                                              //
 //                                                                            //
-//   fn F<A: access>(texture_storage_1d<f32_texel_format, A>)                 //
+//   fn F[A: access](texture_storage_1d<f32_texel_format, A>)                 //
 //     - Single parameter of texture_storage_1d type with template number     //
 //       access-control C, and of a texel format that is listed in            //
 //       f32_texel_format                                                     //
@@ -513,109 +513,109 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 // https://gpuweb.github.io/gpuweb/wgsl/#builtin-functions
-@must_use @const fn abs<T: fiu32_f16>(T) -> T
-@must_use @const fn abs<N: num, T: fiu32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn acos<T: f32_f16>(@test_value(0.96891242171) T) -> T
-@must_use @const fn acos<N: num, T: f32_f16>(@test_value(0.96891242171) vec<N, T>) -> vec<N, T>
-@must_use @const fn acosh<T: f32_f16>(@test_value(1.5430806348) T) -> T
-@must_use @const fn acosh<N: num, T: f32_f16>(@test_value(1.5430806348) vec<N, T>) -> vec<N, T>
+@must_use @const fn abs[T: fiu32_f16](T) -> T
+@must_use @const fn abs[N: num, T: fiu32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn acos[T: f32_f16](@test_value(0.96891242171) T) -> T
+@must_use @const fn acos[N: num, T: f32_f16](@test_value(0.96891242171) vec<N, T>) -> vec<N, T>
+@must_use @const fn acosh[T: f32_f16](@test_value(1.5430806348) T) -> T
+@must_use @const fn acosh[N: num, T: f32_f16](@test_value(1.5430806348) vec<N, T>) -> vec<N, T>
 @must_use @const fn all(bool) -> bool
-@must_use @const fn all<N: num>(vec<N, bool>) -> bool
+@must_use @const fn all[N: num](vec<N, bool>) -> bool
 @must_use @const fn any(bool) -> bool
-@must_use @const fn any<N: num>(vec<N, bool>) -> bool
-@must_use fn arrayLength<T, A: access>(ptr<storage, array<T>, A>) -> u32
-@must_use @const fn asin<T: f32_f16>(@test_value(0.479425538604) T) -> T
-@must_use @const fn asin<N: num, T: f32_f16>(@test_value(0.479425538604) vec<N, T>) -> vec<N, T>
-@must_use @const fn asinh<T: f32_f16>(T) -> T
-@must_use @const fn asinh<N: num, T: f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn atan<T: f32_f16>(T) -> T
-@must_use @const fn atan<N: num, T: f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn atan2<T: f32_f16>(T, T) -> T
-@must_use @const fn atan2<T: f32_f16, N: num>(vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const fn atanh<T: f32_f16>(@test_value(0.5) T) -> T
-@must_use @const fn atanh<N: num, T: f32_f16>(@test_value(0.5) vec<N, T>) -> vec<N, T>
-@must_use @const fn ceil<T: f32_f16>(@test_value(1.5) T) -> T
-@must_use @const fn ceil<N: num, T: f32_f16>(@test_value(1.5) vec<N, T>) -> vec<N, T>
-@must_use @const fn clamp<T: fiu32_f16>(T, T, T) -> T
-@must_use @const fn clamp<T: fiu32_f16, N: num>(vec<N, T>, vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const fn cos<T: f32_f16>(@test_value(0) T) -> T
-@must_use @const fn cos<N: num, T: f32_f16>(@test_value(0) vec<N, T>) -> vec<N, T>
-@must_use @const fn cosh<T: f32_f16>(@test_value(0) T) -> T
-@must_use @const fn cosh<N: num, T: f32_f16>(@test_value(0) vec<N, T>) -> vec<N, T>
-@must_use @const fn countLeadingZeros<T: iu32>(T) -> T
-@must_use @const fn countLeadingZeros<N: num, T: iu32>(vec<N, T>) -> vec<N, T>
-@must_use @const fn countOneBits<T: iu32>(T) -> T
-@must_use @const fn countOneBits<N: num, T: iu32>(vec<N, T>) -> vec<N, T>
-@must_use @const fn countTrailingZeros<T: iu32>(T) -> T
-@must_use @const fn countTrailingZeros<N: num, T: iu32>(vec<N, T>) -> vec<N, T>
-@must_use @const fn cross<T: f32_f16>(vec3<T>, vec3<T>) -> vec3<T>
-@must_use @const fn degrees<T: f32_f16>(T) -> T
-@must_use @const fn degrees<N: num, T: f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn determinant<N: num, T: f32_f16>(mat<N, N, T>) -> T
-@must_use @const fn distance<T: f32_f16>(T, T) -> T
-@must_use @const fn distance<N: num, T: f32_f16>(vec<N, T>, vec<N, T>) -> T
-@must_use @const fn dot<N: num, T: fiu32_f16>(vec<N, T>, vec<N, T>) -> T
+@must_use @const fn any[N: num](vec<N, bool>) -> bool
+@must_use fn arrayLength[T, A: access](ptr<storage, array<T>, A>) -> u32
+@must_use @const fn asin[T: f32_f16](@test_value(0.479425538604) T) -> T
+@must_use @const fn asin[N: num, T: f32_f16](@test_value(0.479425538604) vec<N, T>) -> vec<N, T>
+@must_use @const fn asinh[T: f32_f16](T) -> T
+@must_use @const fn asinh[N: num, T: f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn atan[T: f32_f16](T) -> T
+@must_use @const fn atan[N: num, T: f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn atan2[T: f32_f16](T, T) -> T
+@must_use @const fn atan2[T: f32_f16, N: num](vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const fn atanh[T: f32_f16](@test_value(0.5) T) -> T
+@must_use @const fn atanh[N: num, T: f32_f16](@test_value(0.5) vec<N, T>) -> vec<N, T>
+@must_use @const fn ceil[T: f32_f16](@test_value(1.5) T) -> T
+@must_use @const fn ceil[N: num, T: f32_f16](@test_value(1.5) vec<N, T>) -> vec<N, T>
+@must_use @const fn clamp[T: fiu32_f16](T, T, T) -> T
+@must_use @const fn clamp[T: fiu32_f16, N: num](vec<N, T>, vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const fn cos[T: f32_f16](@test_value(0) T) -> T
+@must_use @const fn cos[N: num, T: f32_f16](@test_value(0) vec<N, T>) -> vec<N, T>
+@must_use @const fn cosh[T: f32_f16](@test_value(0) T) -> T
+@must_use @const fn cosh[N: num, T: f32_f16](@test_value(0) vec<N, T>) -> vec<N, T>
+@must_use @const fn countLeadingZeros[T: iu32](T) -> T
+@must_use @const fn countLeadingZeros[N: num, T: iu32](vec<N, T>) -> vec<N, T>
+@must_use @const fn countOneBits[T: iu32](T) -> T
+@must_use @const fn countOneBits[N: num, T: iu32](vec<N, T>) -> vec<N, T>
+@must_use @const fn countTrailingZeros[T: iu32](T) -> T
+@must_use @const fn countTrailingZeros[N: num, T: iu32](vec<N, T>) -> vec<N, T>
+@must_use @const fn cross[T: f32_f16](vec3<T>, vec3<T>) -> vec3<T>
+@must_use @const fn degrees[T: f32_f16](T) -> T
+@must_use @const fn degrees[N: num, T: f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn determinant[N: num, T: f32_f16](mat<N, N, T>) -> T
+@must_use @const fn distance[T: f32_f16](T, T) -> T
+@must_use @const fn distance[N: num, T: f32_f16](vec<N, T>, vec<N, T>) -> T
+@must_use @const fn dot[N: num, T: fiu32_f16](vec<N, T>, vec<N, T>) -> T
 @must_use fn dot4I8Packed(u32, u32) -> i32
 @must_use fn dot4U8Packed(u32, u32) -> u32
 @must_use @stage("fragment") fn dpdx(f32) -> f32
-@must_use @stage("fragment") fn dpdx<N: num>(vec<N, f32>) -> vec<N, f32>
+@must_use @stage("fragment") fn dpdx[N: num](vec<N, f32>) -> vec<N, f32>
 @must_use @stage("fragment") fn dpdxCoarse(f32) -> f32
-@must_use @stage("fragment") fn dpdxCoarse<N: num>(vec<N, f32>) -> vec<N, f32>
+@must_use @stage("fragment") fn dpdxCoarse[N: num](vec<N, f32>) -> vec<N, f32>
 @must_use @stage("fragment") fn dpdxFine(f32) -> f32
-@must_use @stage("fragment") fn dpdxFine<N: num>(vec<N, f32>) -> vec<N, f32>
+@must_use @stage("fragment") fn dpdxFine[N: num](vec<N, f32>) -> vec<N, f32>
 @must_use @stage("fragment") fn dpdy(f32) -> f32
-@must_use @stage("fragment") fn dpdy<N: num>(vec<N, f32>) -> vec<N, f32>
+@must_use @stage("fragment") fn dpdy[N: num](vec<N, f32>) -> vec<N, f32>
 @must_use @stage("fragment") fn dpdyCoarse(f32) -> f32
-@must_use @stage("fragment") fn dpdyCoarse<N: num>(vec<N, f32>) -> vec<N, f32>
+@must_use @stage("fragment") fn dpdyCoarse[N: num](vec<N, f32>) -> vec<N, f32>
 @must_use @stage("fragment") fn dpdyFine(f32) -> f32
-@must_use @stage("fragment") fn dpdyFine<N: num>(vec<N, f32>) -> vec<N, f32>
-@must_use @const fn exp<T: f32_f16>(T) -> T
-@must_use @const fn exp<N: num, T: f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn exp2<T: f32_f16>(T) -> T
-@must_use @const fn exp2<N: num, T: f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn extractBits<T: iu32>(T, u32, u32) -> T
-@must_use @const fn extractBits<N: num, T: iu32>(vec<N, T>, u32, u32) -> vec<N, T>
-@must_use @const fn faceForward<N: num, T: f32_f16>(vec<N, T>, vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const fn firstLeadingBit<T: iu32>(T) -> T
-@must_use @const fn firstLeadingBit<N: num, T: iu32>(vec<N, T>) -> vec<N, T>
-@must_use @const fn firstTrailingBit<T: iu32>(T) -> T
-@must_use @const fn firstTrailingBit<N: num, T: iu32>(vec<N, T>) -> vec<N, T>
-@must_use @const fn floor<T: f32_f16>(@test_value(1.5) T) -> T
-@must_use @const fn floor<N: num, T: f32_f16>(@test_value(1.5) vec<N, T>) -> vec<N, T>
-@must_use @const fn fma<T: f32_f16>(T, T, T) -> T
-@must_use @const fn fma<N: num, T: f32_f16>(vec<N, T>, vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const fn fract<T: f32_f16>(@test_value(1.25) T) -> T
-@must_use @const fn fract<N: num, T: f32_f16>(@test_value(1.25) vec<N, T>) -> vec<N, T>
-@must_use @const fn frexp<T: f32_f16>(T) -> __frexp_result<T>
-@must_use @const fn frexp<N: num, T: f32_f16>(vec<N, T>) -> __frexp_result_vec<N, T>
+@must_use @stage("fragment") fn dpdyFine[N: num](vec<N, f32>) -> vec<N, f32>
+@must_use @const fn exp[T: f32_f16](T) -> T
+@must_use @const fn exp[N: num, T: f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn exp2[T: f32_f16](T) -> T
+@must_use @const fn exp2[N: num, T: f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn extractBits[T: iu32](T, u32, u32) -> T
+@must_use @const fn extractBits[N: num, T: iu32](vec<N, T>, u32, u32) -> vec<N, T>
+@must_use @const fn faceForward[N: num, T: f32_f16](vec<N, T>, vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const fn firstLeadingBit[T: iu32](T) -> T
+@must_use @const fn firstLeadingBit[N: num, T: iu32](vec<N, T>) -> vec<N, T>
+@must_use @const fn firstTrailingBit[T: iu32](T) -> T
+@must_use @const fn firstTrailingBit[N: num, T: iu32](vec<N, T>) -> vec<N, T>
+@must_use @const fn floor[T: f32_f16](@test_value(1.5) T) -> T
+@must_use @const fn floor[N: num, T: f32_f16](@test_value(1.5) vec<N, T>) -> vec<N, T>
+@must_use @const fn fma[T: f32_f16](T, T, T) -> T
+@must_use @const fn fma[N: num, T: f32_f16](vec<N, T>, vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const fn fract[T: f32_f16](@test_value(1.25) T) -> T
+@must_use @const fn fract[N: num, T: f32_f16](@test_value(1.25) vec<N, T>) -> vec<N, T>
+@must_use @const fn frexp[T: f32_f16](T) -> __frexp_result<T>
+@must_use @const fn frexp[N: num, T: f32_f16](vec<N, T>) -> __frexp_result_vec<N, T>
 @must_use @stage("fragment") fn fwidth(f32) -> f32
-@must_use @stage("fragment") fn fwidth<N: num>(vec<N, f32>) -> vec<N, f32>
+@must_use @stage("fragment") fn fwidth[N: num](vec<N, f32>) -> vec<N, f32>
 @must_use @stage("fragment") fn fwidthCoarse(f32) -> f32
-@must_use @stage("fragment") fn fwidthCoarse<N: num>(vec<N, f32>) -> vec<N, f32>
+@must_use @stage("fragment") fn fwidthCoarse[N: num](vec<N, f32>) -> vec<N, f32>
 @must_use @stage("fragment") fn fwidthFine(f32) -> f32
-@must_use @stage("fragment") fn fwidthFine<N: num>(vec<N, f32>) -> vec<N, f32>
-@must_use @const fn insertBits<T: iu32>(T, T, u32, u32) -> T
-@must_use @const fn insertBits<N: num, T: iu32>(vec<N, T>, vec<N, T>, u32, u32) -> vec<N, T>
-@must_use @const fn inverseSqrt<T: f32_f16>(T) -> T
-@must_use @const fn inverseSqrt<N: num, T: f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn ldexp<T: f32_f16, U: i32>(T, U) -> T
-@must_use @const fn ldexp<N: num, T: f32_f16, U: i32>(vec<N, T>, vec<N, U>) -> vec<N, T>
-@must_use @const fn length<T: f32_f16>(@test_value(0.0) T) -> T
-@must_use @const fn length<N: num, T: f32_f16>(@test_value(0.0) vec<N, T>) -> T
-@must_use @const fn log<T: f32_f16>(T) -> T
-@must_use @const fn log<N: num, T: f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn log2<T: f32_f16>(T) -> T
-@must_use @const fn log2<N: num, T: f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn max<T: fiu32_f16>(T, T) -> T
-@must_use @const fn max<N: num, T: fiu32_f16>(vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const fn min<T: fiu32_f16>(T, T) -> T
-@must_use @const fn min<N: num, T: fiu32_f16>(vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const fn mix<T: f32_f16>(T, T, T) -> T
-@must_use @const fn mix<N: num, T: f32_f16>(vec<N, T>, vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const fn mix<N: num, T: f32_f16>(vec<N, T>, vec<N, T>, T) -> vec<N, T>
-@must_use @const fn modf<T: f32_f16>(@test_value(-1.5) T) -> __modf_result<T>
-@must_use @const fn modf<N: num, T: f32_f16>(@test_value(-1.5) vec<N, T>) -> __modf_result_vec<N, T>
-@must_use @const fn normalize<N: num, T: f32_f16>(vec<N, T>) -> vec<N, T>
+@must_use @stage("fragment") fn fwidthFine[N: num](vec<N, f32>) -> vec<N, f32>
+@must_use @const fn insertBits[T: iu32](T, T, u32, u32) -> T
+@must_use @const fn insertBits[N: num, T: iu32](vec<N, T>, vec<N, T>, u32, u32) -> vec<N, T>
+@must_use @const fn inverseSqrt[T: f32_f16](T) -> T
+@must_use @const fn inverseSqrt[N: num, T: f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn ldexp[T: f32_f16, U: i32](T, U) -> T
+@must_use @const fn ldexp[N: num, T: f32_f16, U: i32](vec<N, T>, vec<N, U>) -> vec<N, T>
+@must_use @const fn length[T: f32_f16](@test_value(0.0) T) -> T
+@must_use @const fn length[N: num, T: f32_f16](@test_value(0.0) vec<N, T>) -> T
+@must_use @const fn log[T: f32_f16](T) -> T
+@must_use @const fn log[N: num, T: f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn log2[T: f32_f16](T) -> T
+@must_use @const fn log2[N: num, T: f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn max[T: fiu32_f16](T, T) -> T
+@must_use @const fn max[N: num, T: fiu32_f16](vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const fn min[T: fiu32_f16](T, T) -> T
+@must_use @const fn min[N: num, T: fiu32_f16](vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const fn mix[T: f32_f16](T, T, T) -> T
+@must_use @const fn mix[N: num, T: f32_f16](vec<N, T>, vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const fn mix[N: num, T: f32_f16](vec<N, T>, vec<N, T>, T) -> vec<N, T>
+@must_use @const fn modf[T: f32_f16](@test_value(-1.5) T) -> __modf_result<T>
+@must_use @const fn modf[N: num, T: f32_f16](@test_value(-1.5) vec<N, T>) -> __modf_result_vec<N, T>
+@must_use @const fn normalize[N: num, T: f32_f16](vec<N, T>) -> vec<N, T>
 @must_use @const fn pack2x16float(vec2<f32>) -> u32
 @must_use @const fn pack2x16snorm(vec2<f32>) -> u32
 @must_use @const fn pack2x16unorm(vec2<f32>) -> u32
@@ -625,43 +625,43 @@
 @must_use @const fn pack4xU8(vec4<u32>) -> u32
 @must_use @const fn pack4xI8Clamp(vec4<i32>) -> u32
 @must_use @const fn pack4xU8Clamp(vec4<u32>) -> u32
-@must_use @const fn pow<T: f32_f16>(T, T) -> T
-@must_use @const fn pow<N: num, T: f32_f16>(vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const fn pow[T: f32_f16](T, T) -> T
+@must_use @const fn pow[N: num, T: f32_f16](vec<N, T>, vec<N, T>) -> vec<N, T>
 @must_use @const fn quantizeToF16(f32) -> f32
-@must_use @const fn quantizeToF16<N: num>(vec<N, f32>) -> vec<N, f32>
-@must_use @const fn radians<T: f32_f16>(T) -> T
-@must_use @const fn radians<N: num, T: f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn reflect<N: num, T: f32_f16>(vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const fn refract<N: num, T: f32_f16>(vec<N, T>, vec<N, T>, T) -> vec<N, T>
-@must_use @const fn reverseBits<T: iu32>(T) -> T
-@must_use @const fn reverseBits<N: num, T: iu32>(vec<N, T>) -> vec<N, T>
-@must_use @const fn round<T: f32_f16>(@test_value(3.5) T) -> T
-@must_use @const fn round<N: num, T: f32_f16>(@test_value(3.5) vec<N, T>) -> vec<N, T>
-@must_use @const fn saturate<T: f32_f16>(@test_value(2) T) -> T
-@must_use @const fn saturate<T: f32_f16, N: num>(@test_value(2) vec<N, T>) -> vec<N, T>
-@must_use @const("select_bool") fn select<T: scalar>(T, T, bool) -> T
-@must_use @const("select_bool") fn select<T: scalar, N: num>(vec<N, T>, vec<N, T>, bool) -> vec<N, T>
-@must_use @const("select_boolvec") fn select<N: num, T: scalar>(vec<N, T>, vec<N, T>, vec<N, bool>) -> vec<N, T>
-@must_use @const fn sign<T: fi32_f16>(T) -> T
-@must_use @const fn sign<N: num, T: fi32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn sin<T: f32_f16>(@test_value(1.57079632679) T) -> T
-@must_use @const fn sin<N: num, T: f32_f16>(@test_value(1.57079632679) vec<N, T>) -> vec<N, T>
-@must_use @const fn sinh<T: f32_f16>(T) -> T
-@must_use @const fn sinh<N: num, T: f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn smoothstep<T: f32_f16>(@test_value(2) T, @test_value(4) T, @test_value(3) T) -> T
-@must_use @const fn smoothstep<N: num, T: f32_f16>(@test_value(2) vec<N, T>, @test_value(4) vec<N, T>, @test_value(3) vec<N, T>) -> vec<N, T>
-@must_use @const fn sqrt<T: f32_f16>(T) -> T
-@must_use @const fn sqrt<N: num, T: f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn step<T: f32_f16>(T, T) -> T
-@must_use @const fn step<N: num, T: f32_f16>(vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const fn quantizeToF16[N: num](vec<N, f32>) -> vec<N, f32>
+@must_use @const fn radians[T: f32_f16](T) -> T
+@must_use @const fn radians[N: num, T: f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn reflect[N: num, T: f32_f16](vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const fn refract[N: num, T: f32_f16](vec<N, T>, vec<N, T>, T) -> vec<N, T>
+@must_use @const fn reverseBits[T: iu32](T) -> T
+@must_use @const fn reverseBits[N: num, T: iu32](vec<N, T>) -> vec<N, T>
+@must_use @const fn round[T: f32_f16](@test_value(3.5) T) -> T
+@must_use @const fn round[N: num, T: f32_f16](@test_value(3.5) vec<N, T>) -> vec<N, T>
+@must_use @const fn saturate[T: f32_f16](@test_value(2) T) -> T
+@must_use @const fn saturate[T: f32_f16, N: num](@test_value(2) vec<N, T>) -> vec<N, T>
+@must_use @const("select_bool") fn select[T: scalar](T, T, bool) -> T
+@must_use @const("select_bool") fn select[T: scalar, N: num](vec<N, T>, vec<N, T>, bool) -> vec<N, T>
+@must_use @const("select_boolvec") fn select[N: num, T: scalar](vec<N, T>, vec<N, T>, vec<N, bool>) -> vec<N, T>
+@must_use @const fn sign[T: fi32_f16](T) -> T
+@must_use @const fn sign[N: num, T: fi32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn sin[T: f32_f16](@test_value(1.57079632679) T) -> T
+@must_use @const fn sin[N: num, T: f32_f16](@test_value(1.57079632679) vec<N, T>) -> vec<N, T>
+@must_use @const fn sinh[T: f32_f16](T) -> T
+@must_use @const fn sinh[N: num, T: f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn smoothstep[T: f32_f16](@test_value(2) T, @test_value(4) T, @test_value(3) T) -> T
+@must_use @const fn smoothstep[N: num, T: f32_f16](@test_value(2) vec<N, T>, @test_value(4) vec<N, T>, @test_value(3) vec<N, T>) -> vec<N, T>
+@must_use @const fn sqrt[T: f32_f16](T) -> T
+@must_use @const fn sqrt[N: num, T: f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn step[T: f32_f16](T, T) -> T
+@must_use @const fn step[N: num, T: f32_f16](vec<N, T>, vec<N, T>) -> vec<N, T>
 @stage("compute") fn storageBarrier()
-@must_use @const fn tan<T: f32_f16>(T) -> T
-@must_use @const fn tan<N: num, T: f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn tanh<T: f32_f16>(T) -> T
-@must_use @const fn tanh<N: num, T: f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn transpose<M: num, N: num, T: f32_f16>(mat<M, N, T>) -> mat<N, M, T>
-@must_use @const fn trunc<T: f32_f16>(@test_value(1.5) T) -> T
-@must_use @const fn trunc<N: num, T: f32_f16>(@test_value(1.5) vec<N, T>) -> vec<N, T>
+@must_use @const fn tan[T: f32_f16](T) -> T
+@must_use @const fn tan[N: num, T: f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn tanh[T: f32_f16](T) -> T
+@must_use @const fn tanh[N: num, T: f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn transpose[M: num, N: num, T: f32_f16](mat<M, N, T>) -> mat<N, M, T>
+@must_use @const fn trunc[T: f32_f16](@test_value(1.5) T) -> T
+@must_use @const fn trunc[N: num, T: f32_f16](@test_value(1.5) vec<N, T>) -> vec<N, T>
 @must_use @const fn unpack2x16float(u32) -> vec2<f32>
 @must_use @const fn unpack2x16snorm(u32) -> vec2<f32>
 @must_use @const fn unpack2x16unorm(u32) -> vec2<f32>
@@ -672,176 +672,176 @@
 @stage("compute") fn workgroupBarrier()
 
 @stage("compute") fn textureBarrier()
-@must_use fn textureDimensions<T: fiu32>(texture: texture_1d<T>) -> u32
-@must_use fn textureDimensions<T: fiu32, L: iu32>(texture: texture_1d<T>, level: L) -> u32
-@must_use fn textureDimensions<T: fiu32>(texture: texture_2d<T>) -> vec2<u32>
-@must_use fn textureDimensions<T: fiu32, L: iu32>(texture: texture_2d<T>, level: L) -> vec2<u32>
-@must_use fn textureDimensions<T: fiu32>(texture: texture_2d_array<T>) -> vec2<u32>
-@must_use fn textureDimensions<T: fiu32, L: iu32>(texture: texture_2d_array<T>, level: L) -> vec2<u32>
-@must_use fn textureDimensions<T: fiu32>(texture: texture_3d<T>) -> vec3<u32>
-@must_use fn textureDimensions<T: fiu32, L: iu32>(texture: texture_3d<T>, level: L) -> vec3<u32>
-@must_use fn textureDimensions<T: fiu32>(texture: texture_cube<T>) -> vec2<u32>
-@must_use fn textureDimensions<T: fiu32, L: iu32>(texture: texture_cube<T>, level: L) -> vec2<u32>
-@must_use fn textureDimensions<T: fiu32>(texture: texture_cube_array<T>) -> vec2<u32>
-@must_use fn textureDimensions<T: fiu32, L: iu32>(texture: texture_cube_array<T>, level: L) -> vec2<u32>
-@must_use fn textureDimensions<T: fiu32>(texture: texture_multisampled_2d<T>) -> vec2<u32>
+@must_use fn textureDimensions[T: fiu32](texture: texture_1d<T>) -> u32
+@must_use fn textureDimensions[T: fiu32, L: iu32](texture: texture_1d<T>, level: L) -> u32
+@must_use fn textureDimensions[T: fiu32](texture: texture_2d<T>) -> vec2<u32>
+@must_use fn textureDimensions[T: fiu32, L: iu32](texture: texture_2d<T>, level: L) -> vec2<u32>
+@must_use fn textureDimensions[T: fiu32](texture: texture_2d_array<T>) -> vec2<u32>
+@must_use fn textureDimensions[T: fiu32, L: iu32](texture: texture_2d_array<T>, level: L) -> vec2<u32>
+@must_use fn textureDimensions[T: fiu32](texture: texture_3d<T>) -> vec3<u32>
+@must_use fn textureDimensions[T: fiu32, L: iu32](texture: texture_3d<T>, level: L) -> vec3<u32>
+@must_use fn textureDimensions[T: fiu32](texture: texture_cube<T>) -> vec2<u32>
+@must_use fn textureDimensions[T: fiu32, L: iu32](texture: texture_cube<T>, level: L) -> vec2<u32>
+@must_use fn textureDimensions[T: fiu32](texture: texture_cube_array<T>) -> vec2<u32>
+@must_use fn textureDimensions[T: fiu32, L: iu32](texture: texture_cube_array<T>, level: L) -> vec2<u32>
+@must_use fn textureDimensions[T: fiu32](texture: texture_multisampled_2d<T>) -> vec2<u32>
 @must_use fn textureDimensions(texture: texture_depth_2d) -> vec2<u32>
-@must_use fn textureDimensions<L: iu32>(texture: texture_depth_2d, level: L) -> vec2<u32>
+@must_use fn textureDimensions[L: iu32](texture: texture_depth_2d, level: L) -> vec2<u32>
 @must_use fn textureDimensions(texture: texture_depth_2d_array) -> vec2<u32>
-@must_use fn textureDimensions<L: iu32>(texture: texture_depth_2d_array, level: L) -> vec2<u32>
+@must_use fn textureDimensions[L: iu32](texture: texture_depth_2d_array, level: L) -> vec2<u32>
 @must_use fn textureDimensions(texture: texture_depth_cube) -> vec2<u32>
-@must_use fn textureDimensions<L: iu32>(texture: texture_depth_cube, level: L) -> vec2<u32>
+@must_use fn textureDimensions[L: iu32](texture: texture_depth_cube, level: L) -> vec2<u32>
 @must_use fn textureDimensions(texture: texture_depth_cube_array) -> vec2<u32>
-@must_use fn textureDimensions<L: iu32>(texture: texture_depth_cube_array, level: L) -> vec2<u32>
+@must_use fn textureDimensions[L: iu32](texture: texture_depth_cube_array, level: L) -> vec2<u32>
 @must_use fn textureDimensions(texture: texture_depth_multisampled_2d) -> vec2<u32>
-@must_use fn textureDimensions<F: texel_format, A: access>(texture: texture_storage_1d<F, A>) -> u32
-@must_use fn textureDimensions<F: texel_format, A: access>(texture: texture_storage_2d<F, A>) -> vec2<u32>
-@must_use fn textureDimensions<F: texel_format, A: access>(texture: texture_storage_2d_array<F, A>) -> vec2<u32>
-@must_use fn textureDimensions<F: texel_format, A: access>(texture: texture_storage_3d<F, A>) -> vec3<u32>
+@must_use fn textureDimensions[F: texel_format, A: access](texture: texture_storage_1d<F, A>) -> u32
+@must_use fn textureDimensions[F: texel_format, A: access](texture: texture_storage_2d<F, A>) -> vec2<u32>
+@must_use fn textureDimensions[F: texel_format, A: access](texture: texture_storage_2d_array<F, A>) -> vec2<u32>
+@must_use fn textureDimensions[F: texel_format, A: access](texture: texture_storage_3d<F, A>) -> vec3<u32>
 @must_use fn textureDimensions(texture: texture_external) -> vec2<u32>
-@must_use fn textureGather<T: fiu32, C: iu32>(@const component: C, texture: texture_2d<T>, sampler: sampler, coords: vec2<f32>) -> vec4<T>
-@must_use fn textureGather<T: fiu32, C: iu32>(@const component: C, texture: texture_2d<T>, sampler: sampler, coords: vec2<f32>, @const offset: vec2<i32>) -> vec4<T>
-@must_use fn textureGather<T: fiu32, C: iu32, A: iu32>(@const component: C, texture: texture_2d_array<T>, sampler: sampler, coords: vec2<f32>, array_index: A) -> vec4<T>
-@must_use fn textureGather<T: fiu32, C: iu32, A: iu32>(@const component: C, texture: texture_2d_array<T>, sampler: sampler, coords: vec2<f32>, array_index: A, @const offset: vec2<i32>) -> vec4<T>
-@must_use fn textureGather<T: fiu32, C: iu32>(@const component: C, texture: texture_cube<T>, sampler: sampler, coords: vec3<f32>) -> vec4<T>
-@must_use fn textureGather<T: fiu32, C: iu32, A: iu32>(@const component: C, texture: texture_cube_array<T>, sampler: sampler, coords: vec3<f32>, array_index: A) -> vec4<T>
+@must_use fn textureGather[T: fiu32, C: iu32](@const component: C, texture: texture_2d<T>, sampler: sampler, coords: vec2<f32>) -> vec4<T>
+@must_use fn textureGather[T: fiu32, C: iu32](@const component: C, texture: texture_2d<T>, sampler: sampler, coords: vec2<f32>, @const offset: vec2<i32>) -> vec4<T>
+@must_use fn textureGather[T: fiu32, C: iu32, A: iu32](@const component: C, texture: texture_2d_array<T>, sampler: sampler, coords: vec2<f32>, array_index: A) -> vec4<T>
+@must_use fn textureGather[T: fiu32, C: iu32, A: iu32](@const component: C, texture: texture_2d_array<T>, sampler: sampler, coords: vec2<f32>, array_index: A, @const offset: vec2<i32>) -> vec4<T>
+@must_use fn textureGather[T: fiu32, C: iu32](@const component: C, texture: texture_cube<T>, sampler: sampler, coords: vec3<f32>) -> vec4<T>
+@must_use fn textureGather[T: fiu32, C: iu32, A: iu32](@const component: C, texture: texture_cube_array<T>, sampler: sampler, coords: vec3<f32>, array_index: A) -> vec4<T>
 @must_use fn textureGather(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>) -> vec4<f32>
 @must_use fn textureGather(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, @const offset: vec2<i32>) -> vec4<f32>
-@must_use fn textureGather<A: iu32>(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A) -> vec4<f32>
-@must_use fn textureGather<A: iu32>(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A, @const offset: vec2<i32>) -> vec4<f32>
+@must_use fn textureGather[A: iu32](texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A) -> vec4<f32>
+@must_use fn textureGather[A: iu32](texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A, @const offset: vec2<i32>) -> vec4<f32>
 @must_use fn textureGather(texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>) -> vec4<f32>
-@must_use fn textureGather<A: iu32>(texture: texture_depth_cube_array, sampler: sampler, coords: vec3<f32>, array_index: A) -> vec4<f32>
+@must_use fn textureGather[A: iu32](texture: texture_depth_cube_array, sampler: sampler, coords: vec3<f32>, array_index: A) -> vec4<f32>
 @must_use fn textureGatherCompare(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32) -> vec4<f32>
 @must_use fn textureGatherCompare(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32, @const offset: vec2<i32>) -> vec4<f32>
-@must_use fn textureGatherCompare<A: iu32>(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32) -> vec4<f32>
-@must_use fn textureGatherCompare<A: iu32>(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32, @const offset: vec2<i32>) -> vec4<f32>
+@must_use fn textureGatherCompare[A: iu32](texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32) -> vec4<f32>
+@must_use fn textureGatherCompare[A: iu32](texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32, @const offset: vec2<i32>) -> vec4<f32>
 @must_use fn textureGatherCompare(texture: texture_depth_cube, sampler: sampler_comparison, coords: vec3<f32>, depth_ref: f32) -> vec4<f32>
-@must_use fn textureGatherCompare<A: iu32>(texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: A, depth_ref: f32) -> vec4<f32>
-@must_use fn textureNumLayers<T: fiu32>(texture: texture_2d_array<T>) -> u32
-@must_use fn textureNumLayers<T: fiu32>(texture: texture_cube_array<T>) -> u32
+@must_use fn textureGatherCompare[A: iu32](texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: A, depth_ref: f32) -> vec4<f32>
+@must_use fn textureNumLayers[T: fiu32](texture: texture_2d_array<T>) -> u32
+@must_use fn textureNumLayers[T: fiu32](texture: texture_cube_array<T>) -> u32
 @must_use fn textureNumLayers(texture: texture_depth_2d_array) -> u32
 @must_use fn textureNumLayers(texture: texture_depth_cube_array) -> u32
-@must_use fn textureNumLayers<F: texel_format, A: access>(texture: texture_storage_2d_array<F, A>) -> u32
-@must_use fn textureNumLevels<T: fiu32>(texture: texture_1d<T>) -> u32
-@must_use fn textureNumLevels<T: fiu32>(texture: texture_2d<T>) -> u32
-@must_use fn textureNumLevels<T: fiu32>(texture: texture_2d_array<T>) -> u32
-@must_use fn textureNumLevels<T: fiu32>(texture: texture_3d<T>) -> u32
-@must_use fn textureNumLevels<T: fiu32>(texture: texture_cube<T>) -> u32
-@must_use fn textureNumLevels<T: fiu32>(texture: texture_cube_array<T>) -> u32
+@must_use fn textureNumLayers[F: texel_format, A: access](texture: texture_storage_2d_array<F, A>) -> u32
+@must_use fn textureNumLevels[T: fiu32](texture: texture_1d<T>) -> u32
+@must_use fn textureNumLevels[T: fiu32](texture: texture_2d<T>) -> u32
+@must_use fn textureNumLevels[T: fiu32](texture: texture_2d_array<T>) -> u32
+@must_use fn textureNumLevels[T: fiu32](texture: texture_3d<T>) -> u32
+@must_use fn textureNumLevels[T: fiu32](texture: texture_cube<T>) -> u32
+@must_use fn textureNumLevels[T: fiu32](texture: texture_cube_array<T>) -> u32
 @must_use fn textureNumLevels(texture: texture_depth_2d) -> u32
 @must_use fn textureNumLevels(texture: texture_depth_2d_array) -> u32
 @must_use fn textureNumLevels(texture: texture_depth_cube) -> u32
 @must_use fn textureNumLevels(texture: texture_depth_cube_array) -> u32
-@must_use fn textureNumSamples<T: fiu32>(texture: texture_multisampled_2d<T>) -> u32
+@must_use fn textureNumSamples[T: fiu32](texture: texture_multisampled_2d<T>) -> u32
 @must_use fn textureNumSamples(texture: texture_depth_multisampled_2d) -> u32
 @must_use @stage("fragment") fn textureSample(texture: texture_1d<f32>, sampler: sampler, coords: f32) -> vec4<f32>
 @must_use @stage("fragment") fn textureSample(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>) -> vec4<f32>
 @must_use @stage("fragment") fn textureSample(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, @const offset: vec2<i32>) -> vec4<f32>
-@must_use @stage("fragment") fn textureSample<A: iu32>(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A) -> vec4<f32>
-@must_use @stage("fragment") fn textureSample<A: iu32>(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, @const offset: vec2<i32>) -> vec4<f32>
+@must_use @stage("fragment") fn textureSample[A: iu32](texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A) -> vec4<f32>
+@must_use @stage("fragment") fn textureSample[A: iu32](texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, @const offset: vec2<i32>) -> vec4<f32>
 @must_use @stage("fragment") fn textureSample(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>) -> vec4<f32>
 @must_use @stage("fragment") fn textureSample(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, @const offset: vec3<i32>) -> vec4<f32>
 @must_use @stage("fragment") fn textureSample(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>) -> vec4<f32>
-@must_use @stage("fragment") fn textureSample<A: iu32>(texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: A) -> vec4<f32>
+@must_use @stage("fragment") fn textureSample[A: iu32](texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: A) -> vec4<f32>
 @must_use @stage("fragment") fn textureSample(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>) -> f32
 @must_use @stage("fragment") fn textureSample(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, @const offset: vec2<i32>) -> f32
-@must_use @stage("fragment") fn textureSample<A: iu32>(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A) -> f32
-@must_use @stage("fragment") fn textureSample<A: iu32>(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A, @const offset: vec2<i32>) -> f32
+@must_use @stage("fragment") fn textureSample[A: iu32](texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A) -> f32
+@must_use @stage("fragment") fn textureSample[A: iu32](texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A, @const offset: vec2<i32>) -> f32
 @must_use @stage("fragment") fn textureSample(texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>) -> f32
-@must_use @stage("fragment") fn textureSample<A: iu32>(texture: texture_depth_cube_array, sampler: sampler, coords: vec3<f32>, array_index: A) -> f32
+@must_use @stage("fragment") fn textureSample[A: iu32](texture: texture_depth_cube_array, sampler: sampler, coords: vec3<f32>, array_index: A) -> f32
 @must_use @stage("fragment") fn textureSampleBias(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, bias: f32) -> vec4<f32>
 @must_use @stage("fragment") fn textureSampleBias(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, bias: f32, @const offset: vec2<i32>) -> vec4<f32>
-@must_use @stage("fragment") fn textureSampleBias<A: iu32>(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, bias: f32) -> vec4<f32>
-@must_use @stage("fragment") fn textureSampleBias<A: iu32>(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, bias: f32, @const offset: vec2<i32>) -> vec4<f32>
+@must_use @stage("fragment") fn textureSampleBias[A: iu32](texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, bias: f32) -> vec4<f32>
+@must_use @stage("fragment") fn textureSampleBias[A: iu32](texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, bias: f32, @const offset: vec2<i32>) -> vec4<f32>
 @must_use @stage("fragment") fn textureSampleBias(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, bias: f32) -> vec4<f32>
 @must_use @stage("fragment") fn textureSampleBias(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, bias: f32, @const offset: vec3<i32>) -> vec4<f32>
 @must_use @stage("fragment") fn textureSampleBias(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>, bias: f32) -> vec4<f32>
-@must_use @stage("fragment") fn textureSampleBias<A: iu32>(texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: A, bias: f32) -> vec4<f32>
+@must_use @stage("fragment") fn textureSampleBias[A: iu32](texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: A, bias: f32) -> vec4<f32>
 @must_use @stage("fragment") fn textureSampleCompare(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32) -> f32
 @must_use @stage("fragment") fn textureSampleCompare(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32, @const offset: vec2<i32>) -> f32
-@must_use @stage("fragment") fn textureSampleCompare<A: iu32>(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32) -> f32
-@must_use @stage("fragment") fn textureSampleCompare<A: iu32>(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32, @const offset: vec2<i32>) -> f32
+@must_use @stage("fragment") fn textureSampleCompare[A: iu32](texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32) -> f32
+@must_use @stage("fragment") fn textureSampleCompare[A: iu32](texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32, @const offset: vec2<i32>) -> f32
 @must_use @stage("fragment") fn textureSampleCompare(texture: texture_depth_cube, sampler: sampler_comparison, coords: vec3<f32>, depth_ref: f32) -> f32
-@must_use @stage("fragment") fn textureSampleCompare<A: iu32>(texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: A, depth_ref: f32) -> f32
+@must_use @stage("fragment") fn textureSampleCompare[A: iu32](texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: A, depth_ref: f32) -> f32
 @must_use fn textureSampleCompareLevel(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32) -> f32
 @must_use fn textureSampleCompareLevel(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32, @const offset: vec2<i32>) -> f32
-@must_use fn textureSampleCompareLevel<A: iu32>(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32) -> f32
-@must_use fn textureSampleCompareLevel<A: iu32>(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32, @const offset: vec2<i32>) -> f32
+@must_use fn textureSampleCompareLevel[A: iu32](texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32) -> f32
+@must_use fn textureSampleCompareLevel[A: iu32](texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32, @const offset: vec2<i32>) -> f32
 @must_use fn textureSampleCompareLevel(texture: texture_depth_cube, sampler: sampler_comparison, coords: vec3<f32>, depth_ref: f32) -> f32
-@must_use fn textureSampleCompareLevel<A: iu32>(texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: A, depth_ref: f32) -> f32
+@must_use fn textureSampleCompareLevel[A: iu32](texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: A, depth_ref: f32) -> f32
 @must_use fn textureSampleGrad(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, ddx: vec2<f32>, ddy: vec2<f32>) -> vec4<f32>
 @must_use fn textureSampleGrad(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, ddx: vec2<f32>, ddy: vec2<f32>, @const offset: vec2<i32>) -> vec4<f32>
-@must_use fn textureSampleGrad<A: iu32>(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, ddx: vec2<f32>, ddy: vec2<f32>) -> vec4<f32>
-@must_use fn textureSampleGrad<A: iu32>(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, ddx: vec2<f32>, ddy: vec2<f32>, @const offset: vec2<i32>) -> vec4<f32>
+@must_use fn textureSampleGrad[A: iu32](texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, ddx: vec2<f32>, ddy: vec2<f32>) -> vec4<f32>
+@must_use fn textureSampleGrad[A: iu32](texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, ddx: vec2<f32>, ddy: vec2<f32>, @const offset: vec2<i32>) -> vec4<f32>
 @must_use fn textureSampleGrad(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, ddx: vec3<f32>, ddy: vec3<f32>) -> vec4<f32>
 @must_use fn textureSampleGrad(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, ddx: vec3<f32>, ddy: vec3<f32>, @const offset: vec3<i32>) -> vec4<f32>
 @must_use fn textureSampleGrad(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>, ddx: vec3<f32>, ddy: vec3<f32>) -> vec4<f32>
-@must_use fn textureSampleGrad<A: iu32>(texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: A, ddx: vec3<f32>, ddy: vec3<f32>) -> vec4<f32>
+@must_use fn textureSampleGrad[A: iu32](texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: A, ddx: vec3<f32>, ddy: vec3<f32>) -> vec4<f32>
 @must_use fn textureSampleLevel(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, level: f32) -> vec4<f32>
 @must_use fn textureSampleLevel(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, level: f32, @const offset: vec2<i32>) -> vec4<f32>
-@must_use fn textureSampleLevel<A: iu32>(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, level: f32) -> vec4<f32>
-@must_use fn textureSampleLevel<A: iu32>(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, level: f32, @const offset: vec2<i32>) -> vec4<f32>
+@must_use fn textureSampleLevel[A: iu32](texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, level: f32) -> vec4<f32>
+@must_use fn textureSampleLevel[A: iu32](texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, level: f32, @const offset: vec2<i32>) -> vec4<f32>
 @must_use fn textureSampleLevel(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, level: f32) -> vec4<f32>
 @must_use fn textureSampleLevel(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, level: f32, @const offset: vec3<i32>) -> vec4<f32>
 @must_use fn textureSampleLevel(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>, level: f32) -> vec4<f32>
-@must_use fn textureSampleLevel<A: iu32>(texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: A, level: f32) -> vec4<f32>
-@must_use fn textureSampleLevel<L: iu32>(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, level: L) -> f32
-@must_use fn textureSampleLevel<L: iu32>(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, level: L, @const offset: vec2<i32>) -> f32
-@must_use fn textureSampleLevel<A: iu32, L: iu32>(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A, level: L) -> f32
-@must_use fn textureSampleLevel<A: iu32, L: iu32>(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A, level: L, @const offset: vec2<i32>) -> f32
-@must_use fn textureSampleLevel<L: iu32>(texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>, level: L) -> f32
-@must_use fn textureSampleLevel<A: iu32, L: iu32>(texture: texture_depth_cube_array,sampler: sampler, coords: vec3<f32>, array_index: A, level: L) -> f32
+@must_use fn textureSampleLevel[A: iu32](texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: A, level: f32) -> vec4<f32>
+@must_use fn textureSampleLevel[L: iu32](texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, level: L) -> f32
+@must_use fn textureSampleLevel[L: iu32](texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, level: L, @const offset: vec2<i32>) -> f32
+@must_use fn textureSampleLevel[A: iu32, L: iu32](texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A, level: L) -> f32
+@must_use fn textureSampleLevel[A: iu32, L: iu32](texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A, level: L, @const offset: vec2<i32>) -> f32
+@must_use fn textureSampleLevel[L: iu32](texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>, level: L) -> f32
+@must_use fn textureSampleLevel[A: iu32, L: iu32](texture: texture_depth_cube_array,sampler: sampler, coords: vec3<f32>, array_index: A, level: L) -> f32
 @must_use fn textureSampleBaseClampToEdge(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>) -> vec4<f32>
 @must_use fn textureSampleBaseClampToEdge(texture: texture_external, sampler: sampler, coords: vec2<f32>) -> vec4<f32>
-fn textureStore<C: iu32>(texture: texture_storage_1d<f32_texel_format, writable>, coords: C, value: vec4<f32>)
-fn textureStore<C: iu32>(texture: texture_storage_2d<f32_texel_format, writable>, coords: vec2<C>, value: vec4<f32>)
-fn textureStore<C: iu32, A: iu32>(texture: texture_storage_2d_array<f32_texel_format, writable>, coords: vec2<C>, array_index: A, value: vec4<f32>)
-fn textureStore<C: iu32>(texture: texture_storage_3d<f32_texel_format, writable>, coords: vec3<C>, value: vec4<f32>)
-fn textureStore<C: iu32>(texture: texture_storage_1d<i32_texel_format, writable>, coords: C, value: vec4<i32>)
-fn textureStore<C: iu32>(texture: texture_storage_2d<i32_texel_format, writable>, coords: vec2<C>, value: vec4<i32>)
-fn textureStore<C: iu32, A: iu32>(texture: texture_storage_2d_array<i32_texel_format, writable>, coords: vec2<C>, array_index: A, value: vec4<i32>)
-fn textureStore<C: iu32>(texture: texture_storage_3d<i32_texel_format, writable>, coords: vec3<C>, value: vec4<i32>)
-fn textureStore<C: iu32>(texture: texture_storage_1d<u32_texel_format, writable>, coords: C, value: vec4<u32>)
-fn textureStore<C: iu32>(texture: texture_storage_2d<u32_texel_format, writable>, coords: vec2<C>, value: vec4<u32>)
-fn textureStore<C: iu32, A: iu32>(texture: texture_storage_2d_array<u32_texel_format, writable>, coords: vec2<C>, array_index: A, value: vec4<u32>)
-fn textureStore<C: iu32>(texture: texture_storage_3d<u32_texel_format, writable>, coords: vec3<C>, value: vec4<u32>)
-@must_use fn textureLoad<T: fiu32, C: iu32, L: iu32>(texture: texture_1d<T>, coords: C, level: L) -> vec4<T>
-@must_use fn textureLoad<T: fiu32, C: iu32, L: iu32>(texture: texture_2d<T>, coords: vec2<C>, level: L) -> vec4<T>
-@must_use fn textureLoad<T: fiu32, C: iu32, A: iu32, L: iu32>(texture: texture_2d_array<T>, coords: vec2<C>, array_index: A, level: L) -> vec4<T>
-@must_use fn textureLoad<T: fiu32, C: iu32, L: iu32>(texture: texture_3d<T>, coords: vec3<C>, level: L) -> vec4<T>
-@must_use fn textureLoad<T: fiu32, C: iu32, S: iu32>(texture: texture_multisampled_2d<T>, coords: vec2<C>, sample_index: S) -> vec4<T>
-@must_use fn textureLoad<C: iu32, L: iu32>(texture: texture_depth_2d, coords: vec2<C>, level: L) -> f32
-@must_use fn textureLoad<C: iu32, A: iu32, L: iu32>(texture: texture_depth_2d_array, coords: vec2<C>, array_index: A, level: L) -> f32
-@must_use fn textureLoad<C: iu32, S: iu32>(texture: texture_depth_multisampled_2d, coords: vec2<C>, sample_index: S) -> f32
-@must_use fn textureLoad<C: iu32>(texture: texture_external, coords: vec2<C>) -> vec4<f32>
-@must_use fn textureLoad<C: iu32>(texture: texture_storage_1d<f32_texel_format, readable>, coords: C) -> vec4<f32>
-@must_use fn textureLoad<C: iu32>(texture: texture_storage_1d<i32_texel_format, readable>, coords: C) -> vec4<i32>
-@must_use fn textureLoad<C: iu32>(texture: texture_storage_1d<u32_texel_format, readable>, coords: C) -> vec4<u32>
-@must_use fn textureLoad<C: iu32>(texture: texture_storage_2d<f32_texel_format, readable>, coords: vec2<C>) -> vec4<f32>
-@must_use fn textureLoad<C: iu32>(texture: texture_storage_2d<i32_texel_format, readable>, coords: vec2<C>) -> vec4<i32>
-@must_use fn textureLoad<C: iu32>(texture: texture_storage_2d<u32_texel_format, readable>, coords: vec2<C>) -> vec4<u32>
-@must_use fn textureLoad<C: iu32, A: iu32>(texture: texture_storage_2d_array<f32_texel_format, readable>, coords: vec2<C>, array_index: A) -> vec4<f32>
-@must_use fn textureLoad<C: iu32, A: iu32>(texture: texture_storage_2d_array<i32_texel_format, readable>, coords: vec2<C>, array_index: A) -> vec4<i32>
-@must_use fn textureLoad<C: iu32, A: iu32>(texture: texture_storage_2d_array<u32_texel_format, readable>, coords: vec2<C>, array_index: A) -> vec4<u32>
-@must_use fn textureLoad<C: iu32>(texture: texture_storage_3d<f32_texel_format, readable>, coords: vec3<C>) -> vec4<f32>
-@must_use fn textureLoad<C: iu32>(texture: texture_storage_3d<i32_texel_format, readable>, coords: vec3<C>) -> vec4<i32>
-@must_use fn textureLoad<C: iu32>(texture: texture_storage_3d<u32_texel_format, readable>, coords: vec3<C>) -> vec4<u32>
+fn textureStore[C: iu32](texture: texture_storage_1d<f32_texel_format, writable>, coords: C, value: vec4<f32>)
+fn textureStore[C: iu32](texture: texture_storage_2d<f32_texel_format, writable>, coords: vec2<C>, value: vec4<f32>)
+fn textureStore[C: iu32, A: iu32](texture: texture_storage_2d_array<f32_texel_format, writable>, coords: vec2<C>, array_index: A, value: vec4<f32>)
+fn textureStore[C: iu32](texture: texture_storage_3d<f32_texel_format, writable>, coords: vec3<C>, value: vec4<f32>)
+fn textureStore[C: iu32](texture: texture_storage_1d<i32_texel_format, writable>, coords: C, value: vec4<i32>)
+fn textureStore[C: iu32](texture: texture_storage_2d<i32_texel_format, writable>, coords: vec2<C>, value: vec4<i32>)
+fn textureStore[C: iu32, A: iu32](texture: texture_storage_2d_array<i32_texel_format, writable>, coords: vec2<C>, array_index: A, value: vec4<i32>)
+fn textureStore[C: iu32](texture: texture_storage_3d<i32_texel_format, writable>, coords: vec3<C>, value: vec4<i32>)
+fn textureStore[C: iu32](texture: texture_storage_1d<u32_texel_format, writable>, coords: C, value: vec4<u32>)
+fn textureStore[C: iu32](texture: texture_storage_2d<u32_texel_format, writable>, coords: vec2<C>, value: vec4<u32>)
+fn textureStore[C: iu32, A: iu32](texture: texture_storage_2d_array<u32_texel_format, writable>, coords: vec2<C>, array_index: A, value: vec4<u32>)
+fn textureStore[C: iu32](texture: texture_storage_3d<u32_texel_format, writable>, coords: vec3<C>, value: vec4<u32>)
+@must_use fn textureLoad[T: fiu32, C: iu32, L: iu32](texture: texture_1d<T>, coords: C, level: L) -> vec4<T>
+@must_use fn textureLoad[T: fiu32, C: iu32, L: iu32](texture: texture_2d<T>, coords: vec2<C>, level: L) -> vec4<T>
+@must_use fn textureLoad[T: fiu32, C: iu32, A: iu32, L: iu32](texture: texture_2d_array<T>, coords: vec2<C>, array_index: A, level: L) -> vec4<T>
+@must_use fn textureLoad[T: fiu32, C: iu32, L: iu32](texture: texture_3d<T>, coords: vec3<C>, level: L) -> vec4<T>
+@must_use fn textureLoad[T: fiu32, C: iu32, S: iu32](texture: texture_multisampled_2d<T>, coords: vec2<C>, sample_index: S) -> vec4<T>
+@must_use fn textureLoad[C: iu32, L: iu32](texture: texture_depth_2d, coords: vec2<C>, level: L) -> f32
+@must_use fn textureLoad[C: iu32, A: iu32, L: iu32](texture: texture_depth_2d_array, coords: vec2<C>, array_index: A, level: L) -> f32
+@must_use fn textureLoad[C: iu32, S: iu32](texture: texture_depth_multisampled_2d, coords: vec2<C>, sample_index: S) -> f32
+@must_use fn textureLoad[C: iu32](texture: texture_external, coords: vec2<C>) -> vec4<f32>
+@must_use fn textureLoad[C: iu32](texture: texture_storage_1d<f32_texel_format, readable>, coords: C) -> vec4<f32>
+@must_use fn textureLoad[C: iu32](texture: texture_storage_1d<i32_texel_format, readable>, coords: C) -> vec4<i32>
+@must_use fn textureLoad[C: iu32](texture: texture_storage_1d<u32_texel_format, readable>, coords: C) -> vec4<u32>
+@must_use fn textureLoad[C: iu32](texture: texture_storage_2d<f32_texel_format, readable>, coords: vec2<C>) -> vec4<f32>
+@must_use fn textureLoad[C: iu32](texture: texture_storage_2d<i32_texel_format, readable>, coords: vec2<C>) -> vec4<i32>
+@must_use fn textureLoad[C: iu32](texture: texture_storage_2d<u32_texel_format, readable>, coords: vec2<C>) -> vec4<u32>
+@must_use fn textureLoad[C: iu32, A: iu32](texture: texture_storage_2d_array<f32_texel_format, readable>, coords: vec2<C>, array_index: A) -> vec4<f32>
+@must_use fn textureLoad[C: iu32, A: iu32](texture: texture_storage_2d_array<i32_texel_format, readable>, coords: vec2<C>, array_index: A) -> vec4<i32>
+@must_use fn textureLoad[C: iu32, A: iu32](texture: texture_storage_2d_array<u32_texel_format, readable>, coords: vec2<C>, array_index: A) -> vec4<u32>
+@must_use fn textureLoad[C: iu32](texture: texture_storage_3d<f32_texel_format, readable>, coords: vec3<C>) -> vec4<f32>
+@must_use fn textureLoad[C: iu32](texture: texture_storage_3d<i32_texel_format, readable>, coords: vec3<C>) -> vec4<i32>
+@must_use fn textureLoad[C: iu32](texture: texture_storage_3d<u32_texel_format, readable>, coords: vec3<C>) -> vec4<u32>
 
-@stage("fragment", "compute") fn atomicLoad<T: iu32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>) -> T
-@stage("fragment", "compute") fn atomicStore<T: iu32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T)
-@stage("fragment", "compute") fn atomicAdd<T: iu32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T
-@stage("fragment", "compute") fn atomicSub<T: iu32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T
-@stage("fragment", "compute") fn atomicMax<T: iu32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T
-@stage("fragment", "compute") fn atomicMin<T: iu32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T
-@stage("fragment", "compute") fn atomicAnd<T: iu32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T
-@stage("fragment", "compute") fn atomicOr<T: iu32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T
-@stage("fragment", "compute") fn atomicXor<T: iu32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T
-@stage("fragment", "compute") fn atomicExchange<T: iu32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T
-@stage("fragment", "compute") fn atomicCompareExchangeWeak<T: iu32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T, T) -> __atomic_compare_exchange_result<T>
+@stage("fragment", "compute") fn atomicLoad[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>) -> T
+@stage("fragment", "compute") fn atomicStore[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, T)
+@stage("fragment", "compute") fn atomicAdd[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T
+@stage("fragment", "compute") fn atomicSub[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T
+@stage("fragment", "compute") fn atomicMax[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T
+@stage("fragment", "compute") fn atomicMin[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T
+@stage("fragment", "compute") fn atomicAnd[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T
+@stage("fragment", "compute") fn atomicOr[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T
+@stage("fragment", "compute") fn atomicXor[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T
+@stage("fragment", "compute") fn atomicExchange[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T
+@stage("fragment", "compute") fn atomicCompareExchangeWeak[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, T, T) -> __atomic_compare_exchange_result<T>
 
 @must_use @stage("compute") fn subgroupBallot() -> vec4<u32>
-@must_use @stage("compute") fn subgroupBroadcast<T: fiu32_f16>(value: T, @const sourceLaneIndex: u32) -> T
-@must_use @stage("compute") fn subgroupBroadcast<N: num, T: fiu32_f16>(value: vec<N, T>, @const sourceLaneIndex: u32) -> vec<N, T>
+@must_use @stage("compute") fn subgroupBroadcast[T: fiu32_f16](value: T, @const sourceLaneIndex: u32) -> T
+@must_use @stage("compute") fn subgroupBroadcast[N: num, T: fiu32_f16](value: vec<N, T>, @const sourceLaneIndex: u32) -> vec<N, T>
 
 ////////////////////////////////////////////////////////////////////////////////
 // Value constructors                                                         //
@@ -853,18 +853,18 @@
 @must_use @const("Zero") ctor f32() -> f32
 @must_use @const("Zero") ctor f16() -> f16
 @must_use @const("Zero") ctor bool() -> bool
-@must_use @const("Zero") ctor vec2<T: scalar>() -> vec2<T>
-@must_use @const("Zero") ctor vec3<T: scalar>() -> vec3<T>
-@must_use @const("Zero") ctor vec4<T: scalar>() -> vec4<T>
-@must_use @const("Zero") ctor mat2x2<T: f32_f16>() -> mat2x2<T>
-@must_use @const("Zero") ctor mat2x3<T: f32_f16>() -> mat2x3<T>
-@must_use @const("Zero") ctor mat2x4<T: f32_f16>() -> mat2x4<T>
-@must_use @const("Zero") ctor mat3x2<T: f32_f16>() -> mat3x2<T>
-@must_use @const("Zero") ctor mat3x3<T: f32_f16>() -> mat3x3<T>
-@must_use @const("Zero") ctor mat3x4<T: f32_f16>() -> mat3x4<T>
-@must_use @const("Zero") ctor mat4x2<T: f32_f16>() -> mat4x2<T>
-@must_use @const("Zero") ctor mat4x3<T: f32_f16>() -> mat4x3<T>
-@must_use @const("Zero") ctor mat4x4<T: f32_f16>() -> mat4x4<T>
+@must_use @const("Zero") ctor vec2[T: scalar]() -> vec2<T>
+@must_use @const("Zero") ctor vec3[T: scalar]() -> vec3<T>
+@must_use @const("Zero") ctor vec4[T: scalar]() -> vec4<T>
+@must_use @const("Zero") ctor mat2x2[T: f32_f16]() -> mat2x2<T>
+@must_use @const("Zero") ctor mat2x3[T: f32_f16]() -> mat2x3<T>
+@must_use @const("Zero") ctor mat2x4[T: f32_f16]() -> mat2x4<T>
+@must_use @const("Zero") ctor mat3x2[T: f32_f16]() -> mat3x2<T>
+@must_use @const("Zero") ctor mat3x3[T: f32_f16]() -> mat3x3<T>
+@must_use @const("Zero") ctor mat3x4[T: f32_f16]() -> mat3x4<T>
+@must_use @const("Zero") ctor mat4x2[T: f32_f16]() -> mat4x2<T>
+@must_use @const("Zero") ctor mat4x3[T: f32_f16]() -> mat4x3<T>
+@must_use @const("Zero") ctor mat4x4[T: f32_f16]() -> mat4x4<T>
 
 // Identity constructors
 @must_use @const("Identity") ctor i32(i32) -> i32
@@ -872,133 +872,133 @@
 @must_use @const("Identity") ctor f32(f32) -> f32
 @must_use @const("Identity") ctor f16(f16) -> f16
 @must_use @const("Identity") ctor bool(bool) -> bool
-@must_use @const("Identity") ctor vec2<T: scalar>(vec2<T>) -> vec2<T>
-@must_use @const("Identity") ctor vec3<T: scalar>(vec3<T>) -> vec3<T>
-@must_use @const("Identity") ctor vec4<T: scalar>(vec4<T>) -> vec4<T>
-@must_use @const("Identity") ctor mat2x2<T: f32_f16>(mat2x2<T>) -> mat2x2<T>
-@must_use @const("Identity") ctor mat2x3<T: f32_f16>(mat2x3<T>) -> mat2x3<T>
-@must_use @const("Identity") ctor mat2x4<T: f32_f16>(mat2x4<T>) -> mat2x4<T>
-@must_use @const("Identity") ctor mat3x2<T: f32_f16>(mat3x2<T>) -> mat3x2<T>
-@must_use @const("Identity") ctor mat3x3<T: f32_f16>(mat3x3<T>) -> mat3x3<T>
-@must_use @const("Identity") ctor mat3x4<T: f32_f16>(mat3x4<T>) -> mat3x4<T>
-@must_use @const("Identity") ctor mat4x2<T: f32_f16>(mat4x2<T>) -> mat4x2<T>
-@must_use @const("Identity") ctor mat4x3<T: f32_f16>(mat4x3<T>) -> mat4x3<T>
-@must_use @const("Identity") ctor mat4x4<T: f32_f16>(mat4x4<T>) -> mat4x4<T>
+@must_use @const("Identity") ctor vec2[T: scalar](vec2<T>) -> vec2<T>
+@must_use @const("Identity") ctor vec3[T: scalar](vec3<T>) -> vec3<T>
+@must_use @const("Identity") ctor vec4[T: scalar](vec4<T>) -> vec4<T>
+@must_use @const("Identity") ctor mat2x2[T: f32_f16](mat2x2<T>) -> mat2x2<T>
+@must_use @const("Identity") ctor mat2x3[T: f32_f16](mat2x3<T>) -> mat2x3<T>
+@must_use @const("Identity") ctor mat2x4[T: f32_f16](mat2x4<T>) -> mat2x4<T>
+@must_use @const("Identity") ctor mat3x2[T: f32_f16](mat3x2<T>) -> mat3x2<T>
+@must_use @const("Identity") ctor mat3x3[T: f32_f16](mat3x3<T>) -> mat3x3<T>
+@must_use @const("Identity") ctor mat3x4[T: f32_f16](mat3x4<T>) -> mat3x4<T>
+@must_use @const("Identity") ctor mat4x2[T: f32_f16](mat4x2<T>) -> mat4x2<T>
+@must_use @const("Identity") ctor mat4x3[T: f32_f16](mat4x3<T>) -> mat4x3<T>
+@must_use @const("Identity") ctor mat4x4[T: f32_f16](mat4x4<T>) -> mat4x4<T>
 
 // Vector constructors (splat)
-@must_use @const("VecSplat") ctor vec2<T: scalar>(T) -> vec2<T>
-@must_use @const("VecSplat") ctor vec3<T: scalar>(T) -> vec3<T>
-@must_use @const("VecSplat") ctor vec4<T: scalar>(T) -> vec4<T>
+@must_use @const("VecSplat") ctor vec2[T: scalar](T) -> vec2<T>
+@must_use @const("VecSplat") ctor vec3[T: scalar](T) -> vec3<T>
+@must_use @const("VecSplat") ctor vec4[T: scalar](T) -> vec4<T>
 
 // Vector constructors (scalar)
-@must_use @const("VecInitS") ctor vec2<T: scalar>(x: T, y: T) -> vec2<T>
-@must_use @const("VecInitS") ctor vec3<T: scalar>(x: T, y: T, z: T) -> vec3<T>
-@must_use @const("VecInitS") ctor vec4<T: scalar>(x: T, y: T, z: T, w: T) -> vec4<T>
+@must_use @const("VecInitS") ctor vec2[T: scalar](x: T, y: T) -> vec2<T>
+@must_use @const("VecInitS") ctor vec3[T: scalar](x: T, y: T, z: T) -> vec3<T>
+@must_use @const("VecInitS") ctor vec4[T: scalar](x: T, y: T, z: T, w: T) -> vec4<T>
 
 // Vector constructors (mixed)
-@must_use @const("VecInitM") ctor vec3<T: scalar>(xy: vec2<T>, z: T) -> vec3<T>
-@must_use @const("VecInitM") ctor vec3<T: scalar>(x: T, yz: vec2<T>) -> vec3<T>
-@must_use @const("VecInitM") ctor vec4<T: scalar>(xy: vec2<T>, z: T, w: T) -> vec4<T>
-@must_use @const("VecInitM") ctor vec4<T: scalar>(x: T, yz: vec2<T>, w: T) -> vec4<T>
-@must_use @const("VecInitM") ctor vec4<T: scalar>(x: T, y: T, zw: vec2<T>) -> vec4<T>
-@must_use @const("VecInitM") ctor vec4<T: scalar>(xy: vec2<T>, zw: vec2<T>) -> vec4<T>
-@must_use @const("VecInitM") ctor vec4<T: scalar>(xyz: vec3<T>, w: T) -> vec4<T>
-@must_use @const("VecInitM") ctor vec4<T: scalar>(x: T, zyw: vec3<T>) -> vec4<T>
+@must_use @const("VecInitM") ctor vec3[T: scalar](xy: vec2<T>, z: T) -> vec3<T>
+@must_use @const("VecInitM") ctor vec3[T: scalar](x: T, yz: vec2<T>) -> vec3<T>
+@must_use @const("VecInitM") ctor vec4[T: scalar](xy: vec2<T>, z: T, w: T) -> vec4<T>
+@must_use @const("VecInitM") ctor vec4[T: scalar](x: T, yz: vec2<T>, w: T) -> vec4<T>
+@must_use @const("VecInitM") ctor vec4[T: scalar](x: T, y: T, zw: vec2<T>) -> vec4<T>
+@must_use @const("VecInitM") ctor vec4[T: scalar](xy: vec2<T>, zw: vec2<T>) -> vec4<T>
+@must_use @const("VecInitM") ctor vec4[T: scalar](xyz: vec3<T>, w: T) -> vec4<T>
+@must_use @const("VecInitM") ctor vec4[T: scalar](x: T, zyw: vec3<T>) -> vec4<T>
 
 // Matrix constructors (scalar)
 @must_use @const("MatInitS")
-ctor mat2x2<T: f32_f16>(T, T,
+ctor mat2x2[T: f32_f16](T, T,
                         T, T) -> mat2x2<T>
 @must_use @const("MatInitS")
-ctor mat2x3<T: f32_f16>(T, T, T,
+ctor mat2x3[T: f32_f16](T, T, T,
                         T, T, T) -> mat2x3<T>
 @must_use @const("MatInitS")
-ctor mat2x4<T: f32_f16>(T, T, T, T,
+ctor mat2x4[T: f32_f16](T, T, T, T,
                         T, T, T, T) -> mat2x4<T>
 @must_use @const("MatInitS")
-ctor mat3x2<T: f32_f16>(T, T,
+ctor mat3x2[T: f32_f16](T, T,
                         T, T,
                         T, T) -> mat3x2<T>
 @must_use @const("MatInitS")
-ctor mat3x3<T: f32_f16>(T, T, T,
+ctor mat3x3[T: f32_f16](T, T, T,
                         T, T, T,
                         T, T, T) -> mat3x3<T>
 @must_use @const("MatInitS")
-ctor mat3x4<T: f32_f16>(T, T, T, T,
+ctor mat3x4[T: f32_f16](T, T, T, T,
                         T, T, T, T,
                         T, T, T, T) -> mat3x4<T>
 @must_use @const("MatInitS")
-ctor mat4x2<T: f32_f16>(T, T,
+ctor mat4x2[T: f32_f16](T, T,
                         T, T,
                         T, T,
                         T, T) -> mat4x2<T>
 @must_use @const("MatInitS")
-ctor mat4x3<T: f32_f16>(T, T, T,
+ctor mat4x3[T: f32_f16](T, T, T,
                         T, T, T,
                         T, T, T,
                         T, T, T) -> mat4x3<T>
 @must_use @const("MatInitS")
-ctor mat4x4<T: f32_f16>(T, T, T, T,
+ctor mat4x4[T: f32_f16](T, T, T, T,
                         T, T, T, T,
                         T, T, T, T,
                         T, T, T, T) -> mat4x4<T>
 
 // Matrix constructors (column vectors)
-@must_use @const("MatInitV") ctor mat2x2<T: f32_f16>(vec2<T>, vec2<T>) -> mat2x2<T>
-@must_use @const("MatInitV") ctor mat2x3<T: f32_f16>(vec3<T>, vec3<T>) -> mat2x3<T>
-@must_use @const("MatInitV") ctor mat2x4<T: f32_f16>(vec4<T>, vec4<T>) -> mat2x4<T>
-@must_use @const("MatInitV") ctor mat3x2<T: f32_f16>(vec2<T>, vec2<T>, vec2<T>) -> mat3x2<T>
-@must_use @const("MatInitV") ctor mat3x3<T: f32_f16>(vec3<T>, vec3<T>, vec3<T>) -> mat3x3<T>
-@must_use @const("MatInitV") ctor mat3x4<T: f32_f16>(vec4<T>, vec4<T>, vec4<T>) -> mat3x4<T>
-@must_use @const("MatInitV") ctor mat4x2<T: f32_f16>(vec2<T>, vec2<T>, vec2<T>, vec2<T>) -> mat4x2<T>
-@must_use @const("MatInitV") ctor mat4x3<T: f32_f16>(vec3<T>, vec3<T>, vec3<T>, vec3<T>) -> mat4x3<T>
-@must_use @const("MatInitV") ctor mat4x4<T: f32_f16>(vec4<T>, vec4<T>, vec4<T>, vec4<T>) -> mat4x4<T>
+@must_use @const("MatInitV") ctor mat2x2[T: f32_f16](vec2<T>, vec2<T>) -> mat2x2<T>
+@must_use @const("MatInitV") ctor mat2x3[T: f32_f16](vec3<T>, vec3<T>) -> mat2x3<T>
+@must_use @const("MatInitV") ctor mat2x4[T: f32_f16](vec4<T>, vec4<T>) -> mat2x4<T>
+@must_use @const("MatInitV") ctor mat3x2[T: f32_f16](vec2<T>, vec2<T>, vec2<T>) -> mat3x2<T>
+@must_use @const("MatInitV") ctor mat3x3[T: f32_f16](vec3<T>, vec3<T>, vec3<T>) -> mat3x3<T>
+@must_use @const("MatInitV") ctor mat3x4[T: f32_f16](vec4<T>, vec4<T>, vec4<T>) -> mat3x4<T>
+@must_use @const("MatInitV") ctor mat4x2[T: f32_f16](vec2<T>, vec2<T>, vec2<T>, vec2<T>) -> mat4x2<T>
+@must_use @const("MatInitV") ctor mat4x3[T: f32_f16](vec3<T>, vec3<T>, vec3<T>, vec3<T>) -> mat4x3<T>
+@must_use @const("MatInitV") ctor mat4x4[T: f32_f16](vec4<T>, vec4<T>, vec4<T>, vec4<T>) -> mat4x4<T>
 
 ////////////////////////////////////////////////////////////////////////////////
 // Value conversions                                                          //
 ////////////////////////////////////////////////////////////////////////////////
-@must_use @const conv f32<T: scalar_no_f32>(T) -> f32
-@must_use @const conv f16<T: scalar_no_f16>(T) -> f16
-@must_use @const conv i32<T: scalar_no_i32>(T) -> i32
-@must_use @const conv u32<T: scalar_no_u32>(T) -> u32
-@must_use @const conv bool<T: scalar_no_bool>(T) -> bool
+@must_use @const conv f32[T: scalar_no_f32](T) -> f32
+@must_use @const conv f16[T: scalar_no_f16](T) -> f16
+@must_use @const conv i32[T: scalar_no_i32](T) -> i32
+@must_use @const conv u32[T: scalar_no_u32](T) -> u32
+@must_use @const conv bool[T: scalar_no_bool](T) -> bool
 
-@must_use @const conv vec2<T: f32, U: scalar_no_f32>(vec2<U>) -> vec2<f32>
-@must_use @const conv vec2<T: f16, U: scalar_no_f16>(vec2<U>) -> vec2<f16>
-@must_use @const conv vec2<T: i32, U: scalar_no_i32>(vec2<U>) -> vec2<i32>
-@must_use @const conv vec2<T: u32, U: scalar_no_u32>(vec2<U>) -> vec2<u32>
-@must_use @const conv vec2<T: bool, U: scalar_no_bool>(vec2<U>) -> vec2<bool>
+@must_use @const conv vec2[T: f32, U: scalar_no_f32](vec2<U>) -> vec2<f32>
+@must_use @const conv vec2[T: f16, U: scalar_no_f16](vec2<U>) -> vec2<f16>
+@must_use @const conv vec2[T: i32, U: scalar_no_i32](vec2<U>) -> vec2<i32>
+@must_use @const conv vec2[T: u32, U: scalar_no_u32](vec2<U>) -> vec2<u32>
+@must_use @const conv vec2[T: bool, U: scalar_no_bool](vec2<U>) -> vec2<bool>
 
-@must_use @const conv vec3<T: f32, U: scalar_no_f32>(vec3<U>) -> vec3<f32>
-@must_use @const conv vec3<T: f16, U: scalar_no_f16>(vec3<U>) -> vec3<f16>
-@must_use @const conv vec3<T: i32, U: scalar_no_i32>(vec3<U>) -> vec3<i32>
-@must_use @const conv vec3<T: u32, U: scalar_no_u32>(vec3<U>) -> vec3<u32>
-@must_use @const conv vec3<T: bool, U: scalar_no_bool>(vec3<U>) -> vec3<bool>
+@must_use @const conv vec3[T: f32, U: scalar_no_f32](vec3<U>) -> vec3<f32>
+@must_use @const conv vec3[T: f16, U: scalar_no_f16](vec3<U>) -> vec3<f16>
+@must_use @const conv vec3[T: i32, U: scalar_no_i32](vec3<U>) -> vec3<i32>
+@must_use @const conv vec3[T: u32, U: scalar_no_u32](vec3<U>) -> vec3<u32>
+@must_use @const conv vec3[T: bool, U: scalar_no_bool](vec3<U>) -> vec3<bool>
 
-@must_use @const conv vec4<T: f32, U: scalar_no_f32>(vec4<U>) -> vec4<f32>
-@must_use @const conv vec4<T: f16, U: scalar_no_f16>(vec4<U>) -> vec4<f16>
-@must_use @const conv vec4<T: i32, U: scalar_no_i32>(vec4<U>) -> vec4<i32>
-@must_use @const conv vec4<T: u32, U: scalar_no_u32>(vec4<U>) -> vec4<u32>
-@must_use @const conv vec4<T: bool, U: scalar_no_bool>(vec4<U>) -> vec4<bool>
+@must_use @const conv vec4[T: f32, U: scalar_no_f32](vec4<U>) -> vec4<f32>
+@must_use @const conv vec4[T: f16, U: scalar_no_f16](vec4<U>) -> vec4<f16>
+@must_use @const conv vec4[T: i32, U: scalar_no_i32](vec4<U>) -> vec4<i32>
+@must_use @const conv vec4[T: u32, U: scalar_no_u32](vec4<U>) -> vec4<u32>
+@must_use @const conv vec4[T: bool, U: scalar_no_bool](vec4<U>) -> vec4<bool>
 
-@must_use @const conv mat2x2<T: f16>(mat2x2<f32>) -> mat2x2<f16>
-@must_use @const conv mat2x2<T: f32>(mat2x2<f16>) -> mat2x2<f32>
-@must_use @const conv mat2x3<T: f16>(mat2x3<f32>) -> mat2x3<f16>
-@must_use @const conv mat2x3<T: f32>(mat2x3<f16>) -> mat2x3<f32>
-@must_use @const conv mat2x4<T: f16>(mat2x4<f32>) -> mat2x4<f16>
-@must_use @const conv mat2x4<T: f32>(mat2x4<f16>) -> mat2x4<f32>
-@must_use @const conv mat3x2<T: f16>(mat3x2<f32>) -> mat3x2<f16>
-@must_use @const conv mat3x2<T: f32>(mat3x2<f16>) -> mat3x2<f32>
-@must_use @const conv mat3x3<T: f16>(mat3x3<f32>) -> mat3x3<f16>
-@must_use @const conv mat3x3<T: f32>(mat3x3<f16>) -> mat3x3<f32>
-@must_use @const conv mat3x4<T: f16>(mat3x4<f32>) -> mat3x4<f16>
-@must_use @const conv mat3x4<T: f32>(mat3x4<f16>) -> mat3x4<f32>
-@must_use @const conv mat4x2<T: f16>(mat4x2<f32>) -> mat4x2<f16>
-@must_use @const conv mat4x2<T: f32>(mat4x2<f16>) -> mat4x2<f32>
-@must_use @const conv mat4x3<T: f16>(mat4x3<f32>) -> mat4x3<f16>
-@must_use @const conv mat4x3<T: f32>(mat4x3<f16>) -> mat4x3<f32>
-@must_use @const conv mat4x4<T: f16>(mat4x4<f32>) -> mat4x4<f16>
-@must_use @const conv mat4x4<T: f32>(mat4x4<f16>) -> mat4x4<f32>
+@must_use @const conv mat2x2[T: f16](mat2x2<f32>) -> mat2x2<f16>
+@must_use @const conv mat2x2[T: f32](mat2x2<f16>) -> mat2x2<f32>
+@must_use @const conv mat2x3[T: f16](mat2x3<f32>) -> mat2x3<f16>
+@must_use @const conv mat2x3[T: f32](mat2x3<f16>) -> mat2x3<f32>
+@must_use @const conv mat2x4[T: f16](mat2x4<f32>) -> mat2x4<f16>
+@must_use @const conv mat2x4[T: f32](mat2x4<f16>) -> mat2x4<f32>
+@must_use @const conv mat3x2[T: f16](mat3x2<f32>) -> mat3x2<f16>
+@must_use @const conv mat3x2[T: f32](mat3x2<f16>) -> mat3x2<f32>
+@must_use @const conv mat3x3[T: f16](mat3x3<f32>) -> mat3x3<f16>
+@must_use @const conv mat3x3[T: f32](mat3x3<f16>) -> mat3x3<f32>
+@must_use @const conv mat3x4[T: f16](mat3x4<f32>) -> mat3x4<f16>
+@must_use @const conv mat3x4[T: f32](mat3x4<f16>) -> mat3x4<f32>
+@must_use @const conv mat4x2[T: f16](mat4x2<f32>) -> mat4x2<f16>
+@must_use @const conv mat4x2[T: f32](mat4x2<f16>) -> mat4x2<f32>
+@must_use @const conv mat4x3[T: f16](mat4x3<f32>) -> mat4x3<f16>
+@must_use @const conv mat4x3[T: f32](mat4x3<f16>) -> mat4x3<f32>
+@must_use @const conv mat4x4[T: f16](mat4x4<f32>) -> mat4x4<f16>
+@must_use @const conv mat4x4[T: f32](mat4x4<f16>) -> mat4x4<f32>
 
 ////////////////////////////////////////////////////////////////////////////////
 // Operators                                                                  //
@@ -1017,85 +1017,85 @@
 // Unary Operators                                                            //
 ////////////////////////////////////////////////////////////////////////////////
 @must_use @const op ! (bool) -> bool
-@must_use @const op ! <N: num> (vec<N, bool>) -> vec<N, bool>
+@must_use @const op ! [N: num](vec<N, bool>) -> vec<N, bool>
 
-@must_use @const op ~ <T: iu32>(T) -> T
-@must_use @const op ~ <T: iu32, N: num> (vec<N, T>) -> vec<N, T>
+@must_use @const op ~ [T: iu32](T) -> T
+@must_use @const op ~ [T: iu32, N: num](vec<N, T>) -> vec<N, T>
 
-@must_use @const("UnaryMinus") op - <T: fi32_f16>(T) -> T
-@must_use @const("UnaryMinus") op - <T: fi32_f16, N: num> (vec<N, T>) -> vec<N, T>
+@must_use @const("UnaryMinus") op - [T: fi32_f16](T) -> T
+@must_use @const("UnaryMinus") op - [T: fi32_f16, N: num](vec<N, T>) -> vec<N, T>
 
 ////////////////////////////////////////////////////////////////////////////////
 // Binary Operators                                                           //
 ////////////////////////////////////////////////////////////////////////////////
-@must_use @const op + <T: fiu32_f16>(T, T) -> T
-@must_use @const op + <T: fiu32_f16, N: num> (vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const op + <T: fiu32_f16, N: num> (vec<N, T>, T) -> vec<N, T>
-@must_use @const op + <T: fiu32_f16, N: num> (T, vec<N, T>) -> vec<N, T>
-@must_use @const op + <T: f32_f16, N: num, M: num> (mat<N, M, T>, mat<N, M, T>) -> mat<N, M, T>
+@must_use @const op + [T: fiu32_f16](T, T) -> T
+@must_use @const op + [T: fiu32_f16, N: num](vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const op + [T: fiu32_f16, N: num](vec<N, T>, T) -> vec<N, T>
+@must_use @const op + [T: fiu32_f16, N: num](T, vec<N, T>) -> vec<N, T>
+@must_use @const op + [T: f32_f16, N: num, M: num](mat<N, M, T>, mat<N, M, T>) -> mat<N, M, T>
 
-@must_use @const op - <T: fiu32_f16>(T, T) -> T
-@must_use @const op - <T: fiu32_f16, N: num> (vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const op - <T: fiu32_f16, N: num> (vec<N, T>, T) -> vec<N, T>
-@must_use @const op - <T: fiu32_f16, N: num> (T, vec<N, T>) -> vec<N, T>
-@must_use @const op - <T: f32_f16, N: num, M: num> (mat<N, M, T>, mat<N, M, T>) -> mat<N, M, T>
+@must_use @const op - [T: fiu32_f16](T, T) -> T
+@must_use @const op - [T: fiu32_f16, N: num](vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const op - [T: fiu32_f16, N: num](vec<N, T>, T) -> vec<N, T>
+@must_use @const op - [T: fiu32_f16, N: num](T, vec<N, T>) -> vec<N, T>
+@must_use @const op - [T: f32_f16, N: num, M: num](mat<N, M, T>, mat<N, M, T>) -> mat<N, M, T>
 
-@must_use @const("Multiply") op * <T: fiu32_f16>(T, T) -> T
-@must_use @const("Multiply") op * <T: fiu32_f16, N: num> (vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const("Multiply") op * <T: fiu32_f16, N: num> (vec<N, T>, T) -> vec<N, T>
-@must_use @const("Multiply") op * <T: fiu32_f16, N: num> (T, vec<N, T>) -> vec<N, T>
-@must_use @const("Multiply") op * <T: f32_f16, N: num, M: num> (T, mat<N, M, T>) -> mat<N, M, T>
-@must_use @const("Multiply") op * <T: f32_f16, N: num, M: num> (mat<N, M, T>, T) -> mat<N, M, T>
-@must_use @const("MultiplyMatVec") op * <T: f32_f16, C: num, R: num> (mat<C, R, T>, vec<C, T>) -> vec<R, T>
-@must_use @const("MultiplyVecMat") op * <T: f32_f16, C: num, R: num> (vec<R, T>, mat<C, R, T>) -> vec<C, T>
-@must_use @const("MultiplyMatMat") op * <T: f32_f16, K: num, C: num, R: num> (mat<K, R, T>, mat<C, K, T>) -> mat<C, R, T>
+@must_use @const("Multiply") op * [T: fiu32_f16](T, T) -> T
+@must_use @const("Multiply") op * [T: fiu32_f16, N: num](vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const("Multiply") op * [T: fiu32_f16, N: num](vec<N, T>, T) -> vec<N, T>
+@must_use @const("Multiply") op * [T: fiu32_f16, N: num](T, vec<N, T>) -> vec<N, T>
+@must_use @const("Multiply") op * [T: f32_f16, N: num, M: num](T, mat<N, M, T>) -> mat<N, M, T>
+@must_use @const("Multiply") op * [T: f32_f16, N: num, M: num](mat<N, M, T>, T) -> mat<N, M, T>
+@must_use @const("MultiplyMatVec") op * [T: f32_f16, C: num, R: num](mat<C, R, T>, vec<C, T>) -> vec<R, T>
+@must_use @const("MultiplyVecMat") op * [T: f32_f16, C: num, R: num](vec<R, T>, mat<C, R, T>) -> vec<C, T>
+@must_use @const("MultiplyMatMat") op * [T: f32_f16, K: num, C: num, R: num](mat<K, R, T>, mat<C, K, T>) -> mat<C, R, T>
 
-@must_use @const op / <T: fiu32_f16>(T, T) -> T
-@must_use @const op / <T: fiu32_f16, N: num> (vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const op / <T: fiu32_f16, N: num> (vec<N, T>, T) -> vec<N, T>
-@must_use @const op / <T: fiu32_f16, N: num> (T, vec<N, T>) -> vec<N, T>
+@must_use @const op / [T: fiu32_f16](T, T) -> T
+@must_use @const op / [T: fiu32_f16, N: num](vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const op / [T: fiu32_f16, N: num](vec<N, T>, T) -> vec<N, T>
+@must_use @const op / [T: fiu32_f16, N: num](T, vec<N, T>) -> vec<N, T>
 
-@must_use @const op % <T: fiu32_f16>(T, T) -> T
-@must_use @const op % <T: fiu32_f16, N: num> (vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const op % <T: fiu32_f16, N: num> (vec<N, T>, T) -> vec<N, T>
-@must_use @const op % <T: fiu32_f16, N: num> (T, vec<N, T>) -> vec<N, T>
+@must_use @const op % [T: fiu32_f16](T, T) -> T
+@must_use @const op % [T: fiu32_f16, N: num](vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const op % [T: fiu32_f16, N: num](vec<N, T>, T) -> vec<N, T>
+@must_use @const op % [T: fiu32_f16, N: num](T, vec<N, T>) -> vec<N, T>
 
-@must_use @const op ^ <T: iu32>(T, T) -> T
-@must_use @const op ^ <T: iu32, N: num> (vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const op ^ [T: iu32](T, T) -> T
+@must_use @const op ^ [T: iu32, N: num](vec<N, T>, vec<N, T>) -> vec<N, T>
 
 @must_use @const op & (bool, bool) -> bool
-@must_use @const op & <N: num> (vec<N, bool>, vec<N, bool>) -> vec<N, bool>
-@must_use @const op & <T: iu32>(T, T) -> T
-@must_use @const op & <T: iu32, N: num> (vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const op & [N: num](vec<N, bool>, vec<N, bool>) -> vec<N, bool>
+@must_use @const op & [T: iu32](T, T) -> T
+@must_use @const op & [T: iu32, N: num](vec<N, T>, vec<N, T>) -> vec<N, T>
 
 @must_use @const op | (bool, bool) -> bool
-@must_use @const op | <N: num> (vec<N, bool>, vec<N, bool>) -> vec<N, bool>
-@must_use @const op | <T: iu32>(T, T) -> T
-@must_use @const op | <T: iu32, N: num> (vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const op | [N: num](vec<N, bool>, vec<N, bool>) -> vec<N, bool>
+@must_use @const op | [T: iu32](T, T) -> T
+@must_use @const op | [T: iu32, N: num](vec<N, T>, vec<N, T>) -> vec<N, T>
 
 @must_use @const op && (bool, bool) -> bool
 @must_use @const op || (bool, bool) -> bool
 
-@must_use @const op == <T: scalar>(T, T) -> bool
-@must_use @const op == <T: scalar, N: num> (vec<N, T>, vec<N, T>) -> vec<N, bool>
+@must_use @const op == [T: scalar](T, T) -> bool
+@must_use @const op == [T: scalar, N: num](vec<N, T>, vec<N, T>) -> vec<N, bool>
 
-@must_use @const op != <T: scalar>(T, T) -> bool
-@must_use @const op != <T: scalar, N: num> (vec<N, T>, vec<N, T>) -> vec<N, bool>
+@must_use @const op != [T: scalar](T, T) -> bool
+@must_use @const op != [T: scalar, N: num](vec<N, T>, vec<N, T>) -> vec<N, bool>
 
-@must_use @const op < <T: fiu32_f16>(T, T) -> bool
-@must_use @const op < <T: fiu32_f16, N: num> (vec<N, T>, vec<N, T>) -> vec<N, bool>
+@must_use @const op < [T: fiu32_f16](T, T) -> bool
+@must_use @const op < [T: fiu32_f16, N: num](vec<N, T>, vec<N, T>) -> vec<N, bool>
 
-@must_use @const op > <T: fiu32_f16>(T, T) -> bool
-@must_use @const op > <T: fiu32_f16, N: num> (vec<N, T>, vec<N, T>) -> vec<N, bool>
+@must_use @const op > [T: fiu32_f16](T, T) -> bool
+@must_use @const op > [T: fiu32_f16, N: num](vec<N, T>, vec<N, T>) -> vec<N, bool>
 
-@must_use @const op <= <T: fiu32_f16>(T, T) -> bool
-@must_use @const op <= <T: fiu32_f16, N: num> (vec<N, T>, vec<N, T>) -> vec<N, bool>
+@must_use @const op <= [T: fiu32_f16](T, T) -> bool
+@must_use @const op <= [T: fiu32_f16, N: num](vec<N, T>, vec<N, T>) -> vec<N, bool>
 
-@must_use @const op >= <T: fiu32_f16>(T, T) -> bool
-@must_use @const op >= <T: fiu32_f16, N: num> (vec<N, T>, vec<N, T>) -> vec<N, bool>
+@must_use @const op >= [T: fiu32_f16](T, T) -> bool
+@must_use @const op >= [T: fiu32_f16, N: num](vec<N, T>, vec<N, T>) -> vec<N, bool>
 
-@must_use @const op << <T: iu32>(T, u32) -> T
-@must_use @const op << <T: iu32, N: num> (vec<N, T>, vec<N, u32>) -> vec<N, T>
+@must_use @const op << [T: iu32](T, u32) -> T
+@must_use @const op << [T: iu32, N: num](vec<N, T>, vec<N, u32>) -> vec<N, T>
 
-@must_use @const op >> <T: iu32>(T, u32) -> T
-@must_use @const op >> <T: iu32, N: num> (vec<N, T>, vec<N, u32>) -> vec<N, T>
+@must_use @const op >> [T: iu32](T, u32) -> T
+@must_use @const op >> [T: iu32, N: num](vec<N, T>, vec<N, u32>) -> vec<N, T>
diff --git a/src/tint/lang/spirv/spirv.def b/src/tint/lang/spirv/spirv.def
index a5b3dcd..29d7e21 100644
--- a/src/tint/lang/spirv/spirv.def
+++ b/src/tint/lang/spirv/spirv.def
@@ -123,191 +123,191 @@
 ////////////////////////////////////////////////////////////////////////////////
 // Builtin Functions                                                          //
 ////////////////////////////////////////////////////////////////////////////////
-fn array_length<I: u32, A: access>(ptr<storage, struct_with_runtime_array, A>, I) -> u32
+fn array_length[I: u32, A: access](ptr<storage, struct_with_runtime_array, A>, I) -> u32
 
-@stage("fragment", "compute") fn atomic_and<T: iu32, U: u32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, T) -> T
-@stage("fragment", "compute") fn atomic_compare_exchange<T: iu32, U: u32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, U, T, T) -> T
-@stage("fragment", "compute") fn atomic_exchange<T: iu32, U: u32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, T) -> T
-@stage("fragment", "compute") fn atomic_iadd<T: iu32, U: u32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, T) -> T
-@stage("fragment", "compute") fn atomic_isub<T: iu32, U: u32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, T) -> T
-@stage("fragment", "compute") fn atomic_load<T: iu32, U: u32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U) -> T
-@stage("fragment", "compute") fn atomic_or<T: iu32, U: u32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, T) -> T
-@stage("fragment", "compute") fn atomic_smax<T: iu32, U: u32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, T) -> T
-@stage("fragment", "compute") fn atomic_smin<T: iu32, U: u32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, T) -> T
-@stage("fragment", "compute") fn atomic_store<T: iu32, U: u32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, T)
-@stage("fragment", "compute") fn atomic_umax<T: iu32, U: u32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, T) -> T
-@stage("fragment", "compute") fn atomic_umin<T: iu32, U: u32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, T) -> T
-@stage("fragment", "compute") fn atomic_xor<T: iu32, U: u32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, T) -> T
+@stage("fragment", "compute") fn atomic_and[T: iu32, U: u32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, U, U, T) -> T
+@stage("fragment", "compute") fn atomic_compare_exchange[T: iu32, U: u32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, U, U, U, T, T) -> T
+@stage("fragment", "compute") fn atomic_exchange[T: iu32, U: u32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, U, U, T) -> T
+@stage("fragment", "compute") fn atomic_iadd[T: iu32, U: u32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, U, U, T) -> T
+@stage("fragment", "compute") fn atomic_isub[T: iu32, U: u32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, U, U, T) -> T
+@stage("fragment", "compute") fn atomic_load[T: iu32, U: u32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, U, U) -> T
+@stage("fragment", "compute") fn atomic_or[T: iu32, U: u32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, U, U, T) -> T
+@stage("fragment", "compute") fn atomic_smax[T: iu32, U: u32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, U, U, T) -> T
+@stage("fragment", "compute") fn atomic_smin[T: iu32, U: u32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, U, U, T) -> T
+@stage("fragment", "compute") fn atomic_store[T: iu32, U: u32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, U, U, T)
+@stage("fragment", "compute") fn atomic_umax[T: iu32, U: u32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, U, U, T) -> T
+@stage("fragment", "compute") fn atomic_umin[T: iu32, U: u32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, U, U, T) -> T
+@stage("fragment", "compute") fn atomic_xor[T: iu32, U: u32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, U, U, T) -> T
 
-fn dot<N: num, T: f32_f16>(vec<N, T>, vec<N, T>) -> T
+fn dot[N: num, T: f32_f16](vec<N, T>, vec<N, T>) -> T
 
-fn image_dref_gather<A: f32, B: iu32>(sampled_image<texture_depth_2d>, vec2<f32>, A, B) -> vec4<f32>
-fn image_dref_gather<A: f32, B: iu32, C: iu32>(sampled_image<texture_depth_2d>, vec2<f32>, A, B, vec2<C>) -> vec4<f32>
-fn image_dref_gather<A: f32, B: iu32>(sampled_image<texture_depth_2d_array>, vec3<f32>, A, B) -> vec4<f32>
-fn image_dref_gather<A: f32, B: iu32, C: iu32>(sampled_image<texture_depth_2d_array>, vec3<f32>, A, B, vec2<C>) -> vec4<f32>
-fn image_dref_gather<A: f32, B: iu32>(sampled_image<texture_depth_cube>, vec3<f32>, A, B) -> vec4<f32>
-fn image_dref_gather<A: f32, B: iu32>(sampled_image<texture_depth_cube_array>, vec4<f32>, A, B) -> vec4<f32>
+fn image_dref_gather[A: f32, B: iu32](sampled_image<texture_depth_2d>, vec2<f32>, A, B) -> vec4<f32>
+fn image_dref_gather[A: f32, B: iu32, C: iu32](sampled_image<texture_depth_2d>, vec2<f32>, A, B, vec2<C>) -> vec4<f32>
+fn image_dref_gather[A: f32, B: iu32](sampled_image<texture_depth_2d_array>, vec3<f32>, A, B) -> vec4<f32>
+fn image_dref_gather[A: f32, B: iu32, C: iu32](sampled_image<texture_depth_2d_array>, vec3<f32>, A, B, vec2<C>) -> vec4<f32>
+fn image_dref_gather[A: f32, B: iu32](sampled_image<texture_depth_cube>, vec3<f32>, A, B) -> vec4<f32>
+fn image_dref_gather[A: f32, B: iu32](sampled_image<texture_depth_cube_array>, vec4<f32>, A, B) -> vec4<f32>
 
-fn image_fetch<T: fiu32, C: iu32, I: iu32, S: iu32>(texture_1d<T>, C, I, S) -> vec4<T>
-fn image_fetch<T: fiu32, C: iu32, I: iu32, S: iu32>(texture_2d<T>, vec2<C>, I, S) -> vec4<T>
-fn image_fetch<T: fiu32, C: iu32, I: iu32, S: iu32>(texture_2d_array<T>, vec3<C>, I, S) -> vec4<T>
-fn image_fetch<T: fiu32, C: iu32, I: iu32, S: iu32>(texture_3d<T>, vec3<C>, I, S) -> vec4<T>
-fn image_fetch<T: fiu32, C: iu32, I: iu32, S: iu32>(texture_multisampled_2d<T>, vec2<C>, I, S) -> vec4<T>
-fn image_fetch<I: iu32, C: iu32, S: iu32>(texture_depth_2d, vec2<C>, I, S) -> vec4<f32>
-fn image_fetch<I: iu32, C: iu32, S: iu32>(texture_depth_2d_array, vec3<C>, I, S) -> vec4<f32>
-fn image_fetch<I: iu32, C: iu32, S: iu32>(texture_depth_multisampled_2d, vec2<C>, I, S) -> vec4<f32>
+fn image_fetch[T: fiu32, C: iu32, I: iu32, S: iu32](texture_1d<T>, C, I, S) -> vec4<T>
+fn image_fetch[T: fiu32, C: iu32, I: iu32, S: iu32](texture_2d<T>, vec2<C>, I, S) -> vec4<T>
+fn image_fetch[T: fiu32, C: iu32, I: iu32, S: iu32](texture_2d_array<T>, vec3<C>, I, S) -> vec4<T>
+fn image_fetch[T: fiu32, C: iu32, I: iu32, S: iu32](texture_3d<T>, vec3<C>, I, S) -> vec4<T>
+fn image_fetch[T: fiu32, C: iu32, I: iu32, S: iu32](texture_multisampled_2d<T>, vec2<C>, I, S) -> vec4<T>
+fn image_fetch[I: iu32, C: iu32, S: iu32](texture_depth_2d, vec2<C>, I, S) -> vec4<f32>
+fn image_fetch[I: iu32, C: iu32, S: iu32](texture_depth_2d_array, vec3<C>, I, S) -> vec4<f32>
+fn image_fetch[I: iu32, C: iu32, S: iu32](texture_depth_multisampled_2d, vec2<C>, I, S) -> vec4<f32>
 
-fn image_gather<T: fiu32, A: iu32, B: iu32>(sampled_image<texture_1d<T> >, vec2<f32>, A, B) -> vec4<T>
-fn image_gather<T: fiu32, A: iu32, B: iu32>(sampled_image<texture_2d<T> >, vec2<f32>, A, B) -> vec4<T>
-fn image_gather<T: fiu32, A: iu32, B: iu32>(sampled_image<texture_2d<T> >, vec2<f32>, A, B, vec2<i32>) -> vec4<T>
-fn image_gather<T: fiu32, A: iu32, B: iu32>(sampled_image<texture_2d_array<T> >, vec3<f32>, A, B) -> vec4<T>
-fn image_gather<T: fiu32, A: iu32, B: iu32, C: iu32>(sampled_image<texture_2d_array<T> >, vec3<f32>, A, B, vec2<C>) -> vec4<T>
-fn image_gather<T: fiu32, A: iu32, B: iu32>(sampled_image<texture_3d<T> >, vec2<f32>, A, B) -> vec4<T>
-fn image_gather<T: fiu32, A: iu32, B: iu32>(sampled_image<texture_cube<T> >, vec3<f32>, A, B) -> vec4<T>
-fn image_gather<T: fiu32, A: iu32, B: iu32>(sampled_image<texture_cube_array<T> >, vec4<f32>, A, B) -> vec4<T>
-fn image_gather<A: iu32, B: iu32>(sampled_image<texture_depth_2d>, vec2<f32>, A, B) -> vec4<f32>
-fn image_gather<A: iu32, B: iu32, C: iu32>(sampled_image<texture_depth_2d>, vec2<f32>, A, B, vec2<C>) -> vec4<f32>
-fn image_gather<A: iu32, B: iu32>(sampled_image<texture_depth_2d_array>, vec3<f32>, A, B) -> vec4<f32>
-fn image_gather<A: iu32, B: iu32, C: iu32>(sampled_image<texture_depth_2d_array>, vec3<f32>, A, B, vec2<C>) -> vec4<f32>
-fn image_gather<A: iu32, B: iu32>(sampled_image<texture_depth_cube>, vec3<f32>, A, B) -> vec4<f32>
-fn image_gather<A: iu32, B: iu32>(sampled_image<texture_depth_cube_array>, vec4<f32>, A, B) -> vec4<f32>
+fn image_gather[T: fiu32, A: iu32, B: iu32](sampled_image<texture_1d<T> >, vec2<f32>, A, B) -> vec4<T>
+fn image_gather[T: fiu32, A: iu32, B: iu32](sampled_image<texture_2d<T> >, vec2<f32>, A, B) -> vec4<T>
+fn image_gather[T: fiu32, A: iu32, B: iu32](sampled_image<texture_2d<T> >, vec2<f32>, A, B, vec2<i32>) -> vec4<T>
+fn image_gather[T: fiu32, A: iu32, B: iu32](sampled_image<texture_2d_array<T> >, vec3<f32>, A, B) -> vec4<T>
+fn image_gather[T: fiu32, A: iu32, B: iu32, C: iu32](sampled_image<texture_2d_array<T> >, vec3<f32>, A, B, vec2<C>) -> vec4<T>
+fn image_gather[T: fiu32, A: iu32, B: iu32](sampled_image<texture_3d<T> >, vec2<f32>, A, B) -> vec4<T>
+fn image_gather[T: fiu32, A: iu32, B: iu32](sampled_image<texture_cube<T> >, vec3<f32>, A, B) -> vec4<T>
+fn image_gather[T: fiu32, A: iu32, B: iu32](sampled_image<texture_cube_array<T> >, vec4<f32>, A, B) -> vec4<T>
+fn image_gather[A: iu32, B: iu32](sampled_image<texture_depth_2d>, vec2<f32>, A, B) -> vec4<f32>
+fn image_gather[A: iu32, B: iu32, C: iu32](sampled_image<texture_depth_2d>, vec2<f32>, A, B, vec2<C>) -> vec4<f32>
+fn image_gather[A: iu32, B: iu32](sampled_image<texture_depth_2d_array>, vec3<f32>, A, B) -> vec4<f32>
+fn image_gather[A: iu32, B: iu32, C: iu32](sampled_image<texture_depth_2d_array>, vec3<f32>, A, B, vec2<C>) -> vec4<f32>
+fn image_gather[A: iu32, B: iu32](sampled_image<texture_depth_cube>, vec3<f32>, A, B) -> vec4<f32>
+fn image_gather[A: iu32, B: iu32](sampled_image<texture_depth_cube_array>, vec4<f32>, A, B) -> vec4<f32>
 
-fn image_query_size<T: fiu32>(texture_1d<T>) -> u32
-fn image_query_size<T: fiu32>(texture_2d<T>) -> vec2<u32>
-fn image_query_size<T: fiu32>(texture_2d_array<T>) -> vec3<u32>
-fn image_query_size<T: fiu32>(texture_3d<T>) -> vec3<u32>
-fn image_query_size<T: fiu32>(texture_cube<T>) -> vec2<u32>
-fn image_query_size<T: fiu32>(texture_cube_array<T>) -> vec3<u32>
-fn image_query_size<T: fiu32>(texture_multisampled_2d<T>) -> vec2<u32>
+fn image_query_size[T: fiu32](texture_1d<T>) -> u32
+fn image_query_size[T: fiu32](texture_2d<T>) -> vec2<u32>
+fn image_query_size[T: fiu32](texture_2d_array<T>) -> vec3<u32>
+fn image_query_size[T: fiu32](texture_3d<T>) -> vec3<u32>
+fn image_query_size[T: fiu32](texture_cube<T>) -> vec2<u32>
+fn image_query_size[T: fiu32](texture_cube_array<T>) -> vec3<u32>
+fn image_query_size[T: fiu32](texture_multisampled_2d<T>) -> vec2<u32>
 fn image_query_size(texture_depth_2d) -> vec2<u32>
 fn image_query_size(texture_depth_2d_array) -> vec3<u32>
 fn image_query_size(texture_depth_cube) -> vec2<u32>
 fn image_query_size(texture_depth_cube_array) -> vec3<u32>
 fn image_query_size(texture_depth_multisampled_2d) -> vec2<u32>
-fn image_query_size<F: texel_format, A: access>(texture_storage_1d<F, A>) -> u32
-fn image_query_size<F: texel_format, A: access>(texture_storage_2d<F, A>) -> vec2<u32>
-fn image_query_size<F: texel_format, A: access>(texture_storage_2d_array<F, A>) -> vec3<u32>
-fn image_query_size<F: texel_format, A: access>(texture_storage_3d<F, A>) -> vec3<u32>
+fn image_query_size[F: texel_format, A: access](texture_storage_1d<F, A>) -> u32
+fn image_query_size[F: texel_format, A: access](texture_storage_2d<F, A>) -> vec2<u32>
+fn image_query_size[F: texel_format, A: access](texture_storage_2d_array<F, A>) -> vec3<u32>
+fn image_query_size[F: texel_format, A: access](texture_storage_3d<F, A>) -> vec3<u32>
 
-fn image_query_size_lod<T: fiu32, A: iu32>(texture_1d<T>, A) -> u32
-fn image_query_size_lod<T: fiu32, A: iu32>(texture_2d<T>, A) -> vec2<u32>
-fn image_query_size_lod<T: fiu32, A: iu32>(texture_2d_array<T>, A) -> vec3<u32>
-fn image_query_size_lod<T: fiu32, A: iu32>(texture_3d<T>, A) -> vec3<u32>
-fn image_query_size_lod<T: fiu32, A: iu32>(texture_cube<T>, A) -> vec2<u32>
-fn image_query_size_lod<T: fiu32, A: iu32>(texture_cube_array<T>, A) -> vec3<u32>
-fn image_query_size_lod<A: iu32>(texture_depth_2d, A) -> vec2<u32>
-fn image_query_size_lod<A: iu32>(texture_depth_2d_array, A) -> vec3<u32>
-fn image_query_size_lod<A: iu32>(texture_depth_cube, A) -> vec2<u32>
-fn image_query_size_lod<A: iu32>(texture_depth_cube_array, A) -> vec3<u32>
+fn image_query_size_lod[T: fiu32, A: iu32](texture_1d<T>, A) -> u32
+fn image_query_size_lod[T: fiu32, A: iu32](texture_2d<T>, A) -> vec2<u32>
+fn image_query_size_lod[T: fiu32, A: iu32](texture_2d_array<T>, A) -> vec3<u32>
+fn image_query_size_lod[T: fiu32, A: iu32](texture_3d<T>, A) -> vec3<u32>
+fn image_query_size_lod[T: fiu32, A: iu32](texture_cube<T>, A) -> vec2<u32>
+fn image_query_size_lod[T: fiu32, A: iu32](texture_cube_array<T>, A) -> vec3<u32>
+fn image_query_size_lod[A: iu32](texture_depth_2d, A) -> vec2<u32>
+fn image_query_size_lod[A: iu32](texture_depth_2d_array, A) -> vec3<u32>
+fn image_query_size_lod[A: iu32](texture_depth_cube, A) -> vec2<u32>
+fn image_query_size_lod[A: iu32](texture_depth_cube_array, A) -> vec3<u32>
 
-fn image_read<F: f32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_1d<F, A>, C, S) -> vec4<f32>
-fn image_read<F: i32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_1d<F, A>, C, S) -> vec4<i32>
-fn image_read<F: u32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_1d<F, A>, C, S) -> vec4<u32>
-fn image_read<F: f32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_2d<F, A>, vec2<C>, S) -> vec4<f32>
-fn image_read<F: i32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_2d<F, A>, vec2<C>, S) -> vec4<i32>
-fn image_read<F: u32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_2d<F, A>, vec2<C>, S) -> vec4<u32>
-fn image_read<F: f32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_2d_array<F, A>, vec3<C>, S) -> vec4<f32>
-fn image_read<F: i32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_2d_array<F, A>, vec3<C>, S) -> vec4<i32>
-fn image_read<F: u32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_2d_array<F, A>, vec3<C>, S) -> vec4<u32>
-fn image_read<F: f32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_3d<F, A>, vec3<C>, S) -> vec4<f32>
-fn image_read<F: i32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_3d<F, A>, vec3<C>, S) -> vec4<i32>
-fn image_read<F: u32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_3d<F, A>, vec3<C>, S) -> vec4<u32>
+fn image_read[F: f32_texel_format, A: readable, C: iu32, S: iu32](texture_storage_1d<F, A>, C, S) -> vec4<f32>
+fn image_read[F: i32_texel_format, A: readable, C: iu32, S: iu32](texture_storage_1d<F, A>, C, S) -> vec4<i32>
+fn image_read[F: u32_texel_format, A: readable, C: iu32, S: iu32](texture_storage_1d<F, A>, C, S) -> vec4<u32>
+fn image_read[F: f32_texel_format, A: readable, C: iu32, S: iu32](texture_storage_2d<F, A>, vec2<C>, S) -> vec4<f32>
+fn image_read[F: i32_texel_format, A: readable, C: iu32, S: iu32](texture_storage_2d<F, A>, vec2<C>, S) -> vec4<i32>
+fn image_read[F: u32_texel_format, A: readable, C: iu32, S: iu32](texture_storage_2d<F, A>, vec2<C>, S) -> vec4<u32>
+fn image_read[F: f32_texel_format, A: readable, C: iu32, S: iu32](texture_storage_2d_array<F, A>, vec3<C>, S) -> vec4<f32>
+fn image_read[F: i32_texel_format, A: readable, C: iu32, S: iu32](texture_storage_2d_array<F, A>, vec3<C>, S) -> vec4<i32>
+fn image_read[F: u32_texel_format, A: readable, C: iu32, S: iu32](texture_storage_2d_array<F, A>, vec3<C>, S) -> vec4<u32>
+fn image_read[F: f32_texel_format, A: readable, C: iu32, S: iu32](texture_storage_3d<F, A>, vec3<C>, S) -> vec4<f32>
+fn image_read[F: i32_texel_format, A: readable, C: iu32, S: iu32](texture_storage_3d<F, A>, vec3<C>, S) -> vec4<i32>
+fn image_read[F: u32_texel_format, A: readable, C: iu32, S: iu32](texture_storage_3d<F, A>, vec3<C>, S) -> vec4<u32>
 
-fn image_sample_implicit_lod<T: fiu32, C: iu32>(sampled_image<texture_1d<T> >, f32, C) -> vec4<f32>
-fn image_sample_implicit_lod<T: fiu32, C: iu32>(sampled_image<texture_2d<T> >, vec2<f32>, C) -> vec4<f32>
-fn image_sample_implicit_lod<T: fiu32, C: iu32>(sampled_image<texture_2d<T> >, vec2<f32>, C, f32) -> vec4<f32>
-fn image_sample_implicit_lod<T: fiu32, C: iu32, D: iu32>(sampled_image<texture_2d<T> >, vec2<f32>, C, f32, vec2<D>) -> vec4<f32>
-fn image_sample_implicit_lod<T: fiu32, C: iu32, D: iu32>(sampled_image<texture_2d<T> >, vec2<f32>, C, vec2<D>) -> vec4<f32>
-fn image_sample_implicit_lod<T: fiu32, C: iu32>(sampled_image<texture_2d_array<T> >, vec3<f32>, C) -> vec4<f32>
-fn image_sample_implicit_lod<T: fiu32, C: iu32>(sampled_image<texture_2d_array<T> >, vec3<f32>, C, f32) -> vec4<f32>
-fn image_sample_implicit_lod<T: fiu32, C: iu32, D: iu32>(sampled_image<texture_2d_array<T> >, vec3<f32>, C, vec2<D>) -> vec4<f32>
-fn image_sample_implicit_lod<T: fiu32, C: iu32, D: iu32>(sampled_image<texture_2d_array<T> >, vec3<f32>, C, f32, vec2<D>) -> vec4<f32>
-fn image_sample_implicit_lod<T: fiu32, C: iu32>(sampled_image<texture_3d<T> >, vec3<f32>, C) -> vec4<f32>
-fn image_sample_implicit_lod<T: fiu32, C: iu32>(sampled_image<texture_3d<T> >, vec3<f32>, C, f32) -> vec4<f32>
-fn image_sample_implicit_lod<T: fiu32, C: iu32, D: iu32>(sampled_image<texture_3d<T> >, vec3<f32>, C, f32, vec3<D>) -> vec4<f32>
-fn image_sample_implicit_lod<T: fiu32, C: iu32, D: iu32>(sampled_image<texture_3d<T> >, vec3<f32>, C, vec3<D>) -> vec4<f32>
-fn image_sample_implicit_lod<T: fiu32, C: iu32>(sampled_image<texture_cube<T> >, vec3<f32>, C) -> vec4<f32>
-fn image_sample_implicit_lod<T: fiu32, C: iu32>(sampled_image<texture_cube<T> >, vec3<f32>, C, f32) -> vec4<f32>
-fn image_sample_implicit_lod<T: fiu32, C: iu32>(sampled_image<texture_cube_array<T> >, vec4<f32>, C) -> vec4<f32>
-fn image_sample_implicit_lod<T: fiu32, C: iu32>(sampled_image<texture_cube_array<T> >, vec4<f32>, C, f32) -> vec4<f32>
-fn image_sample_implicit_lod<C: iu32>(sampled_image<texture_depth_2d>, vec2<f32>, C) -> vec4<f32>
-fn image_sample_implicit_lod<C: iu32, D: iu32>(sampled_image<texture_depth_2d>, vec2<f32>, C, vec2<D>) -> vec4<f32>
-fn image_sample_implicit_lod<C: iu32>(sampled_image<texture_depth_cube>, vec3<f32>, C) -> vec4<f32>
-fn image_sample_implicit_lod<C: iu32>(sampled_image<texture_depth_2d_array>, vec3<f32>, C) -> vec4<f32>
-fn image_sample_implicit_lod<C: iu32, D: iu32>(sampled_image<texture_depth_2d_array>, vec3<f32>, C, vec2<D>) -> vec4<f32>
-fn image_sample_implicit_lod<C: iu32>(sampled_image<texture_depth_cube_array>, vec4<f32>, C) -> vec4<f32>
+fn image_sample_implicit_lod[T: fiu32, C: iu32](sampled_image<texture_1d<T> >, f32, C) -> vec4<f32>
+fn image_sample_implicit_lod[T: fiu32, C: iu32](sampled_image<texture_2d<T> >, vec2<f32>, C) -> vec4<f32>
+fn image_sample_implicit_lod[T: fiu32, C: iu32](sampled_image<texture_2d<T> >, vec2<f32>, C, f32) -> vec4<f32>
+fn image_sample_implicit_lod[T: fiu32, C: iu32, D: iu32](sampled_image<texture_2d<T> >, vec2<f32>, C, f32, vec2<D>) -> vec4<f32>
+fn image_sample_implicit_lod[T: fiu32, C: iu32, D: iu32](sampled_image<texture_2d<T> >, vec2<f32>, C, vec2<D>) -> vec4<f32>
+fn image_sample_implicit_lod[T: fiu32, C: iu32](sampled_image<texture_2d_array<T> >, vec3<f32>, C) -> vec4<f32>
+fn image_sample_implicit_lod[T: fiu32, C: iu32](sampled_image<texture_2d_array<T> >, vec3<f32>, C, f32) -> vec4<f32>
+fn image_sample_implicit_lod[T: fiu32, C: iu32, D: iu32](sampled_image<texture_2d_array<T> >, vec3<f32>, C, vec2<D>) -> vec4<f32>
+fn image_sample_implicit_lod[T: fiu32, C: iu32, D: iu32](sampled_image<texture_2d_array<T> >, vec3<f32>, C, f32, vec2<D>) -> vec4<f32>
+fn image_sample_implicit_lod[T: fiu32, C: iu32](sampled_image<texture_3d<T> >, vec3<f32>, C) -> vec4<f32>
+fn image_sample_implicit_lod[T: fiu32, C: iu32](sampled_image<texture_3d<T> >, vec3<f32>, C, f32) -> vec4<f32>
+fn image_sample_implicit_lod[T: fiu32, C: iu32, D: iu32](sampled_image<texture_3d<T> >, vec3<f32>, C, f32, vec3<D>) -> vec4<f32>
+fn image_sample_implicit_lod[T: fiu32, C: iu32, D: iu32](sampled_image<texture_3d<T> >, vec3<f32>, C, vec3<D>) -> vec4<f32>
+fn image_sample_implicit_lod[T: fiu32, C: iu32](sampled_image<texture_cube<T> >, vec3<f32>, C) -> vec4<f32>
+fn image_sample_implicit_lod[T: fiu32, C: iu32](sampled_image<texture_cube<T> >, vec3<f32>, C, f32) -> vec4<f32>
+fn image_sample_implicit_lod[T: fiu32, C: iu32](sampled_image<texture_cube_array<T> >, vec4<f32>, C) -> vec4<f32>
+fn image_sample_implicit_lod[T: fiu32, C: iu32](sampled_image<texture_cube_array<T> >, vec4<f32>, C, f32) -> vec4<f32>
+fn image_sample_implicit_lod[C: iu32](sampled_image<texture_depth_2d>, vec2<f32>, C) -> vec4<f32>
+fn image_sample_implicit_lod[C: iu32, D: iu32](sampled_image<texture_depth_2d>, vec2<f32>, C, vec2<D>) -> vec4<f32>
+fn image_sample_implicit_lod[C: iu32](sampled_image<texture_depth_cube>, vec3<f32>, C) -> vec4<f32>
+fn image_sample_implicit_lod[C: iu32](sampled_image<texture_depth_2d_array>, vec3<f32>, C) -> vec4<f32>
+fn image_sample_implicit_lod[C: iu32, D: iu32](sampled_image<texture_depth_2d_array>, vec3<f32>, C, vec2<D>) -> vec4<f32>
+fn image_sample_implicit_lod[C: iu32](sampled_image<texture_depth_cube_array>, vec4<f32>, C) -> vec4<f32>
 
-fn image_sample_explicit_lod<T: fiu32, C: iu32>(sampled_image<texture_2d<T> >, vec2<f32>, C, f32) -> vec4<f32>
-fn image_sample_explicit_lod<T: fiu32, C: iu32>(sampled_image<texture_2d<T> >, vec2<f32>, C, vec2<f32>, vec2<f32>) -> vec4<f32>
-fn image_sample_explicit_lod<T: fiu32, C: iu32, D: iu32>(sampled_image<texture_2d<T> >, vec2<f32>, C, f32, vec2<D>) -> vec4<f32>
-fn image_sample_explicit_lod<T: fiu32, C: iu32, D: iu32>(sampled_image<texture_2d<T> >, vec2<f32>, C, vec2<f32>, vec2<D>) -> vec4<f32>
-fn image_sample_explicit_lod<T: fiu32, C: iu32, D: iu32>(sampled_image<texture_2d<T> >, vec2<f32>, C, vec2<f32>, vec2<f32>, vec2<D>) -> vec4<f32>
-fn image_sample_explicit_lod<T: fiu32, C: iu32>(sampled_image<texture_2d_array<T> >, vec3<f32>, C, f32) -> vec4<f32>
-fn image_sample_explicit_lod<T: fiu32, C: iu32>(sampled_image<texture_2d_array<T> >, vec3<f32>, C, vec2<f32>, vec2<f32>) -> vec4<f32>
-fn image_sample_explicit_lod<T: fiu32, C: iu32, D: iu32>(sampled_image<texture_2d_array<T> >, vec3<f32>, C, f32, vec2<D>) -> vec4<f32>
-fn image_sample_explicit_lod<T: fiu32, C: iu32, D: iu32>(sampled_image<texture_2d_array<T> >, vec3<f32>, C, vec2<f32>, vec2<f32>, vec2<D>) -> vec4<f32>
-fn image_sample_explicit_lod<T: fiu32, C: iu32>(sampled_image<texture_3d<T> >, vec3<f32>, C, f32) -> vec4<f32>
-fn image_sample_explicit_lod<T: fiu32, C: iu32>(sampled_image<texture_3d<T> >, vec3<f32>, C, vec3<f32>, vec3<f32>) -> vec4<f32>
-fn image_sample_explicit_lod<T: fiu32, C: iu32, D: iu32>(sampled_image<texture_3d<T> >, vec3<f32>, C, f32, vec3<D>) -> vec4<f32>
-fn image_sample_explicit_lod<T: fiu32, C: iu32, D: iu32>(sampled_image<texture_3d<T> >, vec3<f32>, C, vec3<f32>, vec3<f32>, vec3<D>) -> vec4<f32>
-fn image_sample_explicit_lod<T: fiu32, C: iu32>(sampled_image<texture_cube<T> >, vec3<f32>, C, f32) -> vec4<f32>
-fn image_sample_explicit_lod<T: fiu32, C: iu32>(sampled_image<texture_cube<T> >, vec3<f32>, C, vec3<f32>, vec3<f32>) -> vec4<f32>
-fn image_sample_explicit_lod<T: fiu32, C: iu32>(sampled_image<texture_cube_array<T> >, vec4<f32>, C, f32) -> vec4<f32>
-fn image_sample_explicit_lod<T: fiu32, C: iu32>(sampled_image<texture_cube_array<T> >, vec4<f32>, C, vec3<f32>, vec3<f32>) -> vec4<f32>
-fn image_sample_explicit_lod<C: iu32>(sampled_image<texture_depth_2d>, vec2<f32>, C, f32) -> vec4<f32>
-fn image_sample_explicit_lod<C: iu32, D: iu32>(sampled_image<texture_depth_2d>, vec2<f32>, C, f32, vec2<D>) -> vec4<f32>
-fn image_sample_explicit_lod<C: iu32>(sampled_image<texture_depth_2d_array>, vec3<f32>, C, f32) -> vec4<f32>
-fn image_sample_explicit_lod<C: iu32, D: iu32>(sampled_image<texture_depth_2d_array>, vec3<f32>, C, f32, vec2<D>) -> vec4<f32>
-fn image_sample_explicit_lod<C: iu32>(sampled_image<texture_depth_cube>, vec3<f32>, C, f32) -> vec4<f32>
-fn image_sample_explicit_lod<C: iu32>(sampled_image<texture_depth_cube_array>, vec4<f32>, C, f32) -> vec4<f32>
+fn image_sample_explicit_lod[T: fiu32, C: iu32](sampled_image<texture_2d<T> >, vec2<f32>, C, f32) -> vec4<f32>
+fn image_sample_explicit_lod[T: fiu32, C: iu32](sampled_image<texture_2d<T> >, vec2<f32>, C, vec2<f32>, vec2<f32>) -> vec4<f32>
+fn image_sample_explicit_lod[T: fiu32, C: iu32, D: iu32](sampled_image<texture_2d<T> >, vec2<f32>, C, f32, vec2<D>) -> vec4<f32>
+fn image_sample_explicit_lod[T: fiu32, C: iu32, D: iu32](sampled_image<texture_2d<T> >, vec2<f32>, C, vec2<f32>, vec2<D>) -> vec4<f32>
+fn image_sample_explicit_lod[T: fiu32, C: iu32, D: iu32](sampled_image<texture_2d<T> >, vec2<f32>, C, vec2<f32>, vec2<f32>, vec2<D>) -> vec4<f32>
+fn image_sample_explicit_lod[T: fiu32, C: iu32](sampled_image<texture_2d_array<T> >, vec3<f32>, C, f32) -> vec4<f32>
+fn image_sample_explicit_lod[T: fiu32, C: iu32](sampled_image<texture_2d_array<T> >, vec3<f32>, C, vec2<f32>, vec2<f32>) -> vec4<f32>
+fn image_sample_explicit_lod[T: fiu32, C: iu32, D: iu32](sampled_image<texture_2d_array<T> >, vec3<f32>, C, f32, vec2<D>) -> vec4<f32>
+fn image_sample_explicit_lod[T: fiu32, C: iu32, D: iu32](sampled_image<texture_2d_array<T> >, vec3<f32>, C, vec2<f32>, vec2<f32>, vec2<D>) -> vec4<f32>
+fn image_sample_explicit_lod[T: fiu32, C: iu32](sampled_image<texture_3d<T> >, vec3<f32>, C, f32) -> vec4<f32>
+fn image_sample_explicit_lod[T: fiu32, C: iu32](sampled_image<texture_3d<T> >, vec3<f32>, C, vec3<f32>, vec3<f32>) -> vec4<f32>
+fn image_sample_explicit_lod[T: fiu32, C: iu32, D: iu32](sampled_image<texture_3d<T> >, vec3<f32>, C, f32, vec3<D>) -> vec4<f32>
+fn image_sample_explicit_lod[T: fiu32, C: iu32, D: iu32](sampled_image<texture_3d<T> >, vec3<f32>, C, vec3<f32>, vec3<f32>, vec3<D>) -> vec4<f32>
+fn image_sample_explicit_lod[T: fiu32, C: iu32](sampled_image<texture_cube<T> >, vec3<f32>, C, f32) -> vec4<f32>
+fn image_sample_explicit_lod[T: fiu32, C: iu32](sampled_image<texture_cube<T> >, vec3<f32>, C, vec3<f32>, vec3<f32>) -> vec4<f32>
+fn image_sample_explicit_lod[T: fiu32, C: iu32](sampled_image<texture_cube_array<T> >, vec4<f32>, C, f32) -> vec4<f32>
+fn image_sample_explicit_lod[T: fiu32, C: iu32](sampled_image<texture_cube_array<T> >, vec4<f32>, C, vec3<f32>, vec3<f32>) -> vec4<f32>
+fn image_sample_explicit_lod[C: iu32](sampled_image<texture_depth_2d>, vec2<f32>, C, f32) -> vec4<f32>
+fn image_sample_explicit_lod[C: iu32, D: iu32](sampled_image<texture_depth_2d>, vec2<f32>, C, f32, vec2<D>) -> vec4<f32>
+fn image_sample_explicit_lod[C: iu32](sampled_image<texture_depth_2d_array>, vec3<f32>, C, f32) -> vec4<f32>
+fn image_sample_explicit_lod[C: iu32, D: iu32](sampled_image<texture_depth_2d_array>, vec3<f32>, C, f32, vec2<D>) -> vec4<f32>
+fn image_sample_explicit_lod[C: iu32](sampled_image<texture_depth_cube>, vec3<f32>, C, f32) -> vec4<f32>
+fn image_sample_explicit_lod[C: iu32](sampled_image<texture_depth_cube_array>, vec4<f32>, C, f32) -> vec4<f32>
 
-fn image_sample_dref_implicit_lod<C: iu32>(sampled_image<texture_depth_2d>, vec2<f32>, f32, C) -> f32
-fn image_sample_dref_implicit_lod<C: iu32, D: iu32>(sampled_image<texture_depth_2d>, vec2<f32>, f32, C, vec2<D>) -> f32
-fn image_sample_dref_implicit_lod<C: iu32>(sampled_image<texture_depth_2d_array>, vec3<f32>, f32, C) -> f32
-fn image_sample_dref_implicit_lod<C: iu32, D: iu32>(sampled_image<texture_depth_2d_array>, vec3<f32>, f32, C, vec2<D>) -> f32
-fn image_sample_dref_implicit_lod<C: iu32>(sampled_image<texture_depth_cube>, vec3<f32>, f32, C) -> f32
-fn image_sample_dref_implicit_lod<C: iu32>(sampled_image<texture_depth_cube_array>, vec4<f32>, f32, C) -> f32
+fn image_sample_dref_implicit_lod[C: iu32](sampled_image<texture_depth_2d>, vec2<f32>, f32, C) -> f32
+fn image_sample_dref_implicit_lod[C: iu32, D: iu32](sampled_image<texture_depth_2d>, vec2<f32>, f32, C, vec2<D>) -> f32
+fn image_sample_dref_implicit_lod[C: iu32](sampled_image<texture_depth_2d_array>, vec3<f32>, f32, C) -> f32
+fn image_sample_dref_implicit_lod[C: iu32, D: iu32](sampled_image<texture_depth_2d_array>, vec3<f32>, f32, C, vec2<D>) -> f32
+fn image_sample_dref_implicit_lod[C: iu32](sampled_image<texture_depth_cube>, vec3<f32>, f32, C) -> f32
+fn image_sample_dref_implicit_lod[C: iu32](sampled_image<texture_depth_cube_array>, vec4<f32>, f32, C) -> f32
 
-fn image_sample_dref_explicit_lod<C: iu32>(sampled_image<texture_depth_2d>, vec2<f32>, f32, C, f32) -> f32
-fn image_sample_dref_explicit_lod<C: iu32, D: iu32>(sampled_image<texture_depth_2d>, vec2<f32>, f32, C, f32, vec2<D>) -> f32
-fn image_sample_dref_explicit_lod<C: iu32>(sampled_image<texture_depth_2d_array>, vec3<f32>, f32, C, f32) -> f32
-fn image_sample_dref_explicit_lod<C: iu32, D: iu32>(sampled_image<texture_depth_2d_array>, vec3<f32>, f32, C, f32, vec2<D>) -> f32
-fn image_sample_dref_explicit_lod<C: iu32>(sampled_image<texture_depth_cube>, vec3<f32>, f32, C, f32) -> f32
-fn image_sample_dref_explicit_lod<C: iu32>(sampled_image<texture_depth_cube_array>, vec4<f32>, f32, C, f32) -> f32
+fn image_sample_dref_explicit_lod[C: iu32](sampled_image<texture_depth_2d>, vec2<f32>, f32, C, f32) -> f32
+fn image_sample_dref_explicit_lod[C: iu32, D: iu32](sampled_image<texture_depth_2d>, vec2<f32>, f32, C, f32, vec2<D>) -> f32
+fn image_sample_dref_explicit_lod[C: iu32](sampled_image<texture_depth_2d_array>, vec3<f32>, f32, C, f32) -> f32
+fn image_sample_dref_explicit_lod[C: iu32, D: iu32](sampled_image<texture_depth_2d_array>, vec3<f32>, f32, C, f32, vec2<D>) -> f32
+fn image_sample_dref_explicit_lod[C: iu32](sampled_image<texture_depth_cube>, vec3<f32>, f32, C, f32) -> f32
+fn image_sample_dref_explicit_lod[C: iu32](sampled_image<texture_depth_cube_array>, vec4<f32>, f32, C, f32) -> f32
 
-fn image_write<C: iu32, D: iu32>(texture_storage_1d<f32_texel_format, writable>, C, vec4<f32>, D)
-fn image_write<C: iu32, D: iu32>(texture_storage_1d<i32_texel_format, writable>, C, vec4<i32>, D)
-fn image_write<C: iu32, D: iu32>(texture_storage_1d<u32_texel_format, writable>, C, vec4<u32>, D)
-fn image_write<C: iu32, D: iu32>(texture_storage_2d<f32_texel_format, writable>, vec2<C>, vec4<f32>, D)
-fn image_write<C: iu32, D: iu32>(texture_storage_2d<i32_texel_format, writable>, vec2<C>, vec4<i32>, D)
-fn image_write<C: iu32, D: iu32>(texture_storage_2d<u32_texel_format, writable>, vec2<C>, vec4<u32>, D)
-fn image_write<C: iu32, D: iu32>(texture_storage_2d_array<f32_texel_format, writable>, vec3<C>, vec4<f32>, D)
-fn image_write<C: iu32, D: iu32>(texture_storage_2d_array<i32_texel_format, writable>, vec3<C>, vec4<i32>, D)
-fn image_write<C: iu32, D: iu32>(texture_storage_2d_array<u32_texel_format, writable>, vec3<C>, vec4<u32>, D)
-fn image_write<C: iu32, D: iu32>(texture_storage_3d<f32_texel_format, writable>, vec3<C>, vec4<f32>, D)
-fn image_write<C: iu32, D: iu32>(texture_storage_3d<i32_texel_format, writable>, vec3<C>, vec4<i32>, D)
-fn image_write<C: iu32, D: iu32>(texture_storage_3d<u32_texel_format, writable>, vec3<C>, vec4<u32>, D)
+fn image_write[C: iu32, D: iu32](texture_storage_1d<f32_texel_format, writable>, C, vec4<f32>, D)
+fn image_write[C: iu32, D: iu32](texture_storage_1d<i32_texel_format, writable>, C, vec4<i32>, D)
+fn image_write[C: iu32, D: iu32](texture_storage_1d<u32_texel_format, writable>, C, vec4<u32>, D)
+fn image_write[C: iu32, D: iu32](texture_storage_2d<f32_texel_format, writable>, vec2<C>, vec4<f32>, D)
+fn image_write[C: iu32, D: iu32](texture_storage_2d<i32_texel_format, writable>, vec2<C>, vec4<i32>, D)
+fn image_write[C: iu32, D: iu32](texture_storage_2d<u32_texel_format, writable>, vec2<C>, vec4<u32>, D)
+fn image_write[C: iu32, D: iu32](texture_storage_2d_array<f32_texel_format, writable>, vec3<C>, vec4<f32>, D)
+fn image_write[C: iu32, D: iu32](texture_storage_2d_array<i32_texel_format, writable>, vec3<C>, vec4<i32>, D)
+fn image_write[C: iu32, D: iu32](texture_storage_2d_array<u32_texel_format, writable>, vec3<C>, vec4<u32>, D)
+fn image_write[C: iu32, D: iu32](texture_storage_3d<f32_texel_format, writable>, vec3<C>, vec4<f32>, D)
+fn image_write[C: iu32, D: iu32](texture_storage_3d<i32_texel_format, writable>, vec3<C>, vec4<i32>, D)
+fn image_write[C: iu32, D: iu32](texture_storage_3d<u32_texel_format, writable>, vec3<C>, vec4<u32>, D)
 
-fn matrix_times_matrix<T: f32_f16, K: num, C: num, R: num>(mat<K, R, T>, mat<C, K, T>) -> mat<C, R, T>
-fn matrix_times_scalar<T: f32_f16, N: num, M: num>(mat<N, M, T>, T) -> mat<N, M, T>
-fn matrix_times_vector<T: f32_f16, N: num, M: num>(mat<N, M, T>, vec<N, T>) -> vec<M, T>
+fn matrix_times_matrix[T: f32_f16, K: num, C: num, R: num](mat<K, R, T>, mat<C, K, T>) -> mat<C, R, T>
+fn matrix_times_scalar[T: f32_f16, N: num, M: num](mat<N, M, T>, T) -> mat<N, M, T>
+fn matrix_times_vector[T: f32_f16, N: num, M: num](mat<N, M, T>, vec<N, T>) -> vec<M, T>
 
-fn sampled_image<T: fiu32, S: samplers>(texture_1d<T>, S) -> sampled_image<texture_1d<T> >
-fn sampled_image<T: fiu32, S: samplers>(texture_2d<T>, S) -> sampled_image<texture_2d<T> >
-fn sampled_image<T: fiu32, S: samplers>(texture_2d_array<T>, S) -> sampled_image<texture_2d_array<T> >
-fn sampled_image<T: fiu32, S: samplers>(texture_3d<T>, S) -> sampled_image<texture_3d<T> >
-fn sampled_image<T: fiu32, S: samplers>(texture_cube<T>, S) -> sampled_image<texture_cube<T> >
-fn sampled_image<T: fiu32, S: samplers>(texture_cube_array<T>, S) -> sampled_image<texture_cube_array<T> >
-fn sampled_image<S: samplers>(texture_depth_2d, S) -> sampled_image<texture_depth_2d>
-fn sampled_image<S: samplers>(texture_depth_2d_array, S) -> sampled_image<texture_depth_2d_array>
-fn sampled_image<S: samplers>(texture_depth_cube, S) -> sampled_image<texture_depth_cube>
-fn sampled_image<S: samplers>(texture_depth_cube_array, S) -> sampled_image<texture_depth_cube_array>
+fn sampled_image[T: fiu32, S: samplers](texture_1d<T>, S) -> sampled_image<texture_1d<T> >
+fn sampled_image[T: fiu32, S: samplers](texture_2d<T>, S) -> sampled_image<texture_2d<T> >
+fn sampled_image[T: fiu32, S: samplers](texture_2d_array<T>, S) -> sampled_image<texture_2d_array<T> >
+fn sampled_image[T: fiu32, S: samplers](texture_3d<T>, S) -> sampled_image<texture_3d<T> >
+fn sampled_image[T: fiu32, S: samplers](texture_cube<T>, S) -> sampled_image<texture_cube<T> >
+fn sampled_image[T: fiu32, S: samplers](texture_cube_array<T>, S) -> sampled_image<texture_cube_array<T> >
+fn sampled_image[S: samplers](texture_depth_2d, S) -> sampled_image<texture_depth_2d>
+fn sampled_image[S: samplers](texture_depth_2d_array, S) -> sampled_image<texture_depth_2d_array>
+fn sampled_image[S: samplers](texture_depth_cube, S) -> sampled_image<texture_depth_cube>
+fn sampled_image[S: samplers](texture_depth_cube_array, S) -> sampled_image<texture_depth_cube_array>
 
-fn select<T: scalar>(bool, T, T) -> T
-fn select<N: num, T: scalar>(vec<N, bool>, vec<N, T>, vec<N, T>) -> vec<N, T>
+fn select[T: scalar](bool, T, T) -> T
+fn select[N: num, T: scalar](vec<N, bool>, vec<N, T>, vec<N, T>) -> vec<N, T>
 
-fn vector_times_matrix<T: f32_f16, N: num, M: num>(vec<N, T>, mat<M, N, T>) -> vec<M, T>
-fn vector_times_scalar<T: f32_f16, N: num>(vec<N, T>, T) -> vec<N, T>
+fn vector_times_matrix[T: f32_f16, N: num, M: num](vec<N, T>, mat<M, N, T>) -> vec<M, T>
+fn vector_times_scalar[T: f32_f16, N: num](vec<N, T>, T) -> vec<N, T>
 
 ////////////////////////////////////////////////////////////////////////////////
 // SPV_KHR_integer_dot_product instructions
diff --git a/src/tint/lang/wgsl/wgsl.def b/src/tint/lang/wgsl/wgsl.def
index 33f2038..f3ef635 100644
--- a/src/tint/lang/wgsl/wgsl.def
+++ b/src/tint/lang/wgsl/wgsl.def
@@ -261,7 +261,7 @@
 //                                                                            //
 // * Template type example without constraint:                                //
 //                                                                            //
-//    fn arrayLength<T>(array<T>) -> u32                                      //
+//    fn arrayLength[T](array<T>) -> u32                                      //
 //                                                                            //
 //    Declares an overload of the function 'arrayLength' that accepts a       //
 //    single argument of an array type with no constraints on the array       //
@@ -270,7 +270,7 @@
 //                                                                            //
 // * Template type example with constraint:                                   //
 //                                                                            //
-//    fn abs<T: fiu32>(T) -> T                                                //
+//    fn abs[T: fiu32](T) -> T                                                //
 //                                                                            //
 //    Declares an overload of the function 'abs' that accepts a single        //
 //    argument of type 'f32', 'i32' or 'u32', which returns a value of the    //
@@ -281,7 +281,7 @@
 //                                                                            //
 // * Template number example:                                                 //
 //                                                                            //
-//    fn dpdx<N: num>(vec<N, f32>) -> vec<N, f32>                             //
+//    fn dpdx[N: num](vec<N, f32>) -> vec<N, f32>                             //
 //                                                                            //
 //    Declares an overload of the function 'dpdx' that accepts a single       //
 //    argument of a variable-sized vector of 'f32', which returns a value of  //
@@ -315,7 +315,7 @@
 // To better understand, let's consider the following hypothetical overload   //
 // declaration:                                                               //
 //                                                                            //
-//    fn foo<T: scalar>(T, T);                                                //
+//    fn foo[T: scalar](T, T);                                                //
 //                                                                            //
 //    T           - is the template type name                                 //
 //    scalar      - is a matcher for the types 'f32', 'i32', 'u32' or 'bool'  //
@@ -386,21 +386,21 @@
 //       Note: Parameter names are used by Tint to infer parameter order for  //
 //       some builtin functions                                               //
 //                                                                            //
-//   fn F<T>(T)                                                               //
+//   fn F[T](T)                                                               //
 //     - Single parameter of unconstrained template type T (any type)         //
 //                                                                            //
-//   fn F<T: scalar>(T)                                                       //
+//   fn F[T: scalar](T)                                                       //
 //     - Single parameter of constrained template type T (must be a scalar)   //
 //                                                                            //
-//   fn F<T: fiu32>(T) -> T                                                   //
+//   fn F[T: fiu32](T) -> T                                                   //
 //     - Single parameter of constrained template type T (must be a one of    //
 //       fiu32) Return type matches parameter type                            //
 //                                                                            //
-//   fn F<T, N: num>(vec<N, T>)                                               //
+//   fn F[T, N: num](vec<N, T>)                                               //
 //     - Single parameter of vector type with template number size N and      //
 //       element template type T                                              //
 //                                                                            //
-//   fn F<A: access>(texture_storage_1d<f32_texel_format, A>)                 //
+//   fn F[A: access](texture_storage_1d<f32_texel_format, A>)                 //
 //     - Single parameter of texture_storage_1d type with template number     //
 //       access-control C, and of a texel format that is listed in            //
 //       f32_texel_format                                                     //
@@ -408,109 +408,109 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 // https://gpuweb.github.io/gpuweb/wgsl/#builtin-functions
-@must_use @const fn abs<T: fia_fiu32_f16>(T) -> T
-@must_use @const fn abs<N: num, T: fia_fiu32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn acos<T: fa_f32_f16>(@test_value(0.96891242171) T) -> T
-@must_use @const fn acos<N: num, T: fa_f32_f16>(@test_value(0.96891242171) vec<N, T>) -> vec<N, T>
-@must_use @const fn acosh<T: fa_f32_f16>(@test_value(1.5430806348) T) -> T
-@must_use @const fn acosh<N: num, T: fa_f32_f16>(@test_value(1.5430806348) vec<N, T>) -> vec<N, T>
+@must_use @const fn abs[T: fia_fiu32_f16](T) -> T
+@must_use @const fn abs[N: num, T: fia_fiu32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn acos[T: fa_f32_f16](@test_value(0.96891242171) T) -> T
+@must_use @const fn acos[N: num, T: fa_f32_f16](@test_value(0.96891242171) vec<N, T>) -> vec<N, T>
+@must_use @const fn acosh[T: fa_f32_f16](@test_value(1.5430806348) T) -> T
+@must_use @const fn acosh[N: num, T: fa_f32_f16](@test_value(1.5430806348) vec<N, T>) -> vec<N, T>
 @must_use @const fn all(bool) -> bool
-@must_use @const fn all<N: num>(vec<N, bool>) -> bool
+@must_use @const fn all[N: num](vec<N, bool>) -> bool
 @must_use @const fn any(bool) -> bool
-@must_use @const fn any<N: num>(vec<N, bool>) -> bool
-@must_use fn arrayLength<T, A: access>(ptr<storage, array<T>, A>) -> u32
-@must_use @const fn asin<T: fa_f32_f16>(@test_value(0.479425538604) T) -> T
-@must_use @const fn asin<N: num, T: fa_f32_f16>(@test_value(0.479425538604) vec<N, T>) -> vec<N, T>
-@must_use @const fn asinh<T: fa_f32_f16>(T) -> T
-@must_use @const fn asinh<N: num, T: fa_f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn atan<T: fa_f32_f16>(T) -> T
-@must_use @const fn atan<N: num, T: fa_f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn atan2<T: fa_f32_f16>(T, T) -> T
-@must_use @const fn atan2<T: fa_f32_f16, N: num>(vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const fn atanh<T: fa_f32_f16>(@test_value(0.5) T) -> T
-@must_use @const fn atanh<N: num, T: fa_f32_f16>(@test_value(0.5) vec<N, T>) -> vec<N, T>
-@must_use @const fn ceil<T: fa_f32_f16>(@test_value(1.5) T) -> T
-@must_use @const fn ceil<N: num, T: fa_f32_f16>(@test_value(1.5) vec<N, T>) -> vec<N, T>
-@must_use @const fn clamp<T: fia_fiu32_f16>(T, T, T) -> T
-@must_use @const fn clamp<T: fia_fiu32_f16, N: num>(vec<N, T>, vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const fn cos<T: fa_f32_f16>(@test_value(0) T) -> T
-@must_use @const fn cos<N: num, T: fa_f32_f16>(@test_value(0) vec<N, T>) -> vec<N, T>
-@must_use @const fn cosh<T: fa_f32_f16>(@test_value(0) T) -> T
-@must_use @const fn cosh<N: num, T: fa_f32_f16>(@test_value(0) vec<N, T>) -> vec<N, T>
-@must_use @const fn countLeadingZeros<T: iu32>(T) -> T
-@must_use @const fn countLeadingZeros<N: num, T: iu32>(vec<N, T>) -> vec<N, T>
-@must_use @const fn countOneBits<T: iu32>(T) -> T
-@must_use @const fn countOneBits<N: num, T: iu32>(vec<N, T>) -> vec<N, T>
-@must_use @const fn countTrailingZeros<T: iu32>(T) -> T
-@must_use @const fn countTrailingZeros<N: num, T: iu32>(vec<N, T>) -> vec<N, T>
-@must_use @const fn cross<T: fa_f32_f16>(vec3<T>, vec3<T>) -> vec3<T>
-@must_use @const fn degrees<T: fa_f32_f16>(T) -> T
-@must_use @const fn degrees<N: num, T: fa_f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn determinant<N: num, T: fa_f32_f16>(mat<N, N, T>) -> T
-@must_use @const fn distance<T: fa_f32_f16>(T, T) -> T
-@must_use @const fn distance<N: num, T: fa_f32_f16>(vec<N, T>, vec<N, T>) -> T
-@must_use @const fn dot<N: num, T: fia_fiu32_f16>(vec<N, T>, vec<N, T>) -> T
+@must_use @const fn any[N: num](vec<N, bool>) -> bool
+@must_use fn arrayLength[T, A: access](ptr<storage, array<T>, A>) -> u32
+@must_use @const fn asin[T: fa_f32_f16](@test_value(0.479425538604) T) -> T
+@must_use @const fn asin[N: num, T: fa_f32_f16](@test_value(0.479425538604) vec<N, T>) -> vec<N, T>
+@must_use @const fn asinh[T: fa_f32_f16](T) -> T
+@must_use @const fn asinh[N: num, T: fa_f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn atan[T: fa_f32_f16](T) -> T
+@must_use @const fn atan[N: num, T: fa_f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn atan2[T: fa_f32_f16](T, T) -> T
+@must_use @const fn atan2[T: fa_f32_f16, N: num](vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const fn atanh[T: fa_f32_f16](@test_value(0.5) T) -> T
+@must_use @const fn atanh[N: num, T: fa_f32_f16](@test_value(0.5) vec<N, T>) -> vec<N, T>
+@must_use @const fn ceil[T: fa_f32_f16](@test_value(1.5) T) -> T
+@must_use @const fn ceil[N: num, T: fa_f32_f16](@test_value(1.5) vec<N, T>) -> vec<N, T>
+@must_use @const fn clamp[T: fia_fiu32_f16](T, T, T) -> T
+@must_use @const fn clamp[T: fia_fiu32_f16, N: num](vec<N, T>, vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const fn cos[T: fa_f32_f16](@test_value(0) T) -> T
+@must_use @const fn cos[N: num, T: fa_f32_f16](@test_value(0) vec<N, T>) -> vec<N, T>
+@must_use @const fn cosh[T: fa_f32_f16](@test_value(0) T) -> T
+@must_use @const fn cosh[N: num, T: fa_f32_f16](@test_value(0) vec<N, T>) -> vec<N, T>
+@must_use @const fn countLeadingZeros[T: iu32](T) -> T
+@must_use @const fn countLeadingZeros[N: num, T: iu32](vec<N, T>) -> vec<N, T>
+@must_use @const fn countOneBits[T: iu32](T) -> T
+@must_use @const fn countOneBits[N: num, T: iu32](vec<N, T>) -> vec<N, T>
+@must_use @const fn countTrailingZeros[T: iu32](T) -> T
+@must_use @const fn countTrailingZeros[N: num, T: iu32](vec<N, T>) -> vec<N, T>
+@must_use @const fn cross[T: fa_f32_f16](vec3<T>, vec3<T>) -> vec3<T>
+@must_use @const fn degrees[T: fa_f32_f16](T) -> T
+@must_use @const fn degrees[N: num, T: fa_f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn determinant[N: num, T: fa_f32_f16](mat<N, N, T>) -> T
+@must_use @const fn distance[T: fa_f32_f16](T, T) -> T
+@must_use @const fn distance[N: num, T: fa_f32_f16](vec<N, T>, vec<N, T>) -> T
+@must_use @const fn dot[N: num, T: fia_fiu32_f16](vec<N, T>, vec<N, T>) -> T
 @must_use @const fn dot4I8Packed(u32, u32) -> i32
 @must_use @const fn dot4U8Packed(u32, u32) -> u32
 @must_use @stage("fragment") fn dpdx(f32) -> f32
-@must_use @stage("fragment") fn dpdx<N: num>(vec<N, f32>) -> vec<N, f32>
+@must_use @stage("fragment") fn dpdx[N: num](vec<N, f32>) -> vec<N, f32>
 @must_use @stage("fragment") fn dpdxCoarse(f32) -> f32
-@must_use @stage("fragment") fn dpdxCoarse<N: num>(vec<N, f32>) -> vec<N, f32>
+@must_use @stage("fragment") fn dpdxCoarse[N: num](vec<N, f32>) -> vec<N, f32>
 @must_use @stage("fragment") fn dpdxFine(f32) -> f32
-@must_use @stage("fragment") fn dpdxFine<N: num>(vec<N, f32>) -> vec<N, f32>
+@must_use @stage("fragment") fn dpdxFine[N: num](vec<N, f32>) -> vec<N, f32>
 @must_use @stage("fragment") fn dpdy(f32) -> f32
-@must_use @stage("fragment") fn dpdy<N: num>(vec<N, f32>) -> vec<N, f32>
+@must_use @stage("fragment") fn dpdy[N: num](vec<N, f32>) -> vec<N, f32>
 @must_use @stage("fragment") fn dpdyCoarse(f32) -> f32
-@must_use @stage("fragment") fn dpdyCoarse<N: num>(vec<N, f32>) -> vec<N, f32>
+@must_use @stage("fragment") fn dpdyCoarse[N: num](vec<N, f32>) -> vec<N, f32>
 @must_use @stage("fragment") fn dpdyFine(f32) -> f32
-@must_use @stage("fragment") fn dpdyFine<N: num>(vec<N, f32>) -> vec<N, f32>
-@must_use @const fn exp<T: fa_f32_f16>(T) -> T
-@must_use @const fn exp<N: num, T: fa_f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn exp2<T: fa_f32_f16>(T) -> T
-@must_use @const fn exp2<N: num, T: fa_f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn extractBits<T: iu32>(T, u32, u32) -> T
-@must_use @const fn extractBits<N: num, T: iu32>(vec<N, T>, u32, u32) -> vec<N, T>
-@must_use @const fn faceForward<N: num, T: fa_f32_f16>(vec<N, T>, vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const fn firstLeadingBit<T: iu32>(T) -> T
-@must_use @const fn firstLeadingBit<N: num, T: iu32>(vec<N, T>) -> vec<N, T>
-@must_use @const fn firstTrailingBit<T: iu32>(T) -> T
-@must_use @const fn firstTrailingBit<N: num, T: iu32>(vec<N, T>) -> vec<N, T>
-@must_use @const fn floor<T: fa_f32_f16>(@test_value(1.5) T) -> T
-@must_use @const fn floor<N: num, T: fa_f32_f16>(@test_value(1.5) vec<N, T>) -> vec<N, T>
-@must_use @const fn fma<T: fa_f32_f16>(T, T, T) -> T
-@must_use @const fn fma<N: num, T: fa_f32_f16>(vec<N, T>, vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const fn fract<T: fa_f32_f16>(@test_value(1.25) T) -> T
-@must_use @const fn fract<N: num, T: fa_f32_f16>(@test_value(1.25) vec<N, T>) -> vec<N, T>
-@must_use @const fn frexp<T: fa_f32_f16>(T) -> __frexp_result<T>
-@must_use @const fn frexp<N: num, T: fa_f32_f16>(vec<N, T>) -> __frexp_result_vec<N, T>
+@must_use @stage("fragment") fn dpdyFine[N: num](vec<N, f32>) -> vec<N, f32>
+@must_use @const fn exp[T: fa_f32_f16](T) -> T
+@must_use @const fn exp[N: num, T: fa_f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn exp2[T: fa_f32_f16](T) -> T
+@must_use @const fn exp2[N: num, T: fa_f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn extractBits[T: iu32](T, u32, u32) -> T
+@must_use @const fn extractBits[N: num, T: iu32](vec<N, T>, u32, u32) -> vec<N, T>
+@must_use @const fn faceForward[N: num, T: fa_f32_f16](vec<N, T>, vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const fn firstLeadingBit[T: iu32](T) -> T
+@must_use @const fn firstLeadingBit[N: num, T: iu32](vec<N, T>) -> vec<N, T>
+@must_use @const fn firstTrailingBit[T: iu32](T) -> T
+@must_use @const fn firstTrailingBit[N: num, T: iu32](vec<N, T>) -> vec<N, T>
+@must_use @const fn floor[T: fa_f32_f16](@test_value(1.5) T) -> T
+@must_use @const fn floor[N: num, T: fa_f32_f16](@test_value(1.5) vec<N, T>) -> vec<N, T>
+@must_use @const fn fma[T: fa_f32_f16](T, T, T) -> T
+@must_use @const fn fma[N: num, T: fa_f32_f16](vec<N, T>, vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const fn fract[T: fa_f32_f16](@test_value(1.25) T) -> T
+@must_use @const fn fract[N: num, T: fa_f32_f16](@test_value(1.25) vec<N, T>) -> vec<N, T>
+@must_use @const fn frexp[T: fa_f32_f16](T) -> __frexp_result<T>
+@must_use @const fn frexp[N: num, T: fa_f32_f16](vec<N, T>) -> __frexp_result_vec<N, T>
 @must_use @stage("fragment") fn fwidth(f32) -> f32
-@must_use @stage("fragment") fn fwidth<N: num>(vec<N, f32>) -> vec<N, f32>
+@must_use @stage("fragment") fn fwidth[N: num](vec<N, f32>) -> vec<N, f32>
 @must_use @stage("fragment") fn fwidthCoarse(f32) -> f32
-@must_use @stage("fragment") fn fwidthCoarse<N: num>(vec<N, f32>) -> vec<N, f32>
+@must_use @stage("fragment") fn fwidthCoarse[N: num](vec<N, f32>) -> vec<N, f32>
 @must_use @stage("fragment") fn fwidthFine(f32) -> f32
-@must_use @stage("fragment") fn fwidthFine<N: num>(vec<N, f32>) -> vec<N, f32>
-@must_use @const fn insertBits<T: iu32>(T, T, u32, u32) -> T
-@must_use @const fn insertBits<N: num, T: iu32>(vec<N, T>, vec<N, T>, u32, u32) -> vec<N, T>
-@must_use @const fn inverseSqrt<T: fa_f32_f16>(T) -> T
-@must_use @const fn inverseSqrt<N: num, T: fa_f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn ldexp<T: fa_f32_f16, U: ia_i32>(T, U) -> T
-@must_use @const fn ldexp<N: num, T: fa_f32_f16, U: ia_i32>(vec<N, T>, vec<N, U>) -> vec<N, T>
-@must_use @const fn length<T: fa_f32_f16>(@test_value(0.0) T) -> T
-@must_use @const fn length<N: num, T: fa_f32_f16>(@test_value(0.0) vec<N, T>) -> T
-@must_use @const fn log<T: fa_f32_f16>(T) -> T
-@must_use @const fn log<N: num, T: fa_f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn log2<T: fa_f32_f16>(T) -> T
-@must_use @const fn log2<N: num, T: fa_f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn max<T: fia_fiu32_f16>(T, T) -> T
-@must_use @const fn max<N: num, T: fia_fiu32_f16>(vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const fn min<T: fia_fiu32_f16>(T, T) -> T
-@must_use @const fn min<N: num, T: fia_fiu32_f16>(vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const fn mix<T: fa_f32_f16>(T, T, T) -> T
-@must_use @const fn mix<N: num, T: fa_f32_f16>(vec<N, T>, vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const fn mix<N: num, T: fa_f32_f16>(vec<N, T>, vec<N, T>, T) -> vec<N, T>
-@must_use @const fn modf<T: fa_f32_f16>(@test_value(-1.5) T) -> __modf_result<T>
-@must_use @const fn modf<N: num, T: fa_f32_f16>(@test_value(-1.5) vec<N, T>) -> __modf_result_vec<N, T>
-@must_use @const fn normalize<N: num, T: fa_f32_f16>(vec<N, T>) -> vec<N, T>
+@must_use @stage("fragment") fn fwidthFine[N: num](vec<N, f32>) -> vec<N, f32>
+@must_use @const fn insertBits[T: iu32](T, T, u32, u32) -> T
+@must_use @const fn insertBits[N: num, T: iu32](vec<N, T>, vec<N, T>, u32, u32) -> vec<N, T>
+@must_use @const fn inverseSqrt[T: fa_f32_f16](T) -> T
+@must_use @const fn inverseSqrt[N: num, T: fa_f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn ldexp[T: fa_f32_f16, U: ia_i32](T, U) -> T
+@must_use @const fn ldexp[N: num, T: fa_f32_f16, U: ia_i32](vec<N, T>, vec<N, U>) -> vec<N, T>
+@must_use @const fn length[T: fa_f32_f16](@test_value(0.0) T) -> T
+@must_use @const fn length[N: num, T: fa_f32_f16](@test_value(0.0) vec<N, T>) -> T
+@must_use @const fn log[T: fa_f32_f16](T) -> T
+@must_use @const fn log[N: num, T: fa_f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn log2[T: fa_f32_f16](T) -> T
+@must_use @const fn log2[N: num, T: fa_f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn max[T: fia_fiu32_f16](T, T) -> T
+@must_use @const fn max[N: num, T: fia_fiu32_f16](vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const fn min[T: fia_fiu32_f16](T, T) -> T
+@must_use @const fn min[N: num, T: fia_fiu32_f16](vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const fn mix[T: fa_f32_f16](T, T, T) -> T
+@must_use @const fn mix[N: num, T: fa_f32_f16](vec<N, T>, vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const fn mix[N: num, T: fa_f32_f16](vec<N, T>, vec<N, T>, T) -> vec<N, T>
+@must_use @const fn modf[T: fa_f32_f16](@test_value(-1.5) T) -> __modf_result<T>
+@must_use @const fn modf[N: num, T: fa_f32_f16](@test_value(-1.5) vec<N, T>) -> __modf_result_vec<N, T>
+@must_use @const fn normalize[N: num, T: fa_f32_f16](vec<N, T>) -> vec<N, T>
 @must_use @const fn pack2x16float(vec2<f32>) -> u32
 @must_use @const fn pack2x16snorm(vec2<f32>) -> u32
 @must_use @const fn pack2x16unorm(vec2<f32>) -> u32
@@ -520,43 +520,43 @@
 @must_use @const fn pack4xU8(vec4<u32>) -> u32
 @must_use @const fn pack4xI8Clamp(vec4<i32>) -> u32
 @must_use @const fn pack4xU8Clamp(vec4<u32>) -> u32
-@must_use @const fn pow<T: fa_f32_f16>(T, T) -> T
-@must_use @const fn pow<N: num, T: fa_f32_f16>(vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const fn pow[T: fa_f32_f16](T, T) -> T
+@must_use @const fn pow[N: num, T: fa_f32_f16](vec<N, T>, vec<N, T>) -> vec<N, T>
 @must_use @const fn quantizeToF16(f32) -> f32
-@must_use @const fn quantizeToF16<N: num>(vec<N, f32>) -> vec<N, f32>
-@must_use @const fn radians<T: fa_f32_f16>(T) -> T
-@must_use @const fn radians<N: num, T: fa_f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn reflect<N: num, T: fa_f32_f16>(vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const fn refract<N: num, T: fa_f32_f16>(vec<N, T>, vec<N, T>, T) -> vec<N, T>
-@must_use @const fn reverseBits<T: iu32>(T) -> T
-@must_use @const fn reverseBits<N: num, T: iu32>(vec<N, T>) -> vec<N, T>
-@must_use @const fn round<T: fa_f32_f16>(@test_value(3.5) T) -> T
-@must_use @const fn round<N: num, T: fa_f32_f16>(@test_value(3.5) vec<N, T>) -> vec<N, T>
-@must_use @const fn saturate<T: fa_f32_f16>(@test_value(2) T) -> T
-@must_use @const fn saturate<T: fa_f32_f16, N: num>(@test_value(2) vec<N, T>) -> vec<N, T>
-@must_use @const("select_bool") fn select<T: scalar>(T, T, bool) -> T
-@must_use @const("select_bool") fn select<T: scalar, N: num>(vec<N, T>, vec<N, T>, bool) -> vec<N, T>
-@must_use @const("select_boolvec") fn select<N: num, T: scalar>(vec<N, T>, vec<N, T>, vec<N, bool>) -> vec<N, T>
-@must_use @const fn sign<T: fia_fi32_f16>(T) -> T
-@must_use @const fn sign<N: num, T: fia_fi32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn sin<T: fa_f32_f16>(@test_value(1.57079632679) T) -> T
-@must_use @const fn sin<N: num, T: fa_f32_f16>(@test_value(1.57079632679) vec<N, T>) -> vec<N, T>
-@must_use @const fn sinh<T: fa_f32_f16>(T) -> T
-@must_use @const fn sinh<N: num, T: fa_f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn smoothstep<T: fa_f32_f16>(@test_value(2) T, @test_value(4) T, @test_value(3) T) -> T
-@must_use @const fn smoothstep<N: num, T: fa_f32_f16>(@test_value(2) vec<N, T>, @test_value(4) vec<N, T>, @test_value(3) vec<N, T>) -> vec<N, T>
-@must_use @const fn sqrt<T: fa_f32_f16>(T) -> T
-@must_use @const fn sqrt<N: num, T: fa_f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn step<T: fa_f32_f16>(T, T) -> T
-@must_use @const fn step<N: num, T: fa_f32_f16>(vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const fn quantizeToF16[N: num](vec<N, f32>) -> vec<N, f32>
+@must_use @const fn radians[T: fa_f32_f16](T) -> T
+@must_use @const fn radians[N: num, T: fa_f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn reflect[N: num, T: fa_f32_f16](vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const fn refract[N: num, T: fa_f32_f16](vec<N, T>, vec<N, T>, T) -> vec<N, T>
+@must_use @const fn reverseBits[T: iu32](T) -> T
+@must_use @const fn reverseBits[N: num, T: iu32](vec<N, T>) -> vec<N, T>
+@must_use @const fn round[T: fa_f32_f16](@test_value(3.5) T) -> T
+@must_use @const fn round[N: num, T: fa_f32_f16](@test_value(3.5) vec<N, T>) -> vec<N, T>
+@must_use @const fn saturate[T: fa_f32_f16](@test_value(2) T) -> T
+@must_use @const fn saturate[T: fa_f32_f16, N: num](@test_value(2) vec<N, T>) -> vec<N, T>
+@must_use @const("select_bool") fn select[T: scalar](T, T, bool) -> T
+@must_use @const("select_bool") fn select[T: scalar, N: num](vec<N, T>, vec<N, T>, bool) -> vec<N, T>
+@must_use @const("select_boolvec") fn select[N: num, T: scalar](vec<N, T>, vec<N, T>, vec<N, bool>) -> vec<N, T>
+@must_use @const fn sign[T: fia_fi32_f16](T) -> T
+@must_use @const fn sign[N: num, T: fia_fi32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn sin[T: fa_f32_f16](@test_value(1.57079632679) T) -> T
+@must_use @const fn sin[N: num, T: fa_f32_f16](@test_value(1.57079632679) vec<N, T>) -> vec<N, T>
+@must_use @const fn sinh[T: fa_f32_f16](T) -> T
+@must_use @const fn sinh[N: num, T: fa_f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn smoothstep[T: fa_f32_f16](@test_value(2) T, @test_value(4) T, @test_value(3) T) -> T
+@must_use @const fn smoothstep[N: num, T: fa_f32_f16](@test_value(2) vec<N, T>, @test_value(4) vec<N, T>, @test_value(3) vec<N, T>) -> vec<N, T>
+@must_use @const fn sqrt[T: fa_f32_f16](T) -> T
+@must_use @const fn sqrt[N: num, T: fa_f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn step[T: fa_f32_f16](T, T) -> T
+@must_use @const fn step[N: num, T: fa_f32_f16](vec<N, T>, vec<N, T>) -> vec<N, T>
 @stage("compute") fn storageBarrier()
-@must_use @const fn tan<T: fa_f32_f16>(T) -> T
-@must_use @const fn tan<N: num, T: fa_f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn tanh<T: fa_f32_f16>(T) -> T
-@must_use @const fn tanh<N: num, T: fa_f32_f16>(vec<N, T>) -> vec<N, T>
-@must_use @const fn transpose<M: num, N: num, T: fa_f32_f16>(mat<M, N, T>) -> mat<N, M, T>
-@must_use @const fn trunc<T: fa_f32_f16>(@test_value(1.5) T) -> T
-@must_use @const fn trunc<N: num, T: fa_f32_f16>(@test_value(1.5) vec<N, T>) -> vec<N, T>
+@must_use @const fn tan[T: fa_f32_f16](T) -> T
+@must_use @const fn tan[N: num, T: fa_f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn tanh[T: fa_f32_f16](T) -> T
+@must_use @const fn tanh[N: num, T: fa_f32_f16](vec<N, T>) -> vec<N, T>
+@must_use @const fn transpose[M: num, N: num, T: fa_f32_f16](mat<M, N, T>) -> mat<N, M, T>
+@must_use @const fn trunc[T: fa_f32_f16](@test_value(1.5) T) -> T
+@must_use @const fn trunc[N: num, T: fa_f32_f16](@test_value(1.5) vec<N, T>) -> vec<N, T>
 @must_use @const fn unpack2x16float(u32) -> vec2<f32>
 @must_use @const fn unpack2x16snorm(u32) -> vec2<f32>
 @must_use @const fn unpack2x16unorm(u32) -> vec2<f32>
@@ -565,179 +565,179 @@
 @must_use @const fn unpack4xI8(u32) -> vec4<i32>
 @must_use @const fn unpack4xU8(u32) -> vec4<u32>
 @stage("compute") fn workgroupBarrier()
-@must_use @stage("compute") fn workgroupUniformLoad<T>(ptr<workgroup, T, read_write>) -> T
+@must_use @stage("compute") fn workgroupUniformLoad[T](ptr<workgroup, T, read_write>) -> T
 
 @stage("compute") fn textureBarrier()
-@must_use fn textureDimensions<T: fiu32>(texture: texture_1d<T>) -> u32
-@must_use fn textureDimensions<T: fiu32, L: iu32>(texture: texture_1d<T>, level: L) -> u32
-@must_use fn textureDimensions<T: fiu32>(texture: texture_2d<T>) -> vec2<u32>
-@must_use fn textureDimensions<T: fiu32, L: iu32>(texture: texture_2d<T>, level: L) -> vec2<u32>
-@must_use fn textureDimensions<T: fiu32>(texture: texture_2d_array<T>) -> vec2<u32>
-@must_use fn textureDimensions<T: fiu32, L: iu32>(texture: texture_2d_array<T>, level: L) -> vec2<u32>
-@must_use fn textureDimensions<T: fiu32>(texture: texture_3d<T>) -> vec3<u32>
-@must_use fn textureDimensions<T: fiu32, L: iu32>(texture: texture_3d<T>, level: L) -> vec3<u32>
-@must_use fn textureDimensions<T: fiu32>(texture: texture_cube<T>) -> vec2<u32>
-@must_use fn textureDimensions<T: fiu32, L: iu32>(texture: texture_cube<T>, level: L) -> vec2<u32>
-@must_use fn textureDimensions<T: fiu32>(texture: texture_cube_array<T>) -> vec2<u32>
-@must_use fn textureDimensions<T: fiu32, L: iu32>(texture: texture_cube_array<T>, level: L) -> vec2<u32>
-@must_use fn textureDimensions<T: fiu32>(texture: texture_multisampled_2d<T>) -> vec2<u32>
+@must_use fn textureDimensions[T: fiu32](texture: texture_1d<T>) -> u32
+@must_use fn textureDimensions[T: fiu32, L: iu32](texture: texture_1d<T>, level: L) -> u32
+@must_use fn textureDimensions[T: fiu32](texture: texture_2d<T>) -> vec2<u32>
+@must_use fn textureDimensions[T: fiu32, L: iu32](texture: texture_2d<T>, level: L) -> vec2<u32>
+@must_use fn textureDimensions[T: fiu32](texture: texture_2d_array<T>) -> vec2<u32>
+@must_use fn textureDimensions[T: fiu32, L: iu32](texture: texture_2d_array<T>, level: L) -> vec2<u32>
+@must_use fn textureDimensions[T: fiu32](texture: texture_3d<T>) -> vec3<u32>
+@must_use fn textureDimensions[T: fiu32, L: iu32](texture: texture_3d<T>, level: L) -> vec3<u32>
+@must_use fn textureDimensions[T: fiu32](texture: texture_cube<T>) -> vec2<u32>
+@must_use fn textureDimensions[T: fiu32, L: iu32](texture: texture_cube<T>, level: L) -> vec2<u32>
+@must_use fn textureDimensions[T: fiu32](texture: texture_cube_array<T>) -> vec2<u32>
+@must_use fn textureDimensions[T: fiu32, L: iu32](texture: texture_cube_array<T>, level: L) -> vec2<u32>
+@must_use fn textureDimensions[T: fiu32](texture: texture_multisampled_2d<T>) -> vec2<u32>
 @must_use fn textureDimensions(texture: texture_depth_2d) -> vec2<u32>
-@must_use fn textureDimensions<L: iu32>(texture: texture_depth_2d, level: L) -> vec2<u32>
+@must_use fn textureDimensions[L: iu32](texture: texture_depth_2d, level: L) -> vec2<u32>
 @must_use fn textureDimensions(texture: texture_depth_2d_array) -> vec2<u32>
-@must_use fn textureDimensions<L: iu32>(texture: texture_depth_2d_array, level: L) -> vec2<u32>
+@must_use fn textureDimensions[L: iu32](texture: texture_depth_2d_array, level: L) -> vec2<u32>
 @must_use fn textureDimensions(texture: texture_depth_cube) -> vec2<u32>
-@must_use fn textureDimensions<L: iu32>(texture: texture_depth_cube, level: L) -> vec2<u32>
+@must_use fn textureDimensions[L: iu32](texture: texture_depth_cube, level: L) -> vec2<u32>
 @must_use fn textureDimensions(texture: texture_depth_cube_array) -> vec2<u32>
-@must_use fn textureDimensions<L: iu32>(texture: texture_depth_cube_array, level: L) -> vec2<u32>
+@must_use fn textureDimensions[L: iu32](texture: texture_depth_cube_array, level: L) -> vec2<u32>
 @must_use fn textureDimensions(texture: texture_depth_multisampled_2d) -> vec2<u32>
-@must_use fn textureDimensions<F: texel_format, A: access>(texture: texture_storage_1d<F, A>) -> u32
-@must_use fn textureDimensions<F: texel_format, A: access>(texture: texture_storage_2d<F, A>) -> vec2<u32>
-@must_use fn textureDimensions<F: texel_format, A: access>(texture: texture_storage_2d_array<F, A>) -> vec2<u32>
-@must_use fn textureDimensions<F: texel_format, A: access>(texture: texture_storage_3d<F, A>) -> vec3<u32>
+@must_use fn textureDimensions[F: texel_format, A: access](texture: texture_storage_1d<F, A>) -> u32
+@must_use fn textureDimensions[F: texel_format, A: access](texture: texture_storage_2d<F, A>) -> vec2<u32>
+@must_use fn textureDimensions[F: texel_format, A: access](texture: texture_storage_2d_array<F, A>) -> vec2<u32>
+@must_use fn textureDimensions[F: texel_format, A: access](texture: texture_storage_3d<F, A>) -> vec3<u32>
 @must_use fn textureDimensions(texture: texture_external) -> vec2<u32>
-@must_use fn textureGather<T: fiu32, C: iu32>(@const component: C, texture: texture_2d<T>, sampler: sampler, coords: vec2<f32>) -> vec4<T>
-@must_use fn textureGather<T: fiu32, C: iu32>(@const component: C, texture: texture_2d<T>, sampler: sampler, coords: vec2<f32>, @const offset: vec2<i32>) -> vec4<T>
-@must_use fn textureGather<T: fiu32, C: iu32, A: iu32>(@const component: C, texture: texture_2d_array<T>, sampler: sampler, coords: vec2<f32>, array_index: A) -> vec4<T>
-@must_use fn textureGather<T: fiu32, C: iu32, A: iu32>(@const component: C, texture: texture_2d_array<T>, sampler: sampler, coords: vec2<f32>, array_index: A, @const offset: vec2<i32>) -> vec4<T>
-@must_use fn textureGather<T: fiu32, C: iu32>(@const component: C, texture: texture_cube<T>, sampler: sampler, coords: vec3<f32>) -> vec4<T>
-@must_use fn textureGather<T: fiu32, C: iu32, A: iu32>(@const component: C, texture: texture_cube_array<T>, sampler: sampler, coords: vec3<f32>, array_index: A) -> vec4<T>
+@must_use fn textureGather[T: fiu32, C: iu32](@const component: C, texture: texture_2d<T>, sampler: sampler, coords: vec2<f32>) -> vec4<T>
+@must_use fn textureGather[T: fiu32, C: iu32](@const component: C, texture: texture_2d<T>, sampler: sampler, coords: vec2<f32>, @const offset: vec2<i32>) -> vec4<T>
+@must_use fn textureGather[T: fiu32, C: iu32, A: iu32](@const component: C, texture: texture_2d_array<T>, sampler: sampler, coords: vec2<f32>, array_index: A) -> vec4<T>
+@must_use fn textureGather[T: fiu32, C: iu32, A: iu32](@const component: C, texture: texture_2d_array<T>, sampler: sampler, coords: vec2<f32>, array_index: A, @const offset: vec2<i32>) -> vec4<T>
+@must_use fn textureGather[T: fiu32, C: iu32](@const component: C, texture: texture_cube<T>, sampler: sampler, coords: vec3<f32>) -> vec4<T>
+@must_use fn textureGather[T: fiu32, C: iu32, A: iu32](@const component: C, texture: texture_cube_array<T>, sampler: sampler, coords: vec3<f32>, array_index: A) -> vec4<T>
 @must_use fn textureGather(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>) -> vec4<f32>
 @must_use fn textureGather(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, @const offset: vec2<i32>) -> vec4<f32>
-@must_use fn textureGather<A: iu32>(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A) -> vec4<f32>
-@must_use fn textureGather<A: iu32>(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A, @const offset: vec2<i32>) -> vec4<f32>
+@must_use fn textureGather[A: iu32](texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A) -> vec4<f32>
+@must_use fn textureGather[A: iu32](texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A, @const offset: vec2<i32>) -> vec4<f32>
 @must_use fn textureGather(texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>) -> vec4<f32>
-@must_use fn textureGather<A: iu32>(texture: texture_depth_cube_array, sampler: sampler, coords: vec3<f32>, array_index: A) -> vec4<f32>
+@must_use fn textureGather[A: iu32](texture: texture_depth_cube_array, sampler: sampler, coords: vec3<f32>, array_index: A) -> vec4<f32>
 @must_use fn textureGatherCompare(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32) -> vec4<f32>
 @must_use fn textureGatherCompare(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32, @const offset: vec2<i32>) -> vec4<f32>
-@must_use fn textureGatherCompare<A: iu32>(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32) -> vec4<f32>
-@must_use fn textureGatherCompare<A: iu32>(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32, @const offset: vec2<i32>) -> vec4<f32>
+@must_use fn textureGatherCompare[A: iu32](texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32) -> vec4<f32>
+@must_use fn textureGatherCompare[A: iu32](texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32, @const offset: vec2<i32>) -> vec4<f32>
 @must_use fn textureGatherCompare(texture: texture_depth_cube, sampler: sampler_comparison, coords: vec3<f32>, depth_ref: f32) -> vec4<f32>
-@must_use fn textureGatherCompare<A: iu32>(texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: A, depth_ref: f32) -> vec4<f32>
-@must_use fn textureNumLayers<T: fiu32>(texture: texture_2d_array<T>) -> u32
-@must_use fn textureNumLayers<T: fiu32>(texture: texture_cube_array<T>) -> u32
+@must_use fn textureGatherCompare[A: iu32](texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: A, depth_ref: f32) -> vec4<f32>
+@must_use fn textureNumLayers[T: fiu32](texture: texture_2d_array<T>) -> u32
+@must_use fn textureNumLayers[T: fiu32](texture: texture_cube_array<T>) -> u32
 @must_use fn textureNumLayers(texture: texture_depth_2d_array) -> u32
 @must_use fn textureNumLayers(texture: texture_depth_cube_array) -> u32
-@must_use fn textureNumLayers<F: texel_format, A: access>(texture: texture_storage_2d_array<F, A>) -> u32
-@must_use fn textureNumLevels<T: fiu32>(texture: texture_1d<T>) -> u32
-@must_use fn textureNumLevels<T: fiu32>(texture: texture_2d<T>) -> u32
-@must_use fn textureNumLevels<T: fiu32>(texture: texture_2d_array<T>) -> u32
-@must_use fn textureNumLevels<T: fiu32>(texture: texture_3d<T>) -> u32
-@must_use fn textureNumLevels<T: fiu32>(texture: texture_cube<T>) -> u32
-@must_use fn textureNumLevels<T: fiu32>(texture: texture_cube_array<T>) -> u32
+@must_use fn textureNumLayers[F: texel_format, A: access](texture: texture_storage_2d_array<F, A>) -> u32
+@must_use fn textureNumLevels[T: fiu32](texture: texture_1d<T>) -> u32
+@must_use fn textureNumLevels[T: fiu32](texture: texture_2d<T>) -> u32
+@must_use fn textureNumLevels[T: fiu32](texture: texture_2d_array<T>) -> u32
+@must_use fn textureNumLevels[T: fiu32](texture: texture_3d<T>) -> u32
+@must_use fn textureNumLevels[T: fiu32](texture: texture_cube<T>) -> u32
+@must_use fn textureNumLevels[T: fiu32](texture: texture_cube_array<T>) -> u32
 @must_use fn textureNumLevels(texture: texture_depth_2d) -> u32
 @must_use fn textureNumLevels(texture: texture_depth_2d_array) -> u32
 @must_use fn textureNumLevels(texture: texture_depth_cube) -> u32
 @must_use fn textureNumLevels(texture: texture_depth_cube_array) -> u32
-@must_use fn textureNumSamples<T: fiu32>(texture: texture_multisampled_2d<T>) -> u32
+@must_use fn textureNumSamples[T: fiu32](texture: texture_multisampled_2d<T>) -> u32
 @must_use fn textureNumSamples(texture: texture_depth_multisampled_2d) -> u32
 @must_use @stage("fragment") fn textureSample(texture: texture_1d<f32>, sampler: sampler, coords: f32) -> vec4<f32>
 @must_use @stage("fragment") fn textureSample(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>) -> vec4<f32>
 @must_use @stage("fragment") fn textureSample(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, @const offset: vec2<i32>) -> vec4<f32>
-@must_use @stage("fragment") fn textureSample<A: iu32>(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A) -> vec4<f32>
-@must_use @stage("fragment") fn textureSample<A: iu32>(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, @const offset: vec2<i32>) -> vec4<f32>
+@must_use @stage("fragment") fn textureSample[A: iu32](texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A) -> vec4<f32>
+@must_use @stage("fragment") fn textureSample[A: iu32](texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, @const offset: vec2<i32>) -> vec4<f32>
 @must_use @stage("fragment") fn textureSample(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>) -> vec4<f32>
 @must_use @stage("fragment") fn textureSample(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, @const offset: vec3<i32>) -> vec4<f32>
 @must_use @stage("fragment") fn textureSample(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>) -> vec4<f32>
-@must_use @stage("fragment") fn textureSample<A: iu32>(texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: A) -> vec4<f32>
+@must_use @stage("fragment") fn textureSample[A: iu32](texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: A) -> vec4<f32>
 @must_use @stage("fragment") fn textureSample(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>) -> f32
 @must_use @stage("fragment") fn textureSample(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, @const offset: vec2<i32>) -> f32
-@must_use @stage("fragment") fn textureSample<A: iu32>(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A) -> f32
-@must_use @stage("fragment") fn textureSample<A: iu32>(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A, @const offset: vec2<i32>) -> f32
+@must_use @stage("fragment") fn textureSample[A: iu32](texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A) -> f32
+@must_use @stage("fragment") fn textureSample[A: iu32](texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A, @const offset: vec2<i32>) -> f32
 @must_use @stage("fragment") fn textureSample(texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>) -> f32
-@must_use @stage("fragment") fn textureSample<A: iu32>(texture: texture_depth_cube_array, sampler: sampler, coords: vec3<f32>, array_index: A) -> f32
+@must_use @stage("fragment") fn textureSample[A: iu32](texture: texture_depth_cube_array, sampler: sampler, coords: vec3<f32>, array_index: A) -> f32
 @must_use @stage("fragment") fn textureSampleBias(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, bias: f32) -> vec4<f32>
 @must_use @stage("fragment") fn textureSampleBias(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, bias: f32, @const offset: vec2<i32>) -> vec4<f32>
-@must_use @stage("fragment") fn textureSampleBias<A: iu32>(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, bias: f32) -> vec4<f32>
-@must_use @stage("fragment") fn textureSampleBias<A: iu32>(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, bias: f32, @const offset: vec2<i32>) -> vec4<f32>
+@must_use @stage("fragment") fn textureSampleBias[A: iu32](texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, bias: f32) -> vec4<f32>
+@must_use @stage("fragment") fn textureSampleBias[A: iu32](texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, bias: f32, @const offset: vec2<i32>) -> vec4<f32>
 @must_use @stage("fragment") fn textureSampleBias(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, bias: f32) -> vec4<f32>
 @must_use @stage("fragment") fn textureSampleBias(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, bias: f32, @const offset: vec3<i32>) -> vec4<f32>
 @must_use @stage("fragment") fn textureSampleBias(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>, bias: f32) -> vec4<f32>
-@must_use @stage("fragment") fn textureSampleBias<A: iu32>(texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: A, bias: f32) -> vec4<f32>
+@must_use @stage("fragment") fn textureSampleBias[A: iu32](texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: A, bias: f32) -> vec4<f32>
 @must_use @stage("fragment") fn textureSampleCompare(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32) -> f32
 @must_use @stage("fragment") fn textureSampleCompare(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32, @const offset: vec2<i32>) -> f32
-@must_use @stage("fragment") fn textureSampleCompare<A: iu32>(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32) -> f32
-@must_use @stage("fragment") fn textureSampleCompare<A: iu32>(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32, @const offset: vec2<i32>) -> f32
+@must_use @stage("fragment") fn textureSampleCompare[A: iu32](texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32) -> f32
+@must_use @stage("fragment") fn textureSampleCompare[A: iu32](texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32, @const offset: vec2<i32>) -> f32
 @must_use @stage("fragment") fn textureSampleCompare(texture: texture_depth_cube, sampler: sampler_comparison, coords: vec3<f32>, depth_ref: f32) -> f32
-@must_use @stage("fragment") fn textureSampleCompare<A: iu32>(texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: A, depth_ref: f32) -> f32
+@must_use @stage("fragment") fn textureSampleCompare[A: iu32](texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: A, depth_ref: f32) -> f32
 @must_use fn textureSampleCompareLevel(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32) -> f32
 @must_use fn textureSampleCompareLevel(texture: texture_depth_2d, sampler: sampler_comparison, coords: vec2<f32>, depth_ref: f32, @const offset: vec2<i32>) -> f32
-@must_use fn textureSampleCompareLevel<A: iu32>(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32) -> f32
-@must_use fn textureSampleCompareLevel<A: iu32>(texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32, @const offset: vec2<i32>) -> f32
+@must_use fn textureSampleCompareLevel[A: iu32](texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32) -> f32
+@must_use fn textureSampleCompareLevel[A: iu32](texture: texture_depth_2d_array, sampler: sampler_comparison, coords: vec2<f32>, array_index: A, depth_ref: f32, @const offset: vec2<i32>) -> f32
 @must_use fn textureSampleCompareLevel(texture: texture_depth_cube, sampler: sampler_comparison, coords: vec3<f32>, depth_ref: f32) -> f32
-@must_use fn textureSampleCompareLevel<A: iu32>(texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: A, depth_ref: f32) -> f32
+@must_use fn textureSampleCompareLevel[A: iu32](texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: A, depth_ref: f32) -> f32
 @must_use fn textureSampleGrad(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, ddx: vec2<f32>, ddy: vec2<f32>) -> vec4<f32>
 @must_use fn textureSampleGrad(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, ddx: vec2<f32>, ddy: vec2<f32>, @const offset: vec2<i32>) -> vec4<f32>
-@must_use fn textureSampleGrad<A: iu32>(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, ddx: vec2<f32>, ddy: vec2<f32>) -> vec4<f32>
-@must_use fn textureSampleGrad<A: iu32>(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, ddx: vec2<f32>, ddy: vec2<f32>, @const offset: vec2<i32>) -> vec4<f32>
+@must_use fn textureSampleGrad[A: iu32](texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, ddx: vec2<f32>, ddy: vec2<f32>) -> vec4<f32>
+@must_use fn textureSampleGrad[A: iu32](texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, ddx: vec2<f32>, ddy: vec2<f32>, @const offset: vec2<i32>) -> vec4<f32>
 @must_use fn textureSampleGrad(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, ddx: vec3<f32>, ddy: vec3<f32>) -> vec4<f32>
 @must_use fn textureSampleGrad(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, ddx: vec3<f32>, ddy: vec3<f32>, @const offset: vec3<i32>) -> vec4<f32>
 @must_use fn textureSampleGrad(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>, ddx: vec3<f32>, ddy: vec3<f32>) -> vec4<f32>
-@must_use fn textureSampleGrad<A: iu32>(texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: A, ddx: vec3<f32>, ddy: vec3<f32>) -> vec4<f32>
+@must_use fn textureSampleGrad[A: iu32](texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: A, ddx: vec3<f32>, ddy: vec3<f32>) -> vec4<f32>
 @must_use fn textureSampleLevel(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, level: f32) -> vec4<f32>
 @must_use fn textureSampleLevel(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, level: f32, @const offset: vec2<i32>) -> vec4<f32>
-@must_use fn textureSampleLevel<A: iu32>(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, level: f32) -> vec4<f32>
-@must_use fn textureSampleLevel<A: iu32>(texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, level: f32, @const offset: vec2<i32>) -> vec4<f32>
+@must_use fn textureSampleLevel[A: iu32](texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, level: f32) -> vec4<f32>
+@must_use fn textureSampleLevel[A: iu32](texture: texture_2d_array<f32>, sampler: sampler, coords: vec2<f32>, array_index: A, level: f32, @const offset: vec2<i32>) -> vec4<f32>
 @must_use fn textureSampleLevel(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, level: f32) -> vec4<f32>
 @must_use fn textureSampleLevel(texture: texture_3d<f32>, sampler: sampler, coords: vec3<f32>, level: f32, @const offset: vec3<i32>) -> vec4<f32>
 @must_use fn textureSampleLevel(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>, level: f32) -> vec4<f32>
-@must_use fn textureSampleLevel<A: iu32>(texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: A, level: f32) -> vec4<f32>
-@must_use fn textureSampleLevel<L: iu32>(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, level: L) -> f32
-@must_use fn textureSampleLevel<L: iu32>(texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, level: L, @const offset: vec2<i32>) -> f32
-@must_use fn textureSampleLevel<A: iu32, L: iu32>(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A, level: L) -> f32
-@must_use fn textureSampleLevel<A: iu32, L: iu32>(texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A, level: L, @const offset: vec2<i32>) -> f32
-@must_use fn textureSampleLevel<L: iu32>(texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>, level: L) -> f32
-@must_use fn textureSampleLevel<A: iu32, L: iu32>(texture: texture_depth_cube_array,sampler: sampler, coords: vec3<f32>, array_index: A, level: L) -> f32
+@must_use fn textureSampleLevel[A: iu32](texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: A, level: f32) -> vec4<f32>
+@must_use fn textureSampleLevel[L: iu32](texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, level: L) -> f32
+@must_use fn textureSampleLevel[L: iu32](texture: texture_depth_2d, sampler: sampler, coords: vec2<f32>, level: L, @const offset: vec2<i32>) -> f32
+@must_use fn textureSampleLevel[A: iu32, L: iu32](texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A, level: L) -> f32
+@must_use fn textureSampleLevel[A: iu32, L: iu32](texture: texture_depth_2d_array, sampler: sampler, coords: vec2<f32>, array_index: A, level: L, @const offset: vec2<i32>) -> f32
+@must_use fn textureSampleLevel[L: iu32](texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>, level: L) -> f32
+@must_use fn textureSampleLevel[A: iu32, L: iu32](texture: texture_depth_cube_array,sampler: sampler, coords: vec3<f32>, array_index: A, level: L) -> f32
 @must_use fn textureSampleBaseClampToEdge(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>) -> vec4<f32>
 @must_use fn textureSampleBaseClampToEdge(texture: texture_external, sampler: sampler, coords: vec2<f32>) -> vec4<f32>
-fn textureStore<C: iu32>(texture: texture_storage_1d<f32_texel_format, writable>, coords: C, value: vec4<f32>)
-fn textureStore<C: iu32>(texture: texture_storage_2d<f32_texel_format, writable>, coords: vec2<C>, value: vec4<f32>)
-fn textureStore<C: iu32, A: iu32>(texture: texture_storage_2d_array<f32_texel_format, writable>, coords: vec2<C>, array_index: A, value: vec4<f32>)
-fn textureStore<C: iu32>(texture: texture_storage_3d<f32_texel_format, writable>, coords: vec3<C>, value: vec4<f32>)
-fn textureStore<C: iu32>(texture: texture_storage_1d<i32_texel_format, writable>, coords: C, value: vec4<i32>)
-fn textureStore<C: iu32>(texture: texture_storage_2d<i32_texel_format, writable>, coords: vec2<C>, value: vec4<i32>)
-fn textureStore<C: iu32, A: iu32>(texture: texture_storage_2d_array<i32_texel_format, writable>, coords: vec2<C>, array_index: A, value: vec4<i32>)
-fn textureStore<C: iu32>(texture: texture_storage_3d<i32_texel_format, writable>, coords: vec3<C>, value: vec4<i32>)
-fn textureStore<C: iu32>(texture: texture_storage_1d<u32_texel_format, writable>, coords: C, value: vec4<u32>)
-fn textureStore<C: iu32>(texture: texture_storage_2d<u32_texel_format, writable>, coords: vec2<C>, value: vec4<u32>)
-fn textureStore<C: iu32, A: iu32>(texture: texture_storage_2d_array<u32_texel_format, writable>, coords: vec2<C>, array_index: A, value: vec4<u32>)
-fn textureStore<C: iu32>(texture: texture_storage_3d<u32_texel_format, writable>, coords: vec3<C>, value: vec4<u32>)
-@must_use fn textureLoad<T: fiu32, C: iu32, L: iu32>(texture: texture_1d<T>, coords: C, level: L) -> vec4<T>
-@must_use fn textureLoad<T: fiu32, C: iu32, L: iu32>(texture: texture_2d<T>, coords: vec2<C>, level: L) -> vec4<T>
-@must_use fn textureLoad<T: fiu32, C: iu32, A: iu32, L: iu32>(texture: texture_2d_array<T>, coords: vec2<C>, array_index: A, level: L) -> vec4<T>
-@must_use fn textureLoad<T: fiu32, C: iu32, L: iu32>(texture: texture_3d<T>, coords: vec3<C>, level: L) -> vec4<T>
-@must_use fn textureLoad<T: fiu32, C: iu32, S: iu32>(texture: texture_multisampled_2d<T>, coords: vec2<C>, sample_index: S) -> vec4<T>
-@must_use fn textureLoad<C: iu32, L: iu32>(texture: texture_depth_2d, coords: vec2<C>, level: L) -> f32
-@must_use fn textureLoad<C: iu32, A: iu32, L: iu32>(texture: texture_depth_2d_array, coords: vec2<C>, array_index: A, level: L) -> f32
-@must_use fn textureLoad<C: iu32, S: iu32>(texture: texture_depth_multisampled_2d, coords: vec2<C>, sample_index: S) -> f32
-@must_use fn textureLoad<C: iu32>(texture: texture_external, coords: vec2<C>) -> vec4<f32>
-@must_use fn textureLoad<C: iu32>(texture: texture_storage_1d<f32_texel_format, readable>, coords: C) -> vec4<f32>
-@must_use fn textureLoad<C: iu32>(texture: texture_storage_1d<i32_texel_format, readable>, coords: C) -> vec4<i32>
-@must_use fn textureLoad<C: iu32>(texture: texture_storage_1d<u32_texel_format, readable>, coords: C) -> vec4<u32>
-@must_use fn textureLoad<C: iu32>(texture: texture_storage_2d<f32_texel_format, readable>, coords: vec2<C>) -> vec4<f32>
-@must_use fn textureLoad<C: iu32>(texture: texture_storage_2d<i32_texel_format, readable>, coords: vec2<C>) -> vec4<i32>
-@must_use fn textureLoad<C: iu32>(texture: texture_storage_2d<u32_texel_format, readable>, coords: vec2<C>) -> vec4<u32>
-@must_use fn textureLoad<C: iu32, A: iu32>(texture: texture_storage_2d_array<f32_texel_format, readable>, coords: vec2<C>, array_index: A) -> vec4<f32>
-@must_use fn textureLoad<C: iu32, A: iu32>(texture: texture_storage_2d_array<i32_texel_format, readable>, coords: vec2<C>, array_index: A) -> vec4<i32>
-@must_use fn textureLoad<C: iu32, A: iu32>(texture: texture_storage_2d_array<u32_texel_format, readable>, coords: vec2<C>, array_index: A) -> vec4<u32>
-@must_use fn textureLoad<C: iu32>(texture: texture_storage_3d<f32_texel_format, readable>, coords: vec3<C>) -> vec4<f32>
-@must_use fn textureLoad<C: iu32>(texture: texture_storage_3d<i32_texel_format, readable>, coords: vec3<C>) -> vec4<i32>
-@must_use fn textureLoad<C: iu32>(texture: texture_storage_3d<u32_texel_format, readable>, coords: vec3<C>) -> vec4<u32>
+fn textureStore[C: iu32](texture: texture_storage_1d<f32_texel_format, writable>, coords: C, value: vec4<f32>)
+fn textureStore[C: iu32](texture: texture_storage_2d<f32_texel_format, writable>, coords: vec2<C>, value: vec4<f32>)
+fn textureStore[C: iu32, A: iu32](texture: texture_storage_2d_array<f32_texel_format, writable>, coords: vec2<C>, array_index: A, value: vec4<f32>)
+fn textureStore[C: iu32](texture: texture_storage_3d<f32_texel_format, writable>, coords: vec3<C>, value: vec4<f32>)
+fn textureStore[C: iu32](texture: texture_storage_1d<i32_texel_format, writable>, coords: C, value: vec4<i32>)
+fn textureStore[C: iu32](texture: texture_storage_2d<i32_texel_format, writable>, coords: vec2<C>, value: vec4<i32>)
+fn textureStore[C: iu32, A: iu32](texture: texture_storage_2d_array<i32_texel_format, writable>, coords: vec2<C>, array_index: A, value: vec4<i32>)
+fn textureStore[C: iu32](texture: texture_storage_3d<i32_texel_format, writable>, coords: vec3<C>, value: vec4<i32>)
+fn textureStore[C: iu32](texture: texture_storage_1d<u32_texel_format, writable>, coords: C, value: vec4<u32>)
+fn textureStore[C: iu32](texture: texture_storage_2d<u32_texel_format, writable>, coords: vec2<C>, value: vec4<u32>)
+fn textureStore[C: iu32, A: iu32](texture: texture_storage_2d_array<u32_texel_format, writable>, coords: vec2<C>, array_index: A, value: vec4<u32>)
+fn textureStore[C: iu32](texture: texture_storage_3d<u32_texel_format, writable>, coords: vec3<C>, value: vec4<u32>)
+@must_use fn textureLoad[T: fiu32, C: iu32, L: iu32](texture: texture_1d<T>, coords: C, level: L) -> vec4<T>
+@must_use fn textureLoad[T: fiu32, C: iu32, L: iu32](texture: texture_2d<T>, coords: vec2<C>, level: L) -> vec4<T>
+@must_use fn textureLoad[T: fiu32, C: iu32, A: iu32, L: iu32](texture: texture_2d_array<T>, coords: vec2<C>, array_index: A, level: L) -> vec4<T>
+@must_use fn textureLoad[T: fiu32, C: iu32, L: iu32](texture: texture_3d<T>, coords: vec3<C>, level: L) -> vec4<T>
+@must_use fn textureLoad[T: fiu32, C: iu32, S: iu32](texture: texture_multisampled_2d<T>, coords: vec2<C>, sample_index: S) -> vec4<T>
+@must_use fn textureLoad[C: iu32, L: iu32](texture: texture_depth_2d, coords: vec2<C>, level: L) -> f32
+@must_use fn textureLoad[C: iu32, A: iu32, L: iu32](texture: texture_depth_2d_array, coords: vec2<C>, array_index: A, level: L) -> f32
+@must_use fn textureLoad[C: iu32, S: iu32](texture: texture_depth_multisampled_2d, coords: vec2<C>, sample_index: S) -> f32
+@must_use fn textureLoad[C: iu32](texture: texture_external, coords: vec2<C>) -> vec4<f32>
+@must_use fn textureLoad[C: iu32](texture: texture_storage_1d<f32_texel_format, readable>, coords: C) -> vec4<f32>
+@must_use fn textureLoad[C: iu32](texture: texture_storage_1d<i32_texel_format, readable>, coords: C) -> vec4<i32>
+@must_use fn textureLoad[C: iu32](texture: texture_storage_1d<u32_texel_format, readable>, coords: C) -> vec4<u32>
+@must_use fn textureLoad[C: iu32](texture: texture_storage_2d<f32_texel_format, readable>, coords: vec2<C>) -> vec4<f32>
+@must_use fn textureLoad[C: iu32](texture: texture_storage_2d<i32_texel_format, readable>, coords: vec2<C>) -> vec4<i32>
+@must_use fn textureLoad[C: iu32](texture: texture_storage_2d<u32_texel_format, readable>, coords: vec2<C>) -> vec4<u32>
+@must_use fn textureLoad[C: iu32, A: iu32](texture: texture_storage_2d_array<f32_texel_format, readable>, coords: vec2<C>, array_index: A) -> vec4<f32>
+@must_use fn textureLoad[C: iu32, A: iu32](texture: texture_storage_2d_array<i32_texel_format, readable>, coords: vec2<C>, array_index: A) -> vec4<i32>
+@must_use fn textureLoad[C: iu32, A: iu32](texture: texture_storage_2d_array<u32_texel_format, readable>, coords: vec2<C>, array_index: A) -> vec4<u32>
+@must_use fn textureLoad[C: iu32](texture: texture_storage_3d<f32_texel_format, readable>, coords: vec3<C>) -> vec4<f32>
+@must_use fn textureLoad[C: iu32](texture: texture_storage_3d<i32_texel_format, readable>, coords: vec3<C>) -> vec4<i32>
+@must_use fn textureLoad[C: iu32](texture: texture_storage_3d<u32_texel_format, readable>, coords: vec3<C>) -> vec4<u32>
 
-@stage("fragment", "compute") fn atomicLoad<T: iu32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>) -> T
-@stage("fragment", "compute") fn atomicStore<T: iu32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T)
-@stage("fragment", "compute") fn atomicAdd<T: iu32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T
-@stage("fragment", "compute") fn atomicSub<T: iu32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T
-@stage("fragment", "compute") fn atomicMax<T: iu32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T
-@stage("fragment", "compute") fn atomicMin<T: iu32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T
-@stage("fragment", "compute") fn atomicAnd<T: iu32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T
-@stage("fragment", "compute") fn atomicOr<T: iu32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T
-@stage("fragment", "compute") fn atomicXor<T: iu32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T
-@stage("fragment", "compute") fn atomicExchange<T: iu32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T
-@stage("fragment", "compute") fn atomicCompareExchangeWeak<T: iu32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T, T) -> __atomic_compare_exchange_result<T>
+@stage("fragment", "compute") fn atomicLoad[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>) -> T
+@stage("fragment", "compute") fn atomicStore[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, T)
+@stage("fragment", "compute") fn atomicAdd[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T
+@stage("fragment", "compute") fn atomicSub[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T
+@stage("fragment", "compute") fn atomicMax[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T
+@stage("fragment", "compute") fn atomicMin[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T
+@stage("fragment", "compute") fn atomicAnd[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T
+@stage("fragment", "compute") fn atomicOr[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T
+@stage("fragment", "compute") fn atomicXor[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T
+@stage("fragment", "compute") fn atomicExchange[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T
+@stage("fragment", "compute") fn atomicCompareExchangeWeak[T: iu32, S: workgroup_or_storage](ptr<S, atomic<T>, read_write>, T, T) -> __atomic_compare_exchange_result<T>
 
 @must_use @stage("compute") fn subgroupBallot() -> vec4<u32>
-@must_use @stage("compute") fn subgroupBroadcast<T: fiu32_f16>(value: T, @const sourceLaneIndex: u32) -> T
-@must_use @stage("compute") fn subgroupBroadcast<N: num, T: fiu32_f16>(value: vec<N, T>, @const sourceLaneIndex: u32) -> vec<N, T>
+@must_use @stage("compute") fn subgroupBroadcast[T: fiu32_f16](value: T, @const sourceLaneIndex: u32) -> T
+@must_use @stage("compute") fn subgroupBroadcast[N: num, T: fiu32_f16](value: vec<N, T>, @const sourceLaneIndex: u32) -> vec<N, T>
 
 ////////////////////////////////////////////////////////////////////////////////
 // Value constructors                                                         //
@@ -752,18 +752,18 @@
 @must_use @const("Zero") ctor vec2() -> vec2<ia>
 @must_use @const("Zero") ctor vec3() -> vec3<ia>
 @must_use @const("Zero") ctor vec4() -> vec4<ia>
-@must_use @const("Zero") ctor vec2<T: concrete_scalar>() -> vec2<T>
-@must_use @const("Zero") ctor vec3<T: concrete_scalar>() -> vec3<T>
-@must_use @const("Zero") ctor vec4<T: concrete_scalar>() -> vec4<T>
-@must_use @const("Zero") ctor mat2x2<T: f32_f16>() -> mat2x2<T>
-@must_use @const("Zero") ctor mat2x3<T: f32_f16>() -> mat2x3<T>
-@must_use @const("Zero") ctor mat2x4<T: f32_f16>() -> mat2x4<T>
-@must_use @const("Zero") ctor mat3x2<T: f32_f16>() -> mat3x2<T>
-@must_use @const("Zero") ctor mat3x3<T: f32_f16>() -> mat3x3<T>
-@must_use @const("Zero") ctor mat3x4<T: f32_f16>() -> mat3x4<T>
-@must_use @const("Zero") ctor mat4x2<T: f32_f16>() -> mat4x2<T>
-@must_use @const("Zero") ctor mat4x3<T: f32_f16>() -> mat4x3<T>
-@must_use @const("Zero") ctor mat4x4<T: f32_f16>() -> mat4x4<T>
+@must_use @const("Zero") ctor vec2[T: concrete_scalar]() -> vec2<T>
+@must_use @const("Zero") ctor vec3[T: concrete_scalar]() -> vec3<T>
+@must_use @const("Zero") ctor vec4[T: concrete_scalar]() -> vec4<T>
+@must_use @const("Zero") ctor mat2x2[T: f32_f16]() -> mat2x2<T>
+@must_use @const("Zero") ctor mat2x3[T: f32_f16]() -> mat2x3<T>
+@must_use @const("Zero") ctor mat2x4[T: f32_f16]() -> mat2x4<T>
+@must_use @const("Zero") ctor mat3x2[T: f32_f16]() -> mat3x2<T>
+@must_use @const("Zero") ctor mat3x3[T: f32_f16]() -> mat3x3<T>
+@must_use @const("Zero") ctor mat3x4[T: f32_f16]() -> mat3x4<T>
+@must_use @const("Zero") ctor mat4x2[T: f32_f16]() -> mat4x2<T>
+@must_use @const("Zero") ctor mat4x3[T: f32_f16]() -> mat4x3<T>
+@must_use @const("Zero") ctor mat4x4[T: f32_f16]() -> mat4x4<T>
 
 // Identity constructors
 @must_use @const("Identity") ctor i32(i32) -> i32
@@ -771,136 +771,136 @@
 @must_use @const("Identity") ctor f32(f32) -> f32
 @must_use @const("Identity") ctor f16(f16) -> f16
 @must_use @const("Identity") ctor bool(bool) -> bool
-@must_use @const("Identity") ctor vec2<T: scalar>(vec2<T>) -> vec2<T>
-@must_use @const("Identity") ctor vec3<T: scalar>(vec3<T>) -> vec3<T>
-@must_use @const("Identity") ctor vec4<T: scalar>(vec4<T>) -> vec4<T>
-@must_use @const("Identity") ctor mat2x2<T: f32_f16>(mat2x2<T>) -> mat2x2<T>
-@must_use @const("Identity") ctor mat2x3<T: f32_f16>(mat2x3<T>) -> mat2x3<T>
-@must_use @const("Identity") ctor mat2x4<T: f32_f16>(mat2x4<T>) -> mat2x4<T>
-@must_use @const("Identity") ctor mat3x2<T: f32_f16>(mat3x2<T>) -> mat3x2<T>
-@must_use @const("Identity") ctor mat3x3<T: f32_f16>(mat3x3<T>) -> mat3x3<T>
-@must_use @const("Identity") ctor mat3x4<T: f32_f16>(mat3x4<T>) -> mat3x4<T>
-@must_use @const("Identity") ctor mat4x2<T: f32_f16>(mat4x2<T>) -> mat4x2<T>
-@must_use @const("Identity") ctor mat4x3<T: f32_f16>(mat4x3<T>) -> mat4x3<T>
-@must_use @const("Identity") ctor mat4x4<T: f32_f16>(mat4x4<T>) -> mat4x4<T>
+@must_use @const("Identity") ctor vec2[T: scalar](vec2<T>) -> vec2<T>
+@must_use @const("Identity") ctor vec3[T: scalar](vec3<T>) -> vec3<T>
+@must_use @const("Identity") ctor vec4[T: scalar](vec4<T>) -> vec4<T>
+@must_use @const("Identity") ctor mat2x2[T: f32_f16](mat2x2<T>) -> mat2x2<T>
+@must_use @const("Identity") ctor mat2x3[T: f32_f16](mat2x3<T>) -> mat2x3<T>
+@must_use @const("Identity") ctor mat2x4[T: f32_f16](mat2x4<T>) -> mat2x4<T>
+@must_use @const("Identity") ctor mat3x2[T: f32_f16](mat3x2<T>) -> mat3x2<T>
+@must_use @const("Identity") ctor mat3x3[T: f32_f16](mat3x3<T>) -> mat3x3<T>
+@must_use @const("Identity") ctor mat3x4[T: f32_f16](mat3x4<T>) -> mat3x4<T>
+@must_use @const("Identity") ctor mat4x2[T: f32_f16](mat4x2<T>) -> mat4x2<T>
+@must_use @const("Identity") ctor mat4x3[T: f32_f16](mat4x3<T>) -> mat4x3<T>
+@must_use @const("Identity") ctor mat4x4[T: f32_f16](mat4x4<T>) -> mat4x4<T>
 
 // Vector constructors (splat)
-@must_use @const("VecSplat") ctor vec2<T: scalar>(T) -> vec2<T>
-@must_use @const("VecSplat") ctor vec3<T: scalar>(T) -> vec3<T>
-@must_use @const("VecSplat") ctor vec4<T: scalar>(T) -> vec4<T>
+@must_use @const("VecSplat") ctor vec2[T: scalar](T) -> vec2<T>
+@must_use @const("VecSplat") ctor vec3[T: scalar](T) -> vec3<T>
+@must_use @const("VecSplat") ctor vec4[T: scalar](T) -> vec4<T>
 
 // Vector constructors (scalar)
-@must_use @const("VecInitS") ctor vec2<T: scalar>(x: T, y: T) -> vec2<T>
-@must_use @const("VecInitS") ctor vec3<T: scalar>(x: T, y: T, z: T) -> vec3<T>
-@must_use @const("VecInitS") ctor vec4<T: scalar>(x: T, y: T, z: T, w: T) -> vec4<T>
+@must_use @const("VecInitS") ctor vec2[T: scalar](x: T, y: T) -> vec2<T>
+@must_use @const("VecInitS") ctor vec3[T: scalar](x: T, y: T, z: T) -> vec3<T>
+@must_use @const("VecInitS") ctor vec4[T: scalar](x: T, y: T, z: T, w: T) -> vec4<T>
 
 // Vector constructors (mixed)
-@must_use @const("VecInitM") ctor vec3<T: scalar>(xy: vec2<T>, z: T) -> vec3<T>
-@must_use @const("VecInitM") ctor vec3<T: scalar>(x: T, yz: vec2<T>) -> vec3<T>
-@must_use @const("VecInitM") ctor vec4<T: scalar>(xy: vec2<T>, z: T, w: T) -> vec4<T>
-@must_use @const("VecInitM") ctor vec4<T: scalar>(x: T, yz: vec2<T>, w: T) -> vec4<T>
-@must_use @const("VecInitM") ctor vec4<T: scalar>(x: T, y: T, zw: vec2<T>) -> vec4<T>
-@must_use @const("VecInitM") ctor vec4<T: scalar>(xy: vec2<T>, zw: vec2<T>) -> vec4<T>
-@must_use @const("VecInitM") ctor vec4<T: scalar>(xyz: vec3<T>, w: T) -> vec4<T>
-@must_use @const("VecInitM") ctor vec4<T: scalar>(x: T, zyw: vec3<T>) -> vec4<T>
+@must_use @const("VecInitM") ctor vec3[T: scalar](xy: vec2<T>, z: T) -> vec3<T>
+@must_use @const("VecInitM") ctor vec3[T: scalar](x: T, yz: vec2<T>) -> vec3<T>
+@must_use @const("VecInitM") ctor vec4[T: scalar](xy: vec2<T>, z: T, w: T) -> vec4<T>
+@must_use @const("VecInitM") ctor vec4[T: scalar](x: T, yz: vec2<T>, w: T) -> vec4<T>
+@must_use @const("VecInitM") ctor vec4[T: scalar](x: T, y: T, zw: vec2<T>) -> vec4<T>
+@must_use @const("VecInitM") ctor vec4[T: scalar](xy: vec2<T>, zw: vec2<T>) -> vec4<T>
+@must_use @const("VecInitM") ctor vec4[T: scalar](xyz: vec3<T>, w: T) -> vec4<T>
+@must_use @const("VecInitM") ctor vec4[T: scalar](x: T, zyw: vec3<T>) -> vec4<T>
 
 // Matrix constructors (scalar)
 @must_use @const("MatInitS")
-ctor mat2x2<T: fa_f32_f16>(T, T,
+ctor mat2x2[T: fa_f32_f16](T, T,
                            T, T) -> mat2x2<T>
 @must_use @const("MatInitS")
-ctor mat2x3<T: fa_f32_f16>(T, T, T,
+ctor mat2x3[T: fa_f32_f16](T, T, T,
                            T, T, T) -> mat2x3<T>
 @must_use @const("MatInitS")
-ctor mat2x4<T: fa_f32_f16>(T, T, T, T,
+ctor mat2x4[T: fa_f32_f16](T, T, T, T,
                            T, T, T, T) -> mat2x4<T>
 @must_use @const("MatInitS")
-ctor mat3x2<T: fa_f32_f16>(T, T,
+ctor mat3x2[T: fa_f32_f16](T, T,
                            T, T,
                            T, T) -> mat3x2<T>
 @must_use @const("MatInitS")
-ctor mat3x3<T: fa_f32_f16>(T, T, T,
+ctor mat3x3[T: fa_f32_f16](T, T, T,
                            T, T, T,
                            T, T, T) -> mat3x3<T>
 @must_use @const("MatInitS")
-ctor mat3x4<T: fa_f32_f16>(T, T, T, T,
+ctor mat3x4[T: fa_f32_f16](T, T, T, T,
                            T, T, T, T,
                            T, T, T, T) -> mat3x4<T>
 @must_use @const("MatInitS")
-ctor mat4x2<T: fa_f32_f16>(T, T,
+ctor mat4x2[T: fa_f32_f16](T, T,
                            T, T,
                            T, T,
                            T, T) -> mat4x2<T>
 @must_use @const("MatInitS")
-ctor mat4x3<T: fa_f32_f16>(T, T, T,
+ctor mat4x3[T: fa_f32_f16](T, T, T,
                            T, T, T,
                            T, T, T,
                            T, T, T) -> mat4x3<T>
 @must_use @const("MatInitS")
-ctor mat4x4<T: fa_f32_f16>(T, T, T, T,
+ctor mat4x4[T: fa_f32_f16](T, T, T, T,
                            T, T, T, T,
                            T, T, T, T,
                            T, T, T, T) -> mat4x4<T>
 
 // Matrix constructors (column vectors)
-@must_use @const("MatInitV") ctor mat2x2<T: fa_f32_f16>(vec2<T>, vec2<T>) -> mat2x2<T>
-@must_use @const("MatInitV") ctor mat2x3<T: fa_f32_f16>(vec3<T>, vec3<T>) -> mat2x3<T>
-@must_use @const("MatInitV") ctor mat2x4<T: fa_f32_f16>(vec4<T>, vec4<T>) -> mat2x4<T>
-@must_use @const("MatInitV") ctor mat3x2<T: fa_f32_f16>(vec2<T>, vec2<T>, vec2<T>) -> mat3x2<T>
-@must_use @const("MatInitV") ctor mat3x3<T: fa_f32_f16>(vec3<T>, vec3<T>, vec3<T>) -> mat3x3<T>
-@must_use @const("MatInitV") ctor mat3x4<T: fa_f32_f16>(vec4<T>, vec4<T>, vec4<T>) -> mat3x4<T>
-@must_use @const("MatInitV") ctor mat4x2<T: fa_f32_f16>(vec2<T>, vec2<T>, vec2<T>, vec2<T>) -> mat4x2<T>
-@must_use @const("MatInitV") ctor mat4x3<T: fa_f32_f16>(vec3<T>, vec3<T>, vec3<T>, vec3<T>) -> mat4x3<T>
-@must_use @const("MatInitV") ctor mat4x4<T: fa_f32_f16>(vec4<T>, vec4<T>, vec4<T>, vec4<T>) -> mat4x4<T>
+@must_use @const("MatInitV") ctor mat2x2[T: fa_f32_f16](vec2<T>, vec2<T>) -> mat2x2<T>
+@must_use @const("MatInitV") ctor mat2x3[T: fa_f32_f16](vec3<T>, vec3<T>) -> mat2x3<T>
+@must_use @const("MatInitV") ctor mat2x4[T: fa_f32_f16](vec4<T>, vec4<T>) -> mat2x4<T>
+@must_use @const("MatInitV") ctor mat3x2[T: fa_f32_f16](vec2<T>, vec2<T>, vec2<T>) -> mat3x2<T>
+@must_use @const("MatInitV") ctor mat3x3[T: fa_f32_f16](vec3<T>, vec3<T>, vec3<T>) -> mat3x3<T>
+@must_use @const("MatInitV") ctor mat3x4[T: fa_f32_f16](vec4<T>, vec4<T>, vec4<T>) -> mat3x4<T>
+@must_use @const("MatInitV") ctor mat4x2[T: fa_f32_f16](vec2<T>, vec2<T>, vec2<T>, vec2<T>) -> mat4x2<T>
+@must_use @const("MatInitV") ctor mat4x3[T: fa_f32_f16](vec3<T>, vec3<T>, vec3<T>, vec3<T>) -> mat4x3<T>
+@must_use @const("MatInitV") ctor mat4x4[T: fa_f32_f16](vec4<T>, vec4<T>, vec4<T>, vec4<T>) -> mat4x4<T>
 
 ////////////////////////////////////////////////////////////////////////////////
 // Value conversions                                                          //
 ////////////////////////////////////////////////////////////////////////////////
-@must_use @const conv f32<T: scalar_no_f32>(T) -> f32
-@must_use @const conv f16<T: scalar_no_f16>(T) -> f16
-@must_use @const conv i32<T: scalar_no_i32>(T) -> i32
-@must_use @const conv u32<T: scalar_no_u32>(T) -> u32
-@must_use @const conv bool<T: scalar_no_bool>(T) -> bool
+@must_use @const conv f32[T: scalar_no_f32](T) -> f32
+@must_use @const conv f16[T: scalar_no_f16](T) -> f16
+@must_use @const conv i32[T: scalar_no_i32](T) -> i32
+@must_use @const conv u32[T: scalar_no_u32](T) -> u32
+@must_use @const conv bool[T: scalar_no_bool](T) -> bool
 
-@must_use @const conv vec2<T: f32, U: scalar_no_f32>(vec2<U>) -> vec2<f32>
-@must_use @const conv vec2<T: f16, U: scalar_no_f16>(vec2<U>) -> vec2<f16>
-@must_use @const conv vec2<T: i32, U: scalar_no_i32>(vec2<U>) -> vec2<i32>
-@must_use @const conv vec2<T: u32, U: scalar_no_u32>(vec2<U>) -> vec2<u32>
-@must_use @const conv vec2<T: bool, U: scalar_no_bool>(vec2<U>) -> vec2<bool>
+@must_use @const conv vec2[T: f32, U: scalar_no_f32](vec2<U>) -> vec2<f32>
+@must_use @const conv vec2[T: f16, U: scalar_no_f16](vec2<U>) -> vec2<f16>
+@must_use @const conv vec2[T: i32, U: scalar_no_i32](vec2<U>) -> vec2<i32>
+@must_use @const conv vec2[T: u32, U: scalar_no_u32](vec2<U>) -> vec2<u32>
+@must_use @const conv vec2[T: bool, U: scalar_no_bool](vec2<U>) -> vec2<bool>
 
-@must_use @const conv vec3<T: f32, U: scalar_no_f32>(vec3<U>) -> vec3<f32>
-@must_use @const conv vec3<T: f16, U: scalar_no_f16>(vec3<U>) -> vec3<f16>
-@must_use @const conv vec3<T: i32, U: scalar_no_i32>(vec3<U>) -> vec3<i32>
-@must_use @const conv vec3<T: u32, U: scalar_no_u32>(vec3<U>) -> vec3<u32>
-@must_use @const conv vec3<T: bool, U: scalar_no_bool>(vec3<U>) -> vec3<bool>
+@must_use @const conv vec3[T: f32, U: scalar_no_f32](vec3<U>) -> vec3<f32>
+@must_use @const conv vec3[T: f16, U: scalar_no_f16](vec3<U>) -> vec3<f16>
+@must_use @const conv vec3[T: i32, U: scalar_no_i32](vec3<U>) -> vec3<i32>
+@must_use @const conv vec3[T: u32, U: scalar_no_u32](vec3<U>) -> vec3<u32>
+@must_use @const conv vec3[T: bool, U: scalar_no_bool](vec3<U>) -> vec3<bool>
 
-@must_use @const conv vec4<T: f32, U: scalar_no_f32>(vec4<U>) -> vec4<f32>
-@must_use @const conv vec4<T: f16, U: scalar_no_f16>(vec4<U>) -> vec4<f16>
-@must_use @const conv vec4<T: i32, U: scalar_no_i32>(vec4<U>) -> vec4<i32>
-@must_use @const conv vec4<T: u32, U: scalar_no_u32>(vec4<U>) -> vec4<u32>
-@must_use @const conv vec4<T: bool, U: scalar_no_bool>(vec4<U>) -> vec4<bool>
+@must_use @const conv vec4[T: f32, U: scalar_no_f32](vec4<U>) -> vec4<f32>
+@must_use @const conv vec4[T: f16, U: scalar_no_f16](vec4<U>) -> vec4<f16>
+@must_use @const conv vec4[T: i32, U: scalar_no_i32](vec4<U>) -> vec4<i32>
+@must_use @const conv vec4[T: u32, U: scalar_no_u32](vec4<U>) -> vec4<u32>
+@must_use @const conv vec4[T: bool, U: scalar_no_bool](vec4<U>) -> vec4<bool>
 
-@must_use @const conv mat2x2<T: f16>(mat2x2<f32>) -> mat2x2<f16>
-@must_use @const conv mat2x2<T: f32>(mat2x2<f16>) -> mat2x2<f32>
-@must_use @const conv mat2x3<T: f16>(mat2x3<f32>) -> mat2x3<f16>
-@must_use @const conv mat2x3<T: f32>(mat2x3<f16>) -> mat2x3<f32>
-@must_use @const conv mat2x4<T: f16>(mat2x4<f32>) -> mat2x4<f16>
-@must_use @const conv mat2x4<T: f32>(mat2x4<f16>) -> mat2x4<f32>
-@must_use @const conv mat3x2<T: f16>(mat3x2<f32>) -> mat3x2<f16>
-@must_use @const conv mat3x2<T: f32>(mat3x2<f16>) -> mat3x2<f32>
-@must_use @const conv mat3x3<T: f16>(mat3x3<f32>) -> mat3x3<f16>
-@must_use @const conv mat3x3<T: f32>(mat3x3<f16>) -> mat3x3<f32>
-@must_use @const conv mat3x4<T: f16>(mat3x4<f32>) -> mat3x4<f16>
-@must_use @const conv mat3x4<T: f32>(mat3x4<f16>) -> mat3x4<f32>
-@must_use @const conv mat4x2<T: f16>(mat4x2<f32>) -> mat4x2<f16>
-@must_use @const conv mat4x2<T: f32>(mat4x2<f16>) -> mat4x2<f32>
-@must_use @const conv mat4x3<T: f16>(mat4x3<f32>) -> mat4x3<f16>
-@must_use @const conv mat4x3<T: f32>(mat4x3<f16>) -> mat4x3<f32>
-@must_use @const conv mat4x4<T: f16>(mat4x4<f32>) -> mat4x4<f16>
-@must_use @const conv mat4x4<T: f32>(mat4x4<f16>) -> mat4x4<f32>
+@must_use @const conv mat2x2[T: f16](mat2x2<f32>) -> mat2x2<f16>
+@must_use @const conv mat2x2[T: f32](mat2x2<f16>) -> mat2x2<f32>
+@must_use @const conv mat2x3[T: f16](mat2x3<f32>) -> mat2x3<f16>
+@must_use @const conv mat2x3[T: f32](mat2x3<f16>) -> mat2x3<f32>
+@must_use @const conv mat2x4[T: f16](mat2x4<f32>) -> mat2x4<f16>
+@must_use @const conv mat2x4[T: f32](mat2x4<f16>) -> mat2x4<f32>
+@must_use @const conv mat3x2[T: f16](mat3x2<f32>) -> mat3x2<f16>
+@must_use @const conv mat3x2[T: f32](mat3x2<f16>) -> mat3x2<f32>
+@must_use @const conv mat3x3[T: f16](mat3x3<f32>) -> mat3x3<f16>
+@must_use @const conv mat3x3[T: f32](mat3x3<f16>) -> mat3x3<f32>
+@must_use @const conv mat3x4[T: f16](mat3x4<f32>) -> mat3x4<f16>
+@must_use @const conv mat3x4[T: f32](mat3x4<f16>) -> mat3x4<f32>
+@must_use @const conv mat4x2[T: f16](mat4x2<f32>) -> mat4x2<f16>
+@must_use @const conv mat4x2[T: f32](mat4x2<f16>) -> mat4x2<f32>
+@must_use @const conv mat4x3[T: f16](mat4x3<f32>) -> mat4x3<f16>
+@must_use @const conv mat4x3[T: f32](mat4x3<f16>) -> mat4x3<f32>
+@must_use @const conv mat4x4[T: f16](mat4x4<f32>) -> mat4x4<f16>
+@must_use @const conv mat4x4[T: f32](mat4x4<f16>) -> mat4x4<f32>
 
 // Conversion from vec3 to internal __packed_vec3 type.
-@must_use @const conv packedVec3<T: concrete_scalar>(vec3<T>) -> packedVec3<T>
+@must_use @const conv packedVec3[T: concrete_scalar](vec3<T>) -> packedVec3<T>
 
 ////////////////////////////////////////////////////////////////////////////////
 // Operators                                                                  //
@@ -919,90 +919,90 @@
 // Unary Operators                                                            //
 ////////////////////////////////////////////////////////////////////////////////
 @must_use @const op ! (bool) -> bool
-@must_use @const op ! <N: num> (vec<N, bool>) -> vec<N, bool>
+@must_use @const op ! [N: num](vec<N, bool>) -> vec<N, bool>
 
-@must_use @const op ~ <T: ia_iu32>(T) -> T
-@must_use @const op ~ <T: ia_iu32, N: num> (vec<N, T>) -> vec<N, T>
+@must_use @const op ~ [T: ia_iu32](T) -> T
+@must_use @const op ~ [T: ia_iu32, N: num](vec<N, T>) -> vec<N, T>
 
-@must_use @const("UnaryMinus") op - <T: fia_fi32_f16>(T) -> T
-@must_use @const("UnaryMinus") op - <T: fia_fi32_f16, N: num> (vec<N, T>) -> vec<N, T>
+@must_use @const("UnaryMinus") op - [T: fia_fi32_f16](T) -> T
+@must_use @const("UnaryMinus") op - [T: fia_fi32_f16, N: num](vec<N, T>) -> vec<N, T>
 
 ////////////////////////////////////////////////////////////////////////////////
 // Binary Operators                                                           //
 ////////////////////////////////////////////////////////////////////////////////
-@must_use @const op + <T: fia_fiu32_f16>(T, T) -> T
-@must_use @const op + <T: fia_fiu32_f16, N: num> (vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const op + <T: fia_fiu32_f16, N: num> (vec<N, T>, T) -> vec<N, T>
-@must_use @const op + <T: fia_fiu32_f16, N: num> (T, vec<N, T>) -> vec<N, T>
-@must_use @const op + <T: fa_f32_f16, N: num, M: num> (mat<N, M, T>, mat<N, M, T>) -> mat<N, M, T>
+@must_use @const op + [T: fia_fiu32_f16](T, T) -> T
+@must_use @const op + [T: fia_fiu32_f16, N: num](vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const op + [T: fia_fiu32_f16, N: num](vec<N, T>, T) -> vec<N, T>
+@must_use @const op + [T: fia_fiu32_f16, N: num](T, vec<N, T>) -> vec<N, T>
+@must_use @const op + [T: fa_f32_f16, N: num, M: num](mat<N, M, T>, mat<N, M, T>) -> mat<N, M, T>
 
-@must_use @const op - <T: fia_fiu32_f16>(T, T) -> T
-@must_use @const op - <T: fia_fiu32_f16, N: num> (vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const op - <T: fia_fiu32_f16, N: num> (vec<N, T>, T) -> vec<N, T>
-@must_use @const op - <T: fia_fiu32_f16, N: num> (T, vec<N, T>) -> vec<N, T>
-@must_use @const op - <T: fa_f32_f16, N: num, M: num> (mat<N, M, T>, mat<N, M, T>) -> mat<N, M, T>
+@must_use @const op - [T: fia_fiu32_f16](T, T) -> T
+@must_use @const op - [T: fia_fiu32_f16, N: num](vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const op - [T: fia_fiu32_f16, N: num](vec<N, T>, T) -> vec<N, T>
+@must_use @const op - [T: fia_fiu32_f16, N: num](T, vec<N, T>) -> vec<N, T>
+@must_use @const op - [T: fa_f32_f16, N: num, M: num](mat<N, M, T>, mat<N, M, T>) -> mat<N, M, T>
 
-@must_use @const("Multiply") op * <T: fia_fiu32_f16>(T, T) -> T
-@must_use @const("Multiply") op * <T: fia_fiu32_f16, N: num> (vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const("Multiply") op * <T: fia_fiu32_f16, N: num> (vec<N, T>, T) -> vec<N, T>
-@must_use @const("Multiply") op * <T: fia_fiu32_f16, N: num> (T, vec<N, T>) -> vec<N, T>
-@must_use @const("Multiply") op * <T: fa_f32_f16, N: num, M: num> (T, mat<N, M, T>) -> mat<N, M, T>
-@must_use @const("Multiply") op * <T: fa_f32_f16, N: num, M: num> (mat<N, M, T>, T) -> mat<N, M, T>
-@must_use @const("MultiplyMatVec") op * <T: fa_f32_f16, C: num, R: num> (mat<C, R, T>, vec<C, T>) -> vec<R, T>
-@must_use @const("MultiplyVecMat") op * <T: fa_f32_f16, C: num, R: num> (vec<R, T>, mat<C, R, T>) -> vec<C, T>
-@must_use @const("MultiplyMatMat") op * <T: fa_f32_f16, K: num, C: num, R: num> (mat<K, R, T>, mat<C, K, T>) -> mat<C, R, T>
+@must_use @const("Multiply") op * [T: fia_fiu32_f16](T, T) -> T
+@must_use @const("Multiply") op * [T: fia_fiu32_f16, N: num](vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const("Multiply") op * [T: fia_fiu32_f16, N: num](vec<N, T>, T) -> vec<N, T>
+@must_use @const("Multiply") op * [T: fia_fiu32_f16, N: num](T, vec<N, T>) -> vec<N, T>
+@must_use @const("Multiply") op * [T: fa_f32_f16, N: num, M: num](T, mat<N, M, T>) -> mat<N, M, T>
+@must_use @const("Multiply") op * [T: fa_f32_f16, N: num, M: num](mat<N, M, T>, T) -> mat<N, M, T>
+@must_use @const("MultiplyMatVec") op * [T: fa_f32_f16, C: num, R: num](mat<C, R, T>, vec<C, T>) -> vec<R, T>
+@must_use @const("MultiplyVecMat") op * [T: fa_f32_f16, C: num, R: num](vec<R, T>, mat<C, R, T>) -> vec<C, T>
+@must_use @const("MultiplyMatMat") op * [T: fa_f32_f16, K: num, C: num, R: num](mat<K, R, T>, mat<C, K, T>) -> mat<C, R, T>
 
-@must_use @const op / <T: fia_fiu32_f16>(T, T) -> T
-@must_use @const op / <T: fia_fiu32_f16, N: num> (vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const op / <T: fia_fiu32_f16, N: num> (vec<N, T>, T) -> vec<N, T>
-@must_use @const op / <T: fia_fiu32_f16, N: num> (T, vec<N, T>) -> vec<N, T>
+@must_use @const op / [T: fia_fiu32_f16](T, T) -> T
+@must_use @const op / [T: fia_fiu32_f16, N: num](vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const op / [T: fia_fiu32_f16, N: num](vec<N, T>, T) -> vec<N, T>
+@must_use @const op / [T: fia_fiu32_f16, N: num](T, vec<N, T>) -> vec<N, T>
 
-@must_use @const op % <T: fia_fiu32_f16>(T, T) -> T
-@must_use @const op % <T: fia_fiu32_f16, N: num> (vec<N, T>, vec<N, T>) -> vec<N, T>
-@must_use @const op % <T: fia_fiu32_f16, N: num> (vec<N, T>, T) -> vec<N, T>
-@must_use @const op % <T: fia_fiu32_f16, N: num> (T, vec<N, T>) -> vec<N, T>
+@must_use @const op % [T: fia_fiu32_f16](T, T) -> T
+@must_use @const op % [T: fia_fiu32_f16, N: num](vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const op % [T: fia_fiu32_f16, N: num](vec<N, T>, T) -> vec<N, T>
+@must_use @const op % [T: fia_fiu32_f16, N: num](T, vec<N, T>) -> vec<N, T>
 
-@must_use @const op ^ <T: ia_iu32>(T, T) -> T
-@must_use @const op ^ <T: ia_iu32, N: num> (vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const op ^ [T: ia_iu32](T, T) -> T
+@must_use @const op ^ [T: ia_iu32, N: num](vec<N, T>, vec<N, T>) -> vec<N, T>
 
 @must_use @const op & (bool, bool) -> bool
-@must_use @const op & <N: num> (vec<N, bool>, vec<N, bool>) -> vec<N, bool>
-@must_use @const op & <T: ia_iu32>(T, T) -> T
-@must_use @const op & <T: ia_iu32, N: num> (vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const op & [N: num](vec<N, bool>, vec<N, bool>) -> vec<N, bool>
+@must_use @const op & [T: ia_iu32](T, T) -> T
+@must_use @const op & [T: ia_iu32, N: num](vec<N, T>, vec<N, T>) -> vec<N, T>
 
 @must_use @const op | (bool, bool) -> bool
-@must_use @const op | <N: num> (vec<N, bool>, vec<N, bool>) -> vec<N, bool>
-@must_use @const op | <T: ia_iu32>(T, T) -> T
-@must_use @const op | <T: ia_iu32, N: num> (vec<N, T>, vec<N, T>) -> vec<N, T>
+@must_use @const op | [N: num](vec<N, bool>, vec<N, bool>) -> vec<N, bool>
+@must_use @const op | [T: ia_iu32](T, T) -> T
+@must_use @const op | [T: ia_iu32, N: num](vec<N, T>, vec<N, T>) -> vec<N, T>
 
 @must_use @const op && (bool, bool) -> bool
 @must_use @const op || (bool, bool) -> bool
 
-@must_use @const op == <T: scalar>(T, T) -> bool
-@must_use @const op == <T: scalar, N: num> (vec<N, T>, vec<N, T>) -> vec<N, bool>
+@must_use @const op == [T: scalar](T, T) -> bool
+@must_use @const op == [T: scalar, N: num](vec<N, T>, vec<N, T>) -> vec<N, bool>
 
-@must_use @const op != <T: scalar>(T, T) -> bool
-@must_use @const op != <T: scalar, N: num> (vec<N, T>, vec<N, T>) -> vec<N, bool>
+@must_use @const op != [T: scalar](T, T) -> bool
+@must_use @const op != [T: scalar, N: num](vec<N, T>, vec<N, T>) -> vec<N, bool>
 
-@must_use @const op < <T: fia_fiu32_f16>(T, T) -> bool
-@must_use @const op < <T: fia_fiu32_f16, N: num> (vec<N, T>, vec<N, T>) -> vec<N, bool>
+@must_use @const op < [T: fia_fiu32_f16](T, T) -> bool
+@must_use @const op < [T: fia_fiu32_f16, N: num](vec<N, T>, vec<N, T>) -> vec<N, bool>
 
-@must_use @const op > <T: fia_fiu32_f16>(T, T) -> bool
-@must_use @const op > <T: fia_fiu32_f16, N: num> (vec<N, T>, vec<N, T>) -> vec<N, bool>
+@must_use @const op > [T: fia_fiu32_f16](T, T) -> bool
+@must_use @const op > [T: fia_fiu32_f16, N: num](vec<N, T>, vec<N, T>) -> vec<N, bool>
 
-@must_use @const op <= <T: fia_fiu32_f16>(T, T) -> bool
-@must_use @const op <= <T: fia_fiu32_f16, N: num> (vec<N, T>, vec<N, T>) -> vec<N, bool>
+@must_use @const op <= [T: fia_fiu32_f16](T, T) -> bool
+@must_use @const op <= [T: fia_fiu32_f16, N: num](vec<N, T>, vec<N, T>) -> vec<N, bool>
 
-@must_use @const op >= <T: fia_fiu32_f16>(T, T) -> bool
-@must_use @const op >= <T: fia_fiu32_f16, N: num> (vec<N, T>, vec<N, T>) -> vec<N, bool>
+@must_use @const op >= [T: fia_fiu32_f16](T, T) -> bool
+@must_use @const op >= [T: fia_fiu32_f16, N: num](vec<N, T>, vec<N, T>) -> vec<N, bool>
 
-@must_use @const op << <T: ia_iu32>(T, u32) -> T
-@must_use @const op << <T: ia_iu32, N: num> (vec<N, T>, vec<N, u32>) -> vec<N, T>
+@must_use @const op << [T: ia_iu32](T, u32) -> T
+@must_use @const op << [T: ia_iu32, N: num](vec<N, T>, vec<N, u32>) -> vec<N, T>
 
-@must_use @const op >> <T: ia_iu32>(T, u32) -> T
-@must_use @const op >> <T: ia_iu32, N: num> (vec<N, T>, vec<N, u32>) -> vec<N, T>
+@must_use @const op >> [T: ia_iu32](T, u32) -> T
+@must_use @const op >> [T: ia_iu32, N: num](vec<N, T>, vec<N, u32>) -> vec<N, T>
 
 ////////////////////////////////////////////////////////////////////////////////
 // Tint internal builtins                                                     //
 ////////////////////////////////////////////////////////////////////////////////
-@const("Identity") fn _tint_materialize<T>(T) -> T
+@const("Identity") fn _tint_materialize[T](T) -> T
diff --git a/tools/src/tint/intrinsic/lexer/lexer.go b/tools/src/tint/intrinsic/lexer/lexer.go
index 480a9e1..7aefb2e 100644
--- a/tools/src/tint/intrinsic/lexer/lexer.go
+++ b/tools/src/tint/intrinsic/lexer/lexer.go
@@ -172,6 +172,8 @@
 			case l.match(">=", tok.Ge):
 			case l.match(">>", tok.Shr):
 			case l.match(">", tok.Gt):
+			case l.match("[", tok.Lbracket):
+			case l.match("]", tok.Rbracket):
 			default:
 				return fmt.Errorf("%v: unexpected '%v'", l.loc, string(l.runes[0]))
 			}
diff --git a/tools/src/tint/intrinsic/parser/parser.go b/tools/src/tint/intrinsic/parser/parser.go
index 86379d4..bd2f055 100644
--- a/tools/src/tint/intrinsic/parser/parser.go
+++ b/tools/src/tint/intrinsic/parser/parser.go
@@ -175,9 +175,8 @@
 		Attributes: decos,
 		Name:       string(name.Runes),
 	}
-	if p.peekIs(0, tok.Lt) {
-		m.TemplateParams = p.templateParams()
-	}
+	m.TemplateParams = p.typeTemplateParams()
+
 	return m
 }
 
@@ -229,9 +228,7 @@
 		Attributes: decos,
 		Name:       string(name.Runes),
 	}
-	if p.peekIs(0, tok.Lt) {
-		f.TemplateParams = p.templateParams()
-	}
+	f.TemplateParams = p.intrinsicTemplateParams()
 	f.Parameters = p.parameters()
 	if p.match(tok.Arrow) != nil {
 		ret := p.templatedName()
@@ -249,9 +246,7 @@
 		Attributes: decos,
 		Name:       string(name.Runes),
 	}
-	if p.peekIs(0, tok.Lt) {
-		f.TemplateParams = p.templateParams()
-	}
+	f.TemplateParams = p.intrinsicTemplateParams()
 	f.Parameters = p.parameters()
 	if p.match(tok.Arrow) != nil {
 		ret := p.templatedName()
@@ -269,9 +264,7 @@
 		Attributes: decos,
 		Name:       string(name.Runes),
 	}
-	if p.peekIs(0, tok.Lt) {
-		f.TemplateParams = p.templateParams()
-	}
+	f.TemplateParams = p.intrinsicTemplateParams()
 	f.Parameters = p.parameters()
 	if p.match(tok.Arrow) != nil {
 		ret := p.templatedName()
@@ -289,9 +282,7 @@
 		Attributes: decos,
 		Name:       string(name.Runes),
 	}
-	if p.peekIs(0, tok.Lt) {
-		f.TemplateParams = p.templateParams()
-	}
+	f.TemplateParams = p.intrinsicTemplateParams()
 	f.Parameters = p.parameters()
 	if p.match(tok.Arrow) != nil {
 		ret := p.templatedName()
@@ -368,16 +359,30 @@
 	return m
 }
 
-func (p *parser) templateParams() []ast.TemplateParam {
+func (p *parser) typeTemplateParams() []ast.TemplateParam {
+	if p.match(tok.Lt) == nil {
+		return nil
+	}
 	t := []ast.TemplateParam{}
-	p.expect(tok.Lt, "template parameter list")
 	for p.err == nil && p.peekIs(0, tok.Identifier) {
 		t = append(t, p.templateParam())
 	}
-	p.expect(tok.Gt, "template parameter list")
+	p.expect(tok.Gt, "type template parameter list")
 	return t
 }
 
+func (p *parser) intrinsicTemplateParams() []ast.TemplateParam {
+	if p.match(tok.Lbracket) == nil {
+		return nil
+	}
+	out := []ast.TemplateParam{}
+	for p.err == nil && p.peekIs(0, tok.Identifier) {
+		out = append(out, p.templateParam())
+	}
+	p.expect(tok.Rbracket, "intrinsic template parameter list")
+	return out
+}
+
 func (p *parser) templateParam() ast.TemplateParam {
 	name := p.match(tok.Identifier)
 	t := ast.TemplateParam{
diff --git a/tools/src/tint/intrinsic/parser/parser_test.go b/tools/src/tint/intrinsic/parser/parser_test.go
index 76ed5cd..9dec76b 100644
--- a/tools/src/tint/intrinsic/parser/parser_test.go
+++ b/tools/src/tint/intrinsic/parser/parser_test.go
@@ -251,7 +251,7 @@
 			},
 		}, { ///////////////////////////////////////////////////////////////////
 			fileutils.ThisLine(),
-			"fn F<A : B<C> >()",
+			"fn F[A : B<C> ]()",
 			ast.AST{
 				Builtins: []ast.IntrinsicDecl{{
 					Kind: ast.Builtin,
@@ -271,7 +271,7 @@
 			},
 		}, { ///////////////////////////////////////////////////////////////////
 			fileutils.ThisLine(),
-			"fn F<T>(a: X, b: Y<T>)",
+			"fn F[T](a: X, b: Y<T>)",
 			ast.AST{
 				Builtins: []ast.IntrinsicDecl{{
 					Kind: ast.Builtin,
@@ -389,7 +389,7 @@
 			},
 		}, { ///////////////////////////////////////////////////////////////////
 			fileutils.ThisLine(),
-			"op F<A : B<C> >()",
+			"op F[A : B<C> ]()",
 			ast.AST{
 				Operators: []ast.IntrinsicDecl{{
 					Kind: ast.Operator,
@@ -409,7 +409,7 @@
 			},
 		}, { ///////////////////////////////////////////////////////////////////
 			fileutils.ThisLine(),
-			"op F<T>(a: X, b: Y<T>)",
+			"op F[T](a: X, b: Y<T>)",
 			ast.AST{
 				Operators: []ast.IntrinsicDecl{{
 					Kind: ast.Operator,
@@ -513,7 +513,7 @@
 			},
 		}, { ///////////////////////////////////////////////////////////////////
 			fileutils.ThisLine(),
-			"ctor F<A : B<C> >()",
+			"ctor F[A : B<C> ]()",
 			ast.AST{
 				Constructors: []ast.IntrinsicDecl{{
 					Kind: ast.Constructor,
@@ -533,7 +533,7 @@
 			},
 		}, { ///////////////////////////////////////////////////////////////////
 			fileutils.ThisLine(),
-			"ctor F<T>(a: X, b: Y<T>)",
+			"ctor F[T](a: X, b: Y<T>)",
 			ast.AST{
 				Constructors: []ast.IntrinsicDecl{{
 					Kind: ast.Constructor,
@@ -637,7 +637,7 @@
 			},
 		}, { ///////////////////////////////////////////////////////////////////
 			fileutils.ThisLine(),
-			"conv F<A : B<C> >()",
+			"conv F[A : B<C> ]()",
 			ast.AST{
 				Converters: []ast.IntrinsicDecl{{
 					Kind: ast.Converter,
@@ -657,7 +657,7 @@
 			},
 		}, { ///////////////////////////////////////////////////////////////////
 			fileutils.ThisLine(),
-			"conv F<T>(a: X, b: Y<T>)",
+			"conv F[T](a: X, b: Y<T>)",
 			ast.AST{
 				Converters: []ast.IntrinsicDecl{{
 					Kind: ast.Converter,
diff --git a/tools/src/tint/intrinsic/resolver/resolver_test.go b/tools/src/tint/intrinsic/resolver/resolver_test.go
index 294691a..c73fd4b 100644
--- a/tools/src/tint/intrinsic/resolver/resolver_test.go
+++ b/tools/src/tint/intrinsic/resolver/resolver_test.go
@@ -73,29 +73,29 @@
 			`fn f()`,
 			success,
 		}, {
-			`fn f<T>()`,
+			`fn f[T]()`,
 			success,
 		}, {
 			`
 type f32
-fn f<N: num>()`,
+fn f[N: num]()`,
 			success,
 		}, {
 			`
 enum e { a b c }
-fn f<N: e>()`,
+fn f[N: e]()`,
 			success,
 		}, {
 			`
 type f32
-fn f<T>(T) -> f32`,
+fn f[T](T) -> f32`,
 			success,
 		}, {
 			`
 type f32
 type P<T>
 match m: f32
-fn f<T: m>(P<T>) -> T`,
+fn f[T: m](P<T>) -> T`,
 			success,
 		}, {
 			`
@@ -108,7 +108,7 @@
 enum e { a b }
 type T<E: e>
 match m: e.a
-fn f<E: m>(T<E>)`,
+fn f[E: m](T<E>)`,
 			success,
 		}, {
 			`
@@ -134,21 +134,21 @@
 		}, {
 			`
 type T<E: num>
-fn f<E: num>(T<E>)`,
+fn f[E: num](T<E>)`,
 			success,
 		}, {
-			`fn f<T>(T)`,
+			`fn f[T](T)`,
 			success,
 		}, {
 			`
 enum e { a b }
-fn f<E: e>()`,
+fn f[E: e]()`,
 			success,
 		}, {
 			`
 enum e { a b }
 match m: e.a | e.b
-fn f<E: m>()`,
+fn f[E: m]()`,
 			success,
 		}, {
 			`
@@ -300,7 +300,7 @@
 			`fn f() -> u`,
 			`file.txt:1:11 cannot resolve 'u'`,
 		}, {
-			`fn f<T: u>()`,
+			`fn f[T: u]()`,
 			`file.txt:1:9 cannot resolve 'u'`,
 		}, {
 			`
@@ -315,7 +315,7 @@
 		}, {
 			`
 type x
-fn f<T>(T<x>)`,
+fn f[T](T<x>)`,
 			`file.txt:2:9 'T' template parameters do not accept template arguments`,
 		}, {
 			`
@@ -348,7 +348,7 @@
 type P<N: num>
 enum E { a b }
 match m: E.a | E.b
-fn f<M: m>(P<M>)`,
+fn f[M: m](P<M>)`,
 			`file.txt:4:14 cannot use template enum 'E' as template number`,
 		}, {
 			`
@@ -373,7 +373,7 @@
 		}, {
 			`
 type x
-op << <T>(T<x>)`,
+op << [T](T<x>)`,
 			`file.txt:2:11 'T' template parameters do not accept template arguments`,
 		}, {
 			`
@@ -413,7 +413,7 @@
 type P<N: num>
 enum E { a b }
 match m: E.a | E.b
-op << <M: m>(P<M>)`,
+op << [M: m](P<M>)`,
 			`file.txt:4:16 cannot use template enum 'E' as template number`,
 		}, {
 			`
@@ -429,7 +429,7 @@
 		}, {
 			`
 type x
-ctor F<T>(T<x>)`,
+ctor F[T](T<x>)`,
 			`file.txt:2:11 'T' template parameters do not accept template arguments`,
 		}, {
 			`
@@ -469,7 +469,7 @@
 type P<N: num>
 enum E { a b }
 match m: E.a | E.b
-ctor F<M: m>(P<M>)`,
+ctor F[M: m](P<M>)`,
 			`file.txt:4:16 cannot use template enum 'E' as template number`,
 		}, {
 			`
@@ -494,7 +494,7 @@
 		}, {
 			`
 type x
-conv F<T>(T<x>)`,
+conv F[T](T<x>)`,
 			`file.txt:2:11 'T' template parameters do not accept template arguments`,
 		}, {
 			`
@@ -534,7 +534,7 @@
 type P<N: num>
 enum E { a b }
 match m: E.a | E.b
-conv F<M: m>(P<M>)`,
+conv F[M: m](P<M>)`,
 			`file.txt:4:16 cannot use template enum 'E' as template number`,
 		}, {
 			`
diff --git a/tools/src/tint/intrinsic/tok/tok.go b/tools/src/tint/intrinsic/tok/tok.go
index ad06175..d9711fc 100644
--- a/tools/src/tint/intrinsic/tok/tok.go
+++ b/tools/src/tint/intrinsic/tok/tok.go
@@ -79,6 +79,8 @@
 	Shr          Kind = ">>"
 	Star         Kind = "*"
 	Xor          Kind = "^"
+	Lbracket     Kind = "["
+	Rbracket     Kind = "]"
 )
 
 // Invalid represents an invalid token