Import Tint changes from Dawn

Changes:
  - 9b726858ff7bf6136c027c4a6074ce64175f3c71 Fast path ASCII in unicode decode. by dan sinclair <dsinclair@chromium.org>
  - ca1b90445654566db21155b8866834bddfbb2382 IWYU: add stdint.h for int types in tint::utils by Stephan Hartmann <stha09@googlemail.com>
  - de42feb949c2d82de37079514a26416544fc5dd0 tint: Add vec2(), vec3(), vec4() by Ben Clayton <bclayton@google.com>
  - 5a5b7dfe92b0e3a72c6a625d670c30b4a754bd1b Add builtin information to Symbol. by dan sinclair <dsinclair@chromium.org>
  - d1d1bf7135d4cd9092a1cf601071a53334c0b21d Split base_src apart. by dan sinclair <dsinclair@chromium.org>
  - 7883a0cb8d2cc0922120ffcc087d629da9e55a66 tint: Add two-token form for diagnostics rule names. by Ben Clayton <bclayton@google.com>
  - 7eb37948abc28ae9ffe7539b23804d8e3c6470f8 tint/reader/wgsl: Have expect_identifier return an ast::I... by Ben Clayton <bclayton@google.com>
  - 45ff7a8c4ae718a9ffb980c174626f2683522854 Remove extra work from `is_reserved` by dan sinclair <dsinclair@chromium.org>
GitOrigin-RevId: 9b726858ff7bf6136c027c4a6074ce64175f3c71
Change-Id: Iaa572434b39a1af9f8e6f00059d6ec993ada664c
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/128500
Commit-Queue: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Copybara Prod <copybara-worker-blackhole@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/tint/BUILD.gn b/src/tint/BUILD.gn
index 663ba05..492e355 100644
--- a/src/tint/BUILD.gn
+++ b/src/tint/BUILD.gn
@@ -131,7 +131,7 @@
     sources += [ "utils/io/tmpfile_other.cc" ]
   }
 
-  deps = [ ":libtint_base_src" ]
+  deps = [ ":libtint_utils_src" ]
 }
 
 ###############################################################################
@@ -147,8 +147,8 @@
   ]
   deps = [
     ":libtint_ast_src",
-    ":libtint_base_src",
     ":libtint_program_src",
+    ":libtint_utils_src",
     ":tint_utils_io",
   ]
 }
@@ -193,7 +193,26 @@
   }
 }
 
-libtint_source_set("libtint_base_src") {
+libtint_source_set("libtint_symbols_src") {
+  sources = [
+    "number.cc",
+    "number.h",
+    "program_id.cc",
+    "program_id.h",
+    "reflection.h",
+    "scope_stack.h",
+    "symbol.cc",
+    "symbol.h",
+    "symbol_table.cc",
+    "symbol_table.h",
+  ]
+  deps = [
+    ":libtint_builtins_src",
+    ":libtint_utils_src",
+  ]
+}
+
+libtint_source_set("libtint_utils_src") {
   sources = [
     "debug.cc",
     "debug.h",
@@ -203,19 +222,9 @@
     "diagnostic/formatter.h",
     "diagnostic/printer.cc",
     "diagnostic/printer.h",
-    "number.cc",
-    "number.h",
-    "program_id.cc",
-    "program_id.h",
-    "reflection.h",
-    "scope_stack.h",
     "source.cc",
     "source.h",
     "switch.h",
-    "symbol.cc",
-    "symbol.h",
-    "symbol_table.cc",
-    "symbol_table.h",
     "utils/bitcast.h",
     "utils/bitset.h",
     "utils/block_allocator.h",
@@ -261,7 +270,10 @@
 
 libtint_source_set("libtint_clone_context_hdrs") {
   sources = [ "clone_context.h" ]
-  deps = [ ":libtint_base_src" ]
+  deps = [
+    ":libtint_symbols_src",
+    ":libtint_utils_src",
+  ]
 }
 
 libtint_source_set("libtint_program_src") {
@@ -299,11 +311,12 @@
 
   deps = [
     ":libtint_ast_hdrs",
-    ":libtint_base_src",
     ":libtint_builtins_src",
     ":libtint_constant_src",
     ":libtint_sem_src",
+    ":libtint_symbols_src",
     ":libtint_type_src",
+    ":libtint_utils_src",
   ]
 }
 
@@ -324,11 +337,11 @@
   ]
   deps = [
     ":libtint_ast_src",
-    ":libtint_base_src",
     ":libtint_builtins_src",
     ":libtint_program_src",
     ":libtint_sem_src",
     ":libtint_type_src",
+    ":libtint_utils_src",
   ]
 }
 
@@ -439,11 +452,12 @@
   ]
   deps = [
     ":libtint_ast_src",
-    ":libtint_base_src",
     ":libtint_builtins_src",
     ":libtint_program_src",
     ":libtint_sem_src",
+    ":libtint_symbols_src",
     ":libtint_type_src",
+    ":libtint_utils_src",
   ]
 }
 
@@ -472,6 +486,7 @@
     "ast/diagnostic_attribute.h",
     "ast/diagnostic_control.h",
     "ast/diagnostic_directive.h",
+    "ast/diagnostic_rule_name.h",
     "ast/disable_validation_attribute.h",
     "ast/discard_statement.h",
     "ast/enable.h",
@@ -527,10 +542,11 @@
     "ast/workgroup_attribute.h",
   ]
   deps = [
-    ":libtint_base_src",
     ":libtint_builtins_src",
     ":libtint_clone_context_hdrs",
+    ":libtint_symbols_src",
     ":libtint_type_src",
+    ":libtint_utils_src",
   ]
 }
 
@@ -559,6 +575,7 @@
     "ast/diagnostic_attribute.cc",
     "ast/diagnostic_control.cc",
     "ast/diagnostic_directive.cc",
+    "ast/diagnostic_rule_name.cc",
     "ast/disable_validation_attribute.cc",
     "ast/discard_statement.cc",
     "ast/enable.cc",
@@ -613,10 +630,10 @@
   ]
   public_deps = [ ":libtint_ast_hdrs" ]
   deps = [
-    ":libtint_base_src",
     ":libtint_builtins_src",
     ":libtint_program_src",
     ":libtint_type_src",
+    ":libtint_utils_src",
   ]
 }
 
@@ -694,10 +711,11 @@
 
   deps = [
     ":libtint_ast_hdrs",
-    ":libtint_base_src",
     ":libtint_builtins_src",
     ":libtint_constant_src",
+    ":libtint_symbols_src",
     ":libtint_type_src",
+    ":libtint_utils_src",
   ]
 }
 
@@ -728,7 +746,7 @@
     "builtin/texel_format.cc",
     "builtin/texel_format.h",
   ]
-  deps = [ ":libtint_base_src" ]
+  deps = [ ":libtint_utils_src" ]
 }
 
 libtint_source_set("libtint_type_src") {
@@ -799,8 +817,9 @@
   ]
 
   deps = [
-    ":libtint_base_src",
     ":libtint_builtins_src",
+    ":libtint_symbols_src",
+    ":libtint_utils_src",
   ]
 }
 
@@ -819,8 +838,9 @@
     "constant/value.h",
   ]
   deps = [
-    ":libtint_base_src",
+    ":libtint_symbols_src",
     ":libtint_type_src",
+    ":libtint_utils_src",
   ]
 }
 
@@ -862,12 +882,13 @@
 
   deps = [
     ":libtint_ast_src",
-    ":libtint_base_src",
     ":libtint_builtins_src",
     ":libtint_program_src",
     ":libtint_reader_src",
     ":libtint_sem_src",
+    ":libtint_symbols_src",
     ":libtint_type_src",
+    ":libtint_utils_src",
     "${tint_spirv_tools_dir}/:spvtools_opt",
   ]
 
@@ -901,13 +922,13 @@
 
   deps = [
     ":libtint_ast_src",
-    ":libtint_base_src",
     ":libtint_builtins_src",
     ":libtint_inspector_src",
     ":libtint_program_src",
     ":libtint_sem_src",
     ":libtint_transform_src",
     ":libtint_type_src",
+    ":libtint_utils_src",
   ]
 }
 
@@ -932,13 +953,14 @@
 
   deps = [
     ":libtint_ast_src",
-    ":libtint_base_src",
     ":libtint_builtins_src",
     ":libtint_constant_src",
     ":libtint_program_src",
     ":libtint_sem_src",
+    ":libtint_symbols_src",
     ":libtint_transform_src",
     ":libtint_type_src",
+    ":libtint_utils_src",
     ":libtint_writer_src",
   ]
 }
@@ -961,11 +983,12 @@
   deps = [
     ":abseil",
     ":libtint_ast_src",
-    ":libtint_base_src",
     ":libtint_builtins_src",
     ":libtint_program_src",
     ":libtint_reader_src",
+    ":libtint_symbols_src",
     ":libtint_type_src",
+    ":libtint_utils_src",
   ]
 }
 
@@ -979,11 +1002,11 @@
 
   deps = [
     ":libtint_ast_src",
-    ":libtint_base_src",
     ":libtint_builtins_src",
     ":libtint_program_src",
     ":libtint_sem_src",
     ":libtint_type_src",
+    ":libtint_utils_src",
     ":libtint_writer_src",
   ]
 }
@@ -998,13 +1021,14 @@
 
   deps = [
     ":libtint_ast_src",
-    ":libtint_base_src",
     ":libtint_builtins_src",
     ":libtint_constant_src",
     ":libtint_program_src",
     ":libtint_sem_src",
+    ":libtint_symbols_src",
     ":libtint_transform_src",
     ":libtint_type_src",
+    ":libtint_utils_src",
     ":libtint_writer_src",
   ]
 }
@@ -1019,13 +1043,14 @@
 
   deps = [
     ":libtint_ast_src",
-    ":libtint_base_src",
     ":libtint_builtins_src",
     ":libtint_constant_src",
     ":libtint_program_src",
     ":libtint_sem_src",
+    ":libtint_symbols_src",
     ":libtint_transform_src",
     ":libtint_type_src",
+    ":libtint_utils_src",
     ":libtint_writer_src",
   ]
 }
@@ -1040,13 +1065,14 @@
 
   deps = [
     ":libtint_ast_src",
-    ":libtint_base_src",
     ":libtint_builtins_src",
     ":libtint_constant_src",
     ":libtint_program_src",
     ":libtint_sem_src",
+    ":libtint_symbols_src",
     ":libtint_transform_src",
     ":libtint_type_src",
+    ":libtint_utils_src",
     ":libtint_writer_src",
   ]
 }
@@ -1061,11 +1087,11 @@
 
   deps = [
     ":libtint_ast_src",
-    ":libtint_base_src",
     ":libtint_builtins_src",
     ":libtint_program_src",
     ":libtint_sem_src",
     ":libtint_type_src",
+    ":libtint_utils_src",
     ":libtint_writer_src",
   ]
 }
@@ -1073,14 +1099,15 @@
 source_set("libtint") {
   public_deps = [
     ":libtint_ast_src",
-    ":libtint_base_src",
     ":libtint_constant_src",
     ":libtint_initializer_src",
     ":libtint_inspector_src",
     ":libtint_program_src",
     ":libtint_sem_src",
+    ":libtint_symbols_src",
     ":libtint_transform_src",
     ":libtint_type_src",
+    ":libtint_utils_src",
     ":libtint_writer_src",
   ]
 
@@ -1261,10 +1288,7 @@
       "ast/test_helper.h",
       "ast/test_helper_test.cc",
     ]
-    deps = [
-      ":libtint_ast_src",
-      ":libtint_base_src",
-    ]
+    deps = [ ":libtint_ast_src" ]
   }
 
   tint_unittests_source_set("tint_unittests_ast_src") {
@@ -1291,6 +1315,7 @@
       "ast/diagnostic_attribute_test.cc",
       "ast/diagnostic_control_test.cc",
       "ast/diagnostic_directive_test.cc",
+      "ast/diagnostic_rule_name_test.cc",
       "ast/discard_statement_test.cc",
       "ast/enable_test.cc",
       "ast/float_literal_expression_test.cc",
@@ -1329,10 +1354,10 @@
     ]
     deps = [
       ":libtint_ast_src",
-      ":libtint_base_src",
       ":libtint_builtins_src",
       ":libtint_transform_src",
       ":libtint_unittests_ast_helper",
+      ":libtint_utils_src",
     ]
 
     if (tint_build_wgsl_reader && tint_build_wgsl_writer) {
@@ -1364,7 +1389,6 @@
       "diagnostic/formatter_test.cc",
       "diagnostic/printer_test.cc",
     ]
-    deps = [ ":libtint_base_src" ]
   }
 
   tint_unittests_source_set("tint_unittests_inspector_src") {
@@ -1446,9 +1470,9 @@
       "resolver/variable_validation_test.cc",
     ]
     deps = [
-      ":libtint_base_src",
       ":libtint_builtins_src",
       ":libtint_transform_src",
+      ":libtint_utils_src",
       ":tint_unittests_ast_src",
     ]
   }
@@ -1494,10 +1518,7 @@
       "type/u32_test.cc",
       "type/vector_test.cc",
     ]
-    deps = [
-      ":libtint_base_src",
-      ":libtint_builtins_src",
-    ]
+    deps = [ ":libtint_builtins_src" ]
   }
 
   tint_unittests_source_set("tint_unittests_transform_src") {
@@ -1559,10 +1580,10 @@
     ]
 
     deps = [
-      ":libtint_base_src",
       ":libtint_builtins_src",
       ":libtint_transform_src",
       ":libtint_unittests_ast_helper",
+      ":libtint_utils_src",
       ":libtint_wgsl_reader_src",
       ":libtint_wgsl_writer_src",
     ]
@@ -1570,6 +1591,9 @@
 
   tint_unittests_source_set("tint_unittests_utils_src") {
     sources = [
+      "debug_test.cc",
+      "source_test.cc",
+      "switch_test.cc",
       "utils/bitcast_test.cc",
       "utils/bitset_test.cc",
       "utils/block_allocator_test.cc",
@@ -1598,7 +1622,7 @@
       "utils/unique_vector_test.cc",
       "utils/vector_test.cc",
     ]
-    deps = [ ":libtint_base_src" ]
+    deps = [ ":libtint_utils_src" ]
   }
 
   tint_unittests_source_set("tint_unittests_writer_src") {
@@ -1610,8 +1634,8 @@
       "writer/text_generator_test.cc",
     ]
     deps = [
-      ":libtint_base_src",
       ":libtint_unittests_ast_helper",
+      ":libtint_utils_src",
       ":libtint_writer_src",
     ]
   }
@@ -1665,7 +1689,6 @@
     ]
 
     deps = [
-      ":libtint_base_src",
       ":libtint_spv_reader_src",
       ":libtint_wgsl_writer_src",
       "${tint_spirv_tools_dir}/:spvtools_opt",
@@ -1710,9 +1733,9 @@
     ]
 
     deps = [
-      ":libtint_base_src",
       ":libtint_builtins_src",
       ":libtint_spv_writer_src",
+      ":libtint_utils_src",
       ":tint_unittests_ast_src",
       "${tint_spirv_tools_dir}/:spvtools",
     ]
@@ -1791,7 +1814,6 @@
     ]
 
     deps = [
-      ":libtint_base_src",
       ":libtint_builtins_src",
       ":libtint_unittests_ast_helper",
       ":libtint_wgsl_reader_src",
@@ -1835,6 +1857,7 @@
 
     deps = [
       ":libtint_builtins_src",
+      ":libtint_utils_src",
       ":libtint_wgsl_writer_src",
       ":tint_unittests_ast_src",
     ]
@@ -1876,6 +1899,7 @@
 
     deps = [
       ":libtint_msl_writer_src",
+      ":libtint_utils_src",
       ":tint_unittests_ast_src",
     ]
   }
@@ -1918,6 +1942,7 @@
     deps = [
       ":libtint_hlsl_writer_src",
       ":libtint_transform_src",
+      ":libtint_utils_src",
       ":tint_unittests_ast_src",
     ]
   }
@@ -1959,25 +1984,23 @@
     ]
 
     deps = [
-      ":libtint_base_src",
       ":libtint_glsl_writer_src",
+      ":libtint_symbols_src",
       ":libtint_transform_src",
+      ":libtint_utils_src",
       ":tint_unittests_ast_src",
     ]
   }
 
-  tint_unittests_source_set("tint_unittests_base_src") {
+  tint_unittests_source_set("tint_unittests_symbols_src") {
     sources = [
-      "debug_test.cc",
       "number_test.cc",
       "reflection_test.cc",
       "scope_stack_test.cc",
-      "source_test.cc",
-      "switch_test.cc",
       "symbol_table_test.cc",
       "symbol_test.cc",
     ]
-    deps = [ ":libtint_base_src" ]
+    deps = [ ":libtint_symbols_src" ]
   }
 
   tint_unittests_source_set("tint_unittests_core_src") {
@@ -1988,7 +2011,6 @@
     ]
 
     deps = [
-      ":libtint_base_src",
       ":libtint_unittests_ast_helper",
       ":tint_unittests_ast_src",
     ]
@@ -2012,7 +2034,6 @@
       ":libtint_wgsl_reader_src",
       ":libtint_wgsl_writer_src",
       ":tint_unittests_ast_src",
-      ":tint_unittests_base_src",
       ":tint_unittests_builtins_src",
       ":tint_unittests_cmd_src",
       ":tint_unittests_constant_src",
@@ -2021,6 +2042,7 @@
       ":tint_unittests_inspector_src",
       ":tint_unittests_resolver_src",
       ":tint_unittests_sem_src",
+      ":tint_unittests_symbols_src",
       ":tint_unittests_transform_src",
       ":tint_unittests_type_src",
       ":tint_unittests_utils_src",
diff --git a/src/tint/CMakeLists.txt b/src/tint/CMakeLists.txt
index 323ed79..7bac6ed 100644
--- a/src/tint/CMakeLists.txt
+++ b/src/tint/CMakeLists.txt
@@ -126,6 +126,8 @@
   ast/diagnostic_control.h
   ast/diagnostic_directive.cc
   ast/diagnostic_directive.h
+  ast/diagnostic_rule_name.cc
+  ast/diagnostic_rule_name.h
   ast/disable_validation_attribute.cc
   ast/disable_validation_attribute.h
   ast/discard_statement.cc
@@ -845,6 +847,7 @@
     ast/diagnostic_attribute_test.cc
     ast/diagnostic_control_test.cc
     ast/diagnostic_directive_test.cc
+    ast/diagnostic_rule_name_test.cc
     ast/discard_statement_test.cc
     ast/enable_test.cc
     ast/float_literal_expression_test.cc
diff --git a/src/tint/ast/diagnostic_attribute_test.cc b/src/tint/ast/diagnostic_attribute_test.cc
index ec6ec26..a77c025 100644
--- a/src/tint/ast/diagnostic_attribute_test.cc
+++ b/src/tint/ast/diagnostic_attribute_test.cc
@@ -20,12 +20,20 @@
 using namespace tint::number_suffixes;  // NOLINT
 using DiagnosticAttributeTest = TestHelper;
 
-TEST_F(DiagnosticAttributeTest, Creation) {
-    auto* name = Ident("foo");
-    auto* d = DiagnosticAttribute(builtin::DiagnosticSeverity::kWarning, name);
+TEST_F(DiagnosticAttributeTest, Name) {
+    auto* d = DiagnosticAttribute(builtin::DiagnosticSeverity::kWarning, "foo");
     EXPECT_EQ(d->Name(), "diagnostic");
     EXPECT_EQ(d->control.severity, builtin::DiagnosticSeverity::kWarning);
-    EXPECT_EQ(d->control.rule_name, name);
+    EXPECT_EQ(d->control.rule_name->category, nullptr);
+    CheckIdentifier(d->control.rule_name->name, "foo");
+}
+
+TEST_F(DiagnosticAttributeTest, CategoryAndName) {
+    auto* d = DiagnosticAttribute(builtin::DiagnosticSeverity::kWarning, "foo", "bar");
+    EXPECT_EQ(d->Name(), "diagnostic");
+    EXPECT_EQ(d->control.severity, builtin::DiagnosticSeverity::kWarning);
+    CheckIdentifier(d->control.rule_name->category, "foo");
+    CheckIdentifier(d->control.rule_name->name, "bar");
 }
 
 }  // namespace
diff --git a/src/tint/ast/diagnostic_control.cc b/src/tint/ast/diagnostic_control.cc
index a2bdd46..27ec3c1 100644
--- a/src/tint/ast/diagnostic_control.cc
+++ b/src/tint/ast/diagnostic_control.cc
@@ -24,13 +24,10 @@
 
 DiagnosticControl::DiagnosticControl() = default;
 
-DiagnosticControl::DiagnosticControl(builtin::DiagnosticSeverity sev, const Identifier* rule)
+DiagnosticControl::DiagnosticControl(builtin::DiagnosticSeverity sev,
+                                     const DiagnosticRuleName* rule)
     : severity(sev), rule_name(rule) {
     TINT_ASSERT(AST, rule != nullptr);
-    if (rule) {
-        // It is invalid for a diagnostic rule name to be templated
-        TINT_ASSERT(AST, !rule->Is<TemplatedIdentifier>());
-    }
 }
 
 DiagnosticControl::DiagnosticControl(DiagnosticControl&&) = default;
diff --git a/src/tint/ast/diagnostic_control.h b/src/tint/ast/diagnostic_control.h
index f99d002..2b504e4 100644
--- a/src/tint/ast/diagnostic_control.h
+++ b/src/tint/ast/diagnostic_control.h
@@ -23,7 +23,7 @@
 
 // Forward declarations
 namespace tint::ast {
-class Identifier;
+class DiagnosticRuleName;
 }  // namespace tint::ast
 
 namespace tint::ast {
@@ -37,16 +37,16 @@
     /// Constructor
     /// @param sev the diagnostic severity
     /// @param rule the diagnostic rule name
-    DiagnosticControl(builtin::DiagnosticSeverity sev, const Identifier* rule);
+    DiagnosticControl(builtin::DiagnosticSeverity sev, const DiagnosticRuleName* rule);
 
     /// Move constructor
     DiagnosticControl(DiagnosticControl&&);
 
     /// The diagnostic severity control.
-    builtin::DiagnosticSeverity severity;
+    builtin::DiagnosticSeverity severity = builtin::DiagnosticSeverity::kUndefined;
 
     /// The diagnostic rule name.
-    const Identifier* rule_name;
+    const DiagnosticRuleName* rule_name = nullptr;
 };
 
 }  // namespace tint::ast
diff --git a/src/tint/ast/diagnostic_control_test.cc b/src/tint/ast/diagnostic_control_test.cc
index 53afe53..d118677 100644
--- a/src/tint/ast/diagnostic_control_test.cc
+++ b/src/tint/ast/diagnostic_control_test.cc
@@ -24,12 +24,11 @@
 
 using DiagnosticControlTest = TestHelper;
 
-TEST_F(DiagnosticControlTest, Assert_RuleNotTemplated) {
+TEST_F(DiagnosticControlTest, Assert_RuleNotNull) {
     EXPECT_FATAL_FAILURE(
         {
             ProgramBuilder b;
-            DiagnosticControl control(builtin::DiagnosticSeverity::kWarning,
-                                      b.Ident("name", "a", "b", "c"));
+            DiagnosticControl control(builtin::DiagnosticSeverity::kWarning, nullptr);
         },
         "internal compiler error");
 }
diff --git a/src/tint/ast/diagnostic_directive.cc b/src/tint/ast/diagnostic_directive.cc
index f0ef041..8783901 100644
--- a/src/tint/ast/diagnostic_directive.cc
+++ b/src/tint/ast/diagnostic_directive.cc
@@ -34,4 +34,5 @@
     DiagnosticControl dc(control.severity, rule);
     return ctx->dst->create<DiagnosticDirective>(src, std::move(dc));
 }
+
 }  // namespace tint::ast
diff --git a/src/tint/ast/diagnostic_directive_test.cc b/src/tint/ast/diagnostic_directive_test.cc
index 721a545..c423ae9 100644
--- a/src/tint/ast/diagnostic_directive_test.cc
+++ b/src/tint/ast/diagnostic_directive_test.cc
@@ -21,15 +21,28 @@
 
 using DiagnosticDirectiveTest = TestHelper;
 
-TEST_F(DiagnosticDirectiveTest, Creation) {
-    auto* diag = DiagnosticDirective(Source{{{10, 5}, {10, 15}}},
-                                     builtin::DiagnosticSeverity::kWarning, "foo");
-    EXPECT_EQ(diag->source.range.begin.line, 10u);
-    EXPECT_EQ(diag->source.range.begin.column, 5u);
-    EXPECT_EQ(diag->source.range.end.line, 10u);
-    EXPECT_EQ(diag->source.range.end.column, 15u);
-    EXPECT_EQ(diag->control.severity, builtin::DiagnosticSeverity::kWarning);
-    CheckIdentifier(diag->control.rule_name, "foo");
+TEST_F(DiagnosticDirectiveTest, Name) {
+    auto* d = DiagnosticDirective(Source{{{10, 5}, {10, 15}}},
+                                  builtin::DiagnosticSeverity::kWarning, "foo");
+    EXPECT_EQ(d->source.range.begin.line, 10u);
+    EXPECT_EQ(d->source.range.begin.column, 5u);
+    EXPECT_EQ(d->source.range.end.line, 10u);
+    EXPECT_EQ(d->source.range.end.column, 15u);
+    EXPECT_EQ(d->control.severity, builtin::DiagnosticSeverity::kWarning);
+    EXPECT_EQ(d->control.rule_name->category, nullptr);
+    CheckIdentifier(d->control.rule_name->name, "foo");
+}
+
+TEST_F(DiagnosticDirectiveTest, CategoryAndName) {
+    auto* d = DiagnosticDirective(Source{{{10, 5}, {10, 15}}},
+                                  builtin::DiagnosticSeverity::kWarning, "foo", "bar");
+    EXPECT_EQ(d->source.range.begin.line, 10u);
+    EXPECT_EQ(d->source.range.begin.column, 5u);
+    EXPECT_EQ(d->source.range.end.line, 10u);
+    EXPECT_EQ(d->source.range.end.column, 15u);
+    EXPECT_EQ(d->control.severity, builtin::DiagnosticSeverity::kWarning);
+    CheckIdentifier(d->control.rule_name->category, "foo");
+    CheckIdentifier(d->control.rule_name->name, "bar");
 }
 
 }  // namespace
diff --git a/src/tint/ast/diagnostic_rule_name.cc b/src/tint/ast/diagnostic_rule_name.cc
new file mode 100644
index 0000000..856e054
--- /dev/null
+++ b/src/tint/ast/diagnostic_rule_name.cc
@@ -0,0 +1,74 @@
+// Copyright 2023 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "src/tint/ast/diagnostic_rule_name.h"
+
+#include <string>
+
+#include "src/tint/program_builder.h"
+
+TINT_INSTANTIATE_TYPEINFO(tint::ast::DiagnosticRuleName);
+
+namespace tint::ast {
+
+DiagnosticRuleName::DiagnosticRuleName(ProgramID pid,
+                                       NodeID nid,
+                                       const Source& src,
+                                       const Identifier* n)
+    : Base(pid, nid, src), name(n) {
+    TINT_ASSERT(AST, name != nullptr);
+    TINT_ASSERT_PROGRAM_IDS_EQUAL_IF_VALID(AST, name, program_id);
+    if (name) {
+        // It is invalid for a diagnostic rule name to be templated
+        TINT_ASSERT(AST, !name->Is<TemplatedIdentifier>());
+    }
+}
+
+DiagnosticRuleName::DiagnosticRuleName(ProgramID pid,
+                                       NodeID nid,
+                                       const Source& src,
+                                       const Identifier* c,
+                                       const Identifier* n)
+    : Base(pid, nid, src), category(c), name(n) {
+    TINT_ASSERT(AST, name != nullptr);
+    TINT_ASSERT_PROGRAM_IDS_EQUAL_IF_VALID(AST, name, program_id);
+    if (name) {
+        // It is invalid for a diagnostic rule name to be templated
+        TINT_ASSERT(AST, !name->Is<TemplatedIdentifier>());
+    }
+    if (category) {
+        TINT_ASSERT_PROGRAM_IDS_EQUAL_IF_VALID(AST, category, program_id);
+        // It is invalid for a diagnostic rule category to be templated
+        TINT_ASSERT(AST, !category->Is<TemplatedIdentifier>());
+    }
+}
+
+const DiagnosticRuleName* DiagnosticRuleName::Clone(CloneContext* ctx) const {
+    auto src = ctx->Clone(source);
+    auto n = ctx->Clone(name);
+    if (auto c = ctx->Clone(category)) {
+        return ctx->dst->create<DiagnosticRuleName>(src, c, n);
+    }
+    return ctx->dst->create<DiagnosticRuleName>(src, n);
+}
+
+std::string DiagnosticRuleName::String() const {
+    if (category) {
+        return category->symbol.Name() + "." + name->symbol.Name();
+    } else {
+        return name->symbol.Name();
+    }
+}
+
+}  // namespace tint::ast
diff --git a/src/tint/ast/diagnostic_rule_name.h b/src/tint/ast/diagnostic_rule_name.h
new file mode 100644
index 0000000..a3d1189
--- /dev/null
+++ b/src/tint/ast/diagnostic_rule_name.h
@@ -0,0 +1,68 @@
+// Copyright 2023 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef SRC_TINT_AST_DIAGNOSTIC_RULE_NAME_H_
+#define SRC_TINT_AST_DIAGNOSTIC_RULE_NAME_H_
+
+#include <string>
+
+#include "src/tint/ast/node.h"
+
+// Forward declarations
+namespace tint::ast {
+class Identifier;
+}  // namespace tint::ast
+
+namespace tint::ast {
+
+/// A diagnostic rule name used for diagnostic directives and attributes.
+class DiagnosticRuleName final : public utils::Castable<DiagnosticRuleName, Node> {
+  public:
+    /// Constructor
+    /// @param pid the identifier of the program that owns this node
+    /// @param nid the unique node identifier
+    /// @param src the source of this node
+    /// @param name the rule name
+    DiagnosticRuleName(ProgramID pid, NodeID nid, const Source& src, const Identifier* name);
+
+    /// Constructor
+    /// @param pid the identifier of the program that owns this node
+    /// @param nid the unique node identifier
+    /// @param src the source of this node
+    /// @param category the rule category.
+    /// @param name the rule name
+    DiagnosticRuleName(ProgramID pid,
+                       NodeID nid,
+                       const Source& src,
+                       const Identifier* category,
+                       const Identifier* name);
+
+    /// Clones this node and all transitive child nodes using the `CloneContext` `ctx`.
+    /// @param ctx the clone context
+    /// @return the newly cloned node
+    const DiagnosticRuleName* Clone(CloneContext* ctx) const override;
+
+    /// @return the full name of this diagnostic rule, either as `name` or `category.name`.
+    std::string String() const;
+
+    /// The diagnostic rule category (category.name)
+    Identifier const* const category = nullptr;
+
+    /// The diagnostic rule name.
+    Identifier const* const name;
+};
+
+}  // namespace tint::ast
+
+#endif  // SRC_TINT_AST_DIAGNOSTIC_RULE_NAME_H_
diff --git a/src/tint/ast/diagnostic_rule_name_test.cc b/src/tint/ast/diagnostic_rule_name_test.cc
new file mode 100644
index 0000000..40caac7
--- /dev/null
+++ b/src/tint/ast/diagnostic_rule_name_test.cc
@@ -0,0 +1,50 @@
+// Copyright 2023 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <string>
+
+#include "gtest/gtest-spi.h"
+#include "src/tint/ast/diagnostic_rule_name.h"
+#include "src/tint/ast/test_helper.h"
+
+namespace tint::ast {
+namespace {
+
+using DiagnosticRuleNameTest = TestHelper;
+
+TEST_F(DiagnosticRuleNameTest, String) {
+    EXPECT_EQ(DiagnosticRuleName("name")->String(), "name");
+    EXPECT_EQ(DiagnosticRuleName("category", "name")->String(), "category.name");
+}
+
+TEST_F(DiagnosticRuleNameTest, Assert_NameNotTemplated) {
+    EXPECT_FATAL_FAILURE(
+        {
+            ProgramBuilder b;
+            b.create<ast::DiagnosticRuleName>(b.Ident("name", "a", "b", "c"));
+        },
+        "internal compiler error");
+}
+
+TEST_F(DiagnosticRuleNameTest, Assert_CategoryNotTemplated) {
+    EXPECT_FATAL_FAILURE(
+        {
+            ProgramBuilder b;
+            b.create<ast::DiagnosticRuleName>(b.Ident("name"), b.Ident("category", "a", "b", "c"));
+        },
+        "internal compiler error");
+}
+
+}  // namespace
+}  // namespace tint::ast
diff --git a/src/tint/ast/module_clone_test.cc b/src/tint/ast/module_clone_test.cc
index eb7f775..b2407bc 100644
--- a/src/tint/ast/module_clone_test.cc
+++ b/src/tint/ast/module_clone_test.cc
@@ -25,7 +25,7 @@
     // Shader that exercises the bulk of the AST nodes and types.
     // See also fuzzers/tint_ast_clone_fuzzer.cc for further coverage of cloning.
     Source::File file("test.wgsl", R"(enable f16;
-diagnostic(off, chromium_unreachable_code);
+diagnostic(off, chromium.unreachable_code);
 
 struct S0 {
   @size(4)
@@ -65,7 +65,7 @@
   return 0.0;
 }
 
-@diagnostic(warning, chromium_unreachable_code)
+@diagnostic(warning, chromium.unreachable_code)
 fn f1(p0 : f32, p1 : i32) -> f32 {
   var l0 : i32 = 3;
   var l1 : f32 = 8.0;
diff --git a/src/tint/builtin/diagnostic_rule.cc b/src/tint/builtin/diagnostic_rule.cc
index 69650cb..334a88a 100644
--- a/src/tint/builtin/diagnostic_rule.cc
+++ b/src/tint/builtin/diagnostic_rule.cc
@@ -28,29 +28,45 @@
 
 namespace tint::builtin {
 
-/// ParseDiagnosticRule parses a DiagnosticRule from a string.
+/// ParseCoreDiagnosticRule parses a CoreDiagnosticRule from a string.
 /// @param str the string to parse
-/// @returns the parsed enum, or DiagnosticRule::kUndefined if the string could not be parsed.
-DiagnosticRule ParseDiagnosticRule(std::string_view str) {
-    if (str == "chromium_unreachable_code") {
-        return DiagnosticRule::kChromiumUnreachableCode;
-    }
+/// @returns the parsed enum, or CoreDiagnosticRule::kUndefined if the string could not be parsed.
+CoreDiagnosticRule ParseCoreDiagnosticRule(std::string_view str) {
     if (str == "derivative_uniformity") {
-        return DiagnosticRule::kDerivativeUniformity;
+        return CoreDiagnosticRule::kDerivativeUniformity;
     }
-    return DiagnosticRule::kUndefined;
+    return CoreDiagnosticRule::kUndefined;
 }
 
-utils::StringStream& operator<<(utils::StringStream& out, DiagnosticRule value) {
+utils::StringStream& operator<<(utils::StringStream& out, CoreDiagnosticRule value) {
     switch (value) {
-        case DiagnosticRule::kUndefined:
+        case CoreDiagnosticRule::kUndefined:
             return out << "undefined";
-        case DiagnosticRule::kChromiumUnreachableCode:
-            return out << "chromium_unreachable_code";
-        case DiagnosticRule::kDerivativeUniformity:
+        case CoreDiagnosticRule::kDerivativeUniformity:
             return out << "derivative_uniformity";
     }
     return out << "<unknown>";
 }
 
+/// ParseChromiumDiagnosticRule parses a ChromiumDiagnosticRule from a string.
+/// @param str the string to parse
+/// @returns the parsed enum, or ChromiumDiagnosticRule::kUndefined if the string could not be
+/// parsed.
+ChromiumDiagnosticRule ParseChromiumDiagnosticRule(std::string_view str) {
+    if (str == "unreachable_code") {
+        return ChromiumDiagnosticRule::kUnreachableCode;
+    }
+    return ChromiumDiagnosticRule::kUndefined;
+}
+
+utils::StringStream& operator<<(utils::StringStream& out, ChromiumDiagnosticRule value) {
+    switch (value) {
+        case ChromiumDiagnosticRule::kUndefined:
+            return out << "undefined";
+        case ChromiumDiagnosticRule::kUnreachableCode:
+            return out << "unreachable_code";
+    }
+    return out << "<unknown>";
+}
+
 }  // namespace tint::builtin
diff --git a/src/tint/builtin/diagnostic_rule.cc.tmpl b/src/tint/builtin/diagnostic_rule.cc.tmpl
index 8705485..8e64b09 100644
--- a/src/tint/builtin/diagnostic_rule.cc.tmpl
+++ b/src/tint/builtin/diagnostic_rule.cc.tmpl
@@ -18,8 +18,12 @@
 
 namespace tint::builtin {
 
-{{ Eval "ParseEnum" (Sem.Enum "diagnostic_rule")}}
+{{ Eval "ParseEnum" (Sem.Enum "core_diagnostic_rule")}}
 
-{{ Eval "EnumOStream" (Sem.Enum "diagnostic_rule")}}
+{{ Eval "EnumOStream" (Sem.Enum "core_diagnostic_rule")}}
+
+{{ Eval "ParseEnum" (Sem.Enum "chromium_diagnostic_rule")}}
+
+{{ Eval "EnumOStream" (Sem.Enum "chromium_diagnostic_rule")}}
 
 }  // namespace tint::builtin
diff --git a/src/tint/builtin/diagnostic_rule.h b/src/tint/builtin/diagnostic_rule.h
index 6b6d094..aa641b0 100644
--- a/src/tint/builtin/diagnostic_rule.h
+++ b/src/tint/builtin/diagnostic_rule.h
@@ -24,33 +24,56 @@
 #define SRC_TINT_BUILTIN_DIAGNOSTIC_RULE_H_
 
 #include <string>
+#include <variant>
 
 #include "src/tint/utils/string_stream.h"
 
 namespace tint::builtin {
 
-/// The diagnostic rule.
-enum class DiagnosticRule {
+/// WGSL core diagnostic rules.
+enum class CoreDiagnosticRule {
     kUndefined,
-    kChromiumUnreachableCode,
     kDerivativeUniformity,
 };
 
 /// @param out the stream to write to
-/// @param value the DiagnosticRule
+/// @param value the CoreDiagnosticRule
 /// @returns `out` so calls can be chained
-utils::StringStream& operator<<(utils::StringStream& out, DiagnosticRule value);
+utils::StringStream& operator<<(utils::StringStream& out, CoreDiagnosticRule value);
 
-/// ParseDiagnosticRule parses a DiagnosticRule from a string.
+/// ParseCoreDiagnosticRule parses a CoreDiagnosticRule from a string.
 /// @param str the string to parse
-/// @returns the parsed enum, or DiagnosticRule::kUndefined if the string could not be parsed.
-DiagnosticRule ParseDiagnosticRule(std::string_view str);
+/// @returns the parsed enum, or CoreDiagnosticRule::kUndefined if the string could not be parsed.
+CoreDiagnosticRule ParseCoreDiagnosticRule(std::string_view str);
 
-constexpr const char* kDiagnosticRuleStrings[] = {
-    "chromium_unreachable_code",
+constexpr const char* kCoreDiagnosticRuleStrings[] = {
     "derivative_uniformity",
 };
 
+/// Chromium-specific diagnostic rules.
+enum class ChromiumDiagnosticRule {
+    kUndefined,
+    kUnreachableCode,
+};
+
+/// @param out the stream to write to
+/// @param value the ChromiumDiagnosticRule
+/// @returns `out` so calls can be chained
+utils::StringStream& operator<<(utils::StringStream& out, ChromiumDiagnosticRule value);
+
+/// ParseChromiumDiagnosticRule parses a ChromiumDiagnosticRule from a string.
+/// @param str the string to parse
+/// @returns the parsed enum, or ChromiumDiagnosticRule::kUndefined if the string could not be
+/// parsed.
+ChromiumDiagnosticRule ParseChromiumDiagnosticRule(std::string_view str);
+
+constexpr const char* kChromiumDiagnosticRuleStrings[] = {
+    "unreachable_code",
+};
+
+/// All diagnostic rules understood by Tint.
+using DiagnosticRule = std::variant<CoreDiagnosticRule, ChromiumDiagnosticRule>;
+
 }  // namespace tint::builtin
 
 #endif  // SRC_TINT_BUILTIN_DIAGNOSTIC_RULE_H_
diff --git a/src/tint/builtin/diagnostic_rule.h.tmpl b/src/tint/builtin/diagnostic_rule.h.tmpl
index ba823e3..16d7f9e 100644
--- a/src/tint/builtin/diagnostic_rule.h.tmpl
+++ b/src/tint/builtin/diagnostic_rule.h.tmpl
@@ -14,13 +14,20 @@
 #define SRC_TINT_BUILTIN_DIAGNOSTIC_RULE_H_
 
 #include <string>
+#include <variant>
 
 #include "src/tint/utils/string_stream.h"
 
 namespace tint::builtin {
 
-/// The diagnostic rule.
-{{ Eval "DeclareEnum" (Sem.Enum "diagnostic_rule") }}
+/// WGSL core diagnostic rules.
+{{ Eval "DeclareEnum" (Sem.Enum "core_diagnostic_rule") }}
+
+/// Chromium-specific diagnostic rules.
+{{ Eval "DeclareEnum" (Sem.Enum "chromium_diagnostic_rule") }}
+
+/// All diagnostic rules understood by Tint.
+using DiagnosticRule = std::variant<CoreDiagnosticRule, ChromiumDiagnosticRule>;
 
 }  // namespace tint::builtin
 
diff --git a/src/tint/builtin/diagnostic_rule_bench.cc b/src/tint/builtin/diagnostic_rule_bench.cc
index c98bd46..fb60580 100644
--- a/src/tint/builtin/diagnostic_rule_bench.cc
+++ b/src/tint/builtin/diagnostic_rule_bench.cc
@@ -29,23 +29,36 @@
 namespace tint::builtin {
 namespace {
 
-void DiagnosticRuleParser(::benchmark::State& state) {
+void CoreDiagnosticRuleParser(::benchmark::State& state) {
     const char* kStrings[] = {
-        "chromium_unrachaccle_code",   "clromium_unreachab3_oe",    "chromium_unreachable_Vode",
-        "chromium_unreachable_code",   "chro1ium_unreachable_code", "chromium_unreJchableqqcde",
-        "chromium77unreallhable_code", "dqqrvatiHHe_uniforppity",   "deriatcv_nvformity",
-        "derivatbe_unGformity",        "derivative_uniformity",     "derivative_iinifvrmity",
-        "derivat8WWe_uniformity",      "drivaxxive_uniformity",
+        "deriative_unccformity",   "dlivative_3iformiy",    "derivative_uniforVity",
+        "derivative_uniformity",   "derivative_uniform1ty", "derivativeJunifqrmity",
+        "derivative_unifllrmit77",
     };
     for (auto _ : state) {
         for (auto* str : kStrings) {
-            auto result = ParseDiagnosticRule(str);
+            auto result = ParseCoreDiagnosticRule(str);
             benchmark::DoNotOptimize(result);
         }
     }
 }
 
-BENCHMARK(DiagnosticRuleParser);
+BENCHMARK(CoreDiagnosticRuleParser);
+
+void ChromiumDiagnosticRuleParser(::benchmark::State& state) {
+    const char* kStrings[] = {
+        "pqnreachableHHcode", "unrechcbe_cov",     "unreachGblecode",  "unreachable_code",
+        "vnriiachable_code",  "unreac8ablWW_code", "unreMchablxxcode",
+    };
+    for (auto _ : state) {
+        for (auto* str : kStrings) {
+            auto result = ParseChromiumDiagnosticRule(str);
+            benchmark::DoNotOptimize(result);
+        }
+    }
+}
+
+BENCHMARK(ChromiumDiagnosticRuleParser);
 
 }  // namespace
 }  // namespace tint::builtin
diff --git a/src/tint/builtin/diagnostic_rule_bench.cc.tmpl b/src/tint/builtin/diagnostic_rule_bench.cc.tmpl
index 2605aae..dab6856 100644
--- a/src/tint/builtin/diagnostic_rule_bench.cc.tmpl
+++ b/src/tint/builtin/diagnostic_rule_bench.cc.tmpl
@@ -19,7 +19,9 @@
 namespace tint::builtin {
 namespace {
 
-{{ Eval "BenchmarkParseEnum" (Sem.Enum "diagnostic_rule")}}
+{{ Eval "BenchmarkParseEnum" (Sem.Enum "core_diagnostic_rule")}}
+
+{{ Eval "BenchmarkParseEnum" (Sem.Enum "chromium_diagnostic_rule")}}
 
 }  // namespace
 }  // namespace tint::builtin
diff --git a/src/tint/builtin/diagnostic_rule_test.cc b/src/tint/builtin/diagnostic_rule_test.cc
index 9982061..78bd3f3 100644
--- a/src/tint/builtin/diagnostic_rule_test.cc
+++ b/src/tint/builtin/diagnostic_rule_test.cc
@@ -29,13 +29,13 @@
 namespace tint::builtin {
 namespace {
 
-namespace diagnostic_rule_tests {
+namespace core_diagnostic_rule_tests {
 
 namespace parse_print_tests {
 
 struct Case {
     const char* string;
-    DiagnosticRule value;
+    CoreDiagnosticRule value;
 };
 
 inline std::ostream& operator<<(std::ostream& out, Case c) {
@@ -43,43 +43,95 @@
 }
 
 static constexpr Case kValidCases[] = {
-    {"chromium_unreachable_code", DiagnosticRule::kChromiumUnreachableCode},
-    {"derivative_uniformity", DiagnosticRule::kDerivativeUniformity},
+    {"derivative_uniformity", CoreDiagnosticRule::kDerivativeUniformity},
 };
 
 static constexpr Case kInvalidCases[] = {
-    {"chromium_unrachaccle_code", DiagnosticRule::kUndefined},
-    {"clromium_unreachab3_oe", DiagnosticRule::kUndefined},
-    {"chromium_unreachable_Vode", DiagnosticRule::kUndefined},
-    {"derivative_uniform1ty", DiagnosticRule::kUndefined},
-    {"derivativeJunifqrmity", DiagnosticRule::kUndefined},
-    {"derivative_unifllrmit77", DiagnosticRule::kUndefined},
+    {"deriative_unccformity", CoreDiagnosticRule::kUndefined},
+    {"dlivative_3iformiy", CoreDiagnosticRule::kUndefined},
+    {"derivative_uniforVity", CoreDiagnosticRule::kUndefined},
 };
 
-using DiagnosticRuleParseTest = testing::TestWithParam<Case>;
+using CoreDiagnosticRuleParseTest = testing::TestWithParam<Case>;
 
-TEST_P(DiagnosticRuleParseTest, Parse) {
+TEST_P(CoreDiagnosticRuleParseTest, Parse) {
     const char* string = GetParam().string;
-    DiagnosticRule expect = GetParam().value;
-    EXPECT_EQ(expect, ParseDiagnosticRule(string));
+    CoreDiagnosticRule expect = GetParam().value;
+    EXPECT_EQ(expect, ParseCoreDiagnosticRule(string));
 }
 
-INSTANTIATE_TEST_SUITE_P(ValidCases, DiagnosticRuleParseTest, testing::ValuesIn(kValidCases));
-INSTANTIATE_TEST_SUITE_P(InvalidCases, DiagnosticRuleParseTest, testing::ValuesIn(kInvalidCases));
+INSTANTIATE_TEST_SUITE_P(ValidCases, CoreDiagnosticRuleParseTest, testing::ValuesIn(kValidCases));
+INSTANTIATE_TEST_SUITE_P(InvalidCases,
+                         CoreDiagnosticRuleParseTest,
+                         testing::ValuesIn(kInvalidCases));
 
-using DiagnosticRulePrintTest = testing::TestWithParam<Case>;
+using CoreDiagnosticRulePrintTest = testing::TestWithParam<Case>;
 
-TEST_P(DiagnosticRulePrintTest, Print) {
-    DiagnosticRule value = GetParam().value;
+TEST_P(CoreDiagnosticRulePrintTest, Print) {
+    CoreDiagnosticRule value = GetParam().value;
     const char* expect = GetParam().string;
     EXPECT_EQ(expect, utils::ToString(value));
 }
 
-INSTANTIATE_TEST_SUITE_P(ValidCases, DiagnosticRulePrintTest, testing::ValuesIn(kValidCases));
+INSTANTIATE_TEST_SUITE_P(ValidCases, CoreDiagnosticRulePrintTest, testing::ValuesIn(kValidCases));
 
 }  // namespace parse_print_tests
 
-}  // namespace diagnostic_rule_tests
+}  // namespace core_diagnostic_rule_tests
+
+namespace chromium_diagnostic_rule_tests {
+
+namespace parse_print_tests {
+
+struct Case {
+    const char* string;
+    ChromiumDiagnosticRule value;
+};
+
+inline std::ostream& operator<<(std::ostream& out, Case c) {
+    return out << "'" << std::string(c.string) << "'";
+}
+
+static constexpr Case kValidCases[] = {
+    {"unreachable_code", ChromiumDiagnosticRule::kUnreachableCode},
+};
+
+static constexpr Case kInvalidCases[] = {
+    {"unreacha1le_code", ChromiumDiagnosticRule::kUndefined},
+    {"unreachableJcqde", ChromiumDiagnosticRule::kUndefined},
+    {"unreachable77llode", ChromiumDiagnosticRule::kUndefined},
+};
+
+using ChromiumDiagnosticRuleParseTest = testing::TestWithParam<Case>;
+
+TEST_P(ChromiumDiagnosticRuleParseTest, Parse) {
+    const char* string = GetParam().string;
+    ChromiumDiagnosticRule expect = GetParam().value;
+    EXPECT_EQ(expect, ParseChromiumDiagnosticRule(string));
+}
+
+INSTANTIATE_TEST_SUITE_P(ValidCases,
+                         ChromiumDiagnosticRuleParseTest,
+                         testing::ValuesIn(kValidCases));
+INSTANTIATE_TEST_SUITE_P(InvalidCases,
+                         ChromiumDiagnosticRuleParseTest,
+                         testing::ValuesIn(kInvalidCases));
+
+using ChromiumDiagnosticRulePrintTest = testing::TestWithParam<Case>;
+
+TEST_P(ChromiumDiagnosticRulePrintTest, Print) {
+    ChromiumDiagnosticRule value = GetParam().value;
+    const char* expect = GetParam().string;
+    EXPECT_EQ(expect, utils::ToString(value));
+}
+
+INSTANTIATE_TEST_SUITE_P(ValidCases,
+                         ChromiumDiagnosticRulePrintTest,
+                         testing::ValuesIn(kValidCases));
+
+}  // namespace parse_print_tests
+
+}  // namespace chromium_diagnostic_rule_tests
 
 }  // namespace
 }  // namespace tint::builtin
diff --git a/src/tint/builtin/diagnostic_rule_test.cc.tmpl b/src/tint/builtin/diagnostic_rule_test.cc.tmpl
index 106f6fc..cc12bf7 100644
--- a/src/tint/builtin/diagnostic_rule_test.cc.tmpl
+++ b/src/tint/builtin/diagnostic_rule_test.cc.tmpl
@@ -19,11 +19,17 @@
 namespace tint::builtin {
 namespace {
 
-namespace diagnostic_rule_tests {
+namespace core_diagnostic_rule_tests {
 
-{{ Eval "TestParsePrintEnum" (Sem.Enum "diagnostic_rule")}}
+{{ Eval "TestParsePrintEnum" (Sem.Enum "core_diagnostic_rule")}}
 
-}  // namespace diagnostic_rule_tests
+}  // namespace core_diagnostic_rule_tests
+
+namespace chromium_diagnostic_rule_tests {
+
+{{ Eval "TestParsePrintEnum" (Sem.Enum "chromium_diagnostic_rule")}}
+
+}  // namespace chromium_diagnostic_rule_tests
 
 }  // namespace
 }  // namespace tint::builtin
diff --git a/src/tint/builtin/function.cc b/src/tint/builtin/function.cc
index 88e86b6..332e9d1 100644
--- a/src/tint/builtin/function.cc
+++ b/src/tint/builtin/function.cc
@@ -24,7 +24,7 @@
 
 namespace tint::builtin {
 
-Function ParseFunction(const std::string& name) {
+Function ParseFunction(std::string_view name) {
     if (name == "abs") {
         return Function::kAbs;
     }
diff --git a/src/tint/builtin/function.cc.tmpl b/src/tint/builtin/function.cc.tmpl
index e2729dc..7912482 100644
--- a/src/tint/builtin/function.cc.tmpl
+++ b/src/tint/builtin/function.cc.tmpl
@@ -15,7 +15,7 @@
 
 namespace tint::builtin {
 
-Function ParseFunction(const std::string& name) {
+Function ParseFunction(std::string_view name) {
 {{- range Sem.Builtins  }}
     if (name == "{{.Name}}") {
         return Function::k{{PascalCase .Name}};
diff --git a/src/tint/builtin/function.h b/src/tint/builtin/function.h
index 3ccb341..046e87a 100644
--- a/src/tint/builtin/function.h
+++ b/src/tint/builtin/function.h
@@ -153,7 +153,7 @@
 /// @param name the builtin name to parse
 /// @returns the parsed Function, or Function::kNone if `name` did not
 /// match any builtin function.
-Function ParseFunction(const std::string& name);
+Function ParseFunction(std::string_view name);
 
 /// @returns the name of the builtin function type. The spelling, including
 /// case, matches the name in the WGSL spec.
diff --git a/src/tint/builtin/function.h.tmpl b/src/tint/builtin/function.h.tmpl
index d9109bf..02f9acb 100644
--- a/src/tint/builtin/function.h.tmpl
+++ b/src/tint/builtin/function.h.tmpl
@@ -33,7 +33,7 @@
 /// @param name the builtin name to parse
 /// @returns the parsed Function, or Function::kNone if `name` did not
 /// match any builtin function.
-Function ParseFunction(const std::string& name);
+Function ParseFunction(std::string_view name);
 
 /// @returns the name of the builtin function type. The spelling, including
 /// case, matches the name in the WGSL spec.
diff --git a/src/tint/cmd/BUILD.gn b/src/tint/cmd/BUILD.gn
index 946bd36..fae4f04 100644
--- a/src/tint/cmd/BUILD.gn
+++ b/src/tint/cmd/BUILD.gn
@@ -34,7 +34,6 @@
   deps = [
     ":tint_cmd_helper",
     "${tint_root_dir}/src/tint:libtint",
-    "${tint_root_dir}/src/tint:libtint_base_src",
     "${tint_root_dir}/src/tint:tint_utils_io",
     "${tint_root_dir}/src/tint:tint_val",
     "${tint_spirv_tools_dir}/:spvtools",
@@ -65,7 +64,6 @@
   deps = [
     ":tint_cmd_helper",
     "${tint_root_dir}/src/tint:libtint",
-    "${tint_root_dir}/src/tint:libtint_base_src",
     "${tint_root_dir}/src/tint:tint_utils_io",
     "${tint_root_dir}/src/tint:tint_val",
     "${tint_spirv_tools_dir}/:spvtools",
diff --git a/src/tint/intrinsics.def b/src/tint/intrinsics.def
index fae4ee4..ee4b517 100644
--- a/src/tint/intrinsics.def
+++ b/src/tint/intrinsics.def
@@ -41,11 +41,15 @@
 }
 
 // https://gpuweb.github.io/gpuweb/wgsl/#filterable-triggering-rules
-enum diagnostic_rule {
+enum core_diagnostic_rule {
   // Rules defined in the spec.
   derivative_uniformity
+}
+
+// chromium-specific diagnostics
+enum chromium_diagnostic_rule {
   // Chromium specific rules not defined in the spec.
-  chromium_unreachable_code
+  unreachable_code
 }
 
 // https://gpuweb.github.io/gpuweb/wgsl/#syntax-severity_control_name
@@ -858,6 +862,9 @@
 @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() -> 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>
diff --git a/src/tint/program_builder.h b/src/tint/program_builder.h
index b7fda95..b4f5eea 100644
--- a/src/tint/program_builder.h
+++ b/src/tint/program_builder.h
@@ -39,6 +39,7 @@
 #include "src/tint/ast/diagnostic_attribute.h"
 #include "src/tint/ast/diagnostic_control.h"
 #include "src/tint/ast/diagnostic_directive.h"
+#include "src/tint/ast/diagnostic_rule_name.h"
 #include "src/tint/ast/disable_validation_attribute.h"
 #include "src/tint/ast/discard_statement.h"
 #include "src/tint/ast/enable.h"
@@ -3752,57 +3753,129 @@
                                                                   validation);
     }
 
-    /// Creates an ast::DiagnosticAttribute
-    /// @param source the source information
-    /// @param severity the diagnostic severity control
-    /// @param rule_name the diagnostic rule name
-    /// @returns the diagnostic attribute pointer
+    /// Passthrough overload
+    /// @param name the diagnostic rule name
+    /// @returns @p name
+    const ast::DiagnosticRuleName* DiagnosticRuleName(const ast::DiagnosticRuleName* name) {
+        return name;
+    }
+
+    /// Creates an ast::DiagnosticRuleName
+    /// @param name the diagnostic rule name
+    /// @returns the diagnostic rule name
     template <typename NAME>
-    const ast::DiagnosticAttribute* DiagnosticAttribute(const Source& source,
-                                                        builtin::DiagnosticSeverity severity,
-                                                        NAME&& rule_name) {
+    const ast::DiagnosticRuleName* DiagnosticRuleName(NAME&& name) {
         static_assert(
             !utils::traits::IsType<utils::traits::PtrElTy<NAME>, ast::TemplatedIdentifier>,
             "it is invalid for a diagnostic rule name to be templated");
+        auto* name_ident = Ident(std::forward<NAME>(name));
+        return create<ast::DiagnosticRuleName>(name_ident->source, name_ident);
+    }
+
+    /// Creates an ast::DiagnosticRuleName
+    /// @param category the diagnostic rule category
+    /// @param name the diagnostic rule name
+    /// @returns the diagnostic rule name
+    template <typename CATEGORY, typename NAME, typename = DisableIfSource<CATEGORY>>
+    const ast::DiagnosticRuleName* DiagnosticRuleName(CATEGORY&& category, NAME&& name) {
+        static_assert(
+            !utils::traits::IsType<utils::traits::PtrElTy<NAME>, ast::TemplatedIdentifier>,
+            "it is invalid for a diagnostic rule name to be templated");
+        static_assert(
+            !utils::traits::IsType<utils::traits::PtrElTy<CATEGORY>, ast::TemplatedIdentifier>,
+            "it is invalid for a diagnostic rule category to be templated");
+        auto* category_ident = Ident(std::forward<CATEGORY>(category));
+        auto* name_ident = Ident(std::forward<NAME>(name));
+        Source source = category_ident->source;
+        source.range.end = name_ident->source.range.end;
+        return create<ast::DiagnosticRuleName>(source, category_ident, name_ident);
+    }
+
+    /// Creates an ast::DiagnosticRuleName
+    /// @param source the source information
+    /// @param name the diagnostic rule name
+    /// @returns the diagnostic rule name
+    template <typename NAME>
+    const ast::DiagnosticRuleName* DiagnosticRuleName(const Source& source, NAME&& name) {
+        static_assert(
+            !utils::traits::IsType<utils::traits::PtrElTy<NAME>, ast::TemplatedIdentifier>,
+            "it is invalid for a diagnostic rule name to be templated");
+        auto* name_ident = Ident(std::forward<NAME>(name));
+        return create<ast::DiagnosticRuleName>(source, name_ident);
+    }
+
+    /// Creates an ast::DiagnosticRuleName
+    /// @param source the source information
+    /// @param category the diagnostic rule category
+    /// @param name the diagnostic rule name
+    /// @returns the diagnostic rule name
+    template <typename CATEGORY, typename NAME>
+    const ast::DiagnosticRuleName* DiagnosticRuleName(const Source& source,
+                                                      CATEGORY&& category,
+                                                      NAME&& name) {
+        static_assert(
+            !utils::traits::IsType<utils::traits::PtrElTy<NAME>, ast::TemplatedIdentifier>,
+            "it is invalid for a diagnostic rule name to be templated");
+        static_assert(
+            !utils::traits::IsType<utils::traits::PtrElTy<CATEGORY>, ast::TemplatedIdentifier>,
+            "it is invalid for a diagnostic rule category to be templated");
+        auto* category_ident = Ident(std::forward<CATEGORY>(category));
+        auto* name_ident = Ident(std::forward<NAME>(name));
+        return create<ast::DiagnosticRuleName>(source, category_ident, name_ident);
+    }
+
+    /// Creates an ast::DiagnosticAttribute
+    /// @param source the source information
+    /// @param severity the diagnostic severity control
+    /// @param rule_args the arguments used to construct the rule name
+    /// @returns the diagnostic attribute pointer
+    template <typename... RULE_ARGS>
+    const ast::DiagnosticAttribute* DiagnosticAttribute(const Source& source,
+                                                        builtin::DiagnosticSeverity severity,
+                                                        RULE_ARGS&&... rule_args) {
         return create<ast::DiagnosticAttribute>(
-            source, ast::DiagnosticControl(severity, Ident(std::forward<NAME>(rule_name))));
+            source, ast::DiagnosticControl(
+                        severity, DiagnosticRuleName(std::forward<RULE_ARGS>(rule_args)...)));
     }
 
     /// Creates an ast::DiagnosticAttribute
     /// @param severity the diagnostic severity control
-    /// @param rule_name the diagnostic rule name
+    /// @param rule_args the arguments used to construct the rule name
     /// @returns the diagnostic attribute pointer
-    template <typename NAME>
+    template <typename... RULE_ARGS>
     const ast::DiagnosticAttribute* DiagnosticAttribute(builtin::DiagnosticSeverity severity,
-                                                        NAME&& rule_name) {
+                                                        RULE_ARGS&&... rule_args) {
         return create<ast::DiagnosticAttribute>(
-            source_, ast::DiagnosticControl(severity, Ident(std::forward<NAME>(rule_name))));
+            source_, ast::DiagnosticControl(
+                         severity, DiagnosticRuleName(std::forward<RULE_ARGS>(rule_args)...)));
     }
 
     /// Add a diagnostic directive to the module.
     /// @param source the source information
     /// @param severity the diagnostic severity control
-    /// @param rule_name the diagnostic rule name
+    /// @param rule_args the arguments used to construct the rule name
     /// @returns the diagnostic directive pointer
-    template <typename NAME>
+    template <typename... RULE_ARGS>
     const ast::DiagnosticDirective* DiagnosticDirective(const Source& source,
                                                         builtin::DiagnosticSeverity severity,
-                                                        NAME&& rule_name) {
-        auto* directive = create<ast::DiagnosticDirective>(
-            source, ast::DiagnosticControl(severity, Ident(std::forward<NAME>(rule_name))));
+                                                        RULE_ARGS&&... rule_args) {
+        auto* rule = DiagnosticRuleName(std::forward<RULE_ARGS>(rule_args)...);
+        auto* directive =
+            create<ast::DiagnosticDirective>(source, ast::DiagnosticControl(severity, rule));
         AST().AddDiagnosticDirective(directive);
         return directive;
     }
 
     /// Add a diagnostic directive to the module.
     /// @param severity the diagnostic severity control
-    /// @param rule_name the diagnostic rule name
+    /// @param rule_args the arguments used to construct the rule name
     /// @returns the diagnostic directive pointer
-    template <typename NAME>
+    template <typename... RULE_ARGS>
     const ast::DiagnosticDirective* DiagnosticDirective(builtin::DiagnosticSeverity severity,
-                                                        NAME&& rule_name) {
-        auto* directive = create<ast::DiagnosticDirective>(
-            source_, ast::DiagnosticControl(severity, Ident(std::forward<NAME>(rule_name))));
+                                                        RULE_ARGS&&... rule_args) {
+        auto* rule = DiagnosticRuleName(std::forward<RULE_ARGS>(rule_args)...);
+        auto* directive =
+            create<ast::DiagnosticDirective>(source_, ast::DiagnosticControl(severity, rule));
         AST().AddDiagnosticDirective(directive);
         return directive;
     }
diff --git a/src/tint/reader/wgsl/parser_impl.cc b/src/tint/reader/wgsl/parser_impl.cc
index 753f60b..514e7f8 100644
--- a/src/tint/reader/wgsl/parser_impl.cc
+++ b/src/tint/reader/wgsl/parser_impl.cc
@@ -72,39 +72,42 @@
 constexpr size_t const kMaxResynchronizeLookahead = 32;
 
 // https://gpuweb.github.io/gpuweb/wgsl.html#reserved-keywords
+//
+// Must be called with an identifier token.
 bool is_reserved(const Token& t) {
-    return t == "NULL" || t == "Self" || t == "abstract" || t == "active" || t == "alignas" ||
-           t == "alignof" || t == "as" || t == "asm" || t == "asm_fragment" || t == "async" ||
-           t == "attribute" || t == "auto" || t == "await" || t == "become" ||
-           t == "binding_array" || t == "cast" || t == "catch" || t == "class" || t == "co_await" ||
-           t == "co_return" || t == "co_yield" || t == "coherent" || t == "column_major" ||
-           t == "common" || t == "compile" || t == "compile_fragment" || t == "concept" ||
-           t == "const_cast" || t == "consteval" || t == "constexpr" || t == "constinit" ||
-           t == "crate" || t == "debugger" || t == "decltype" || t == "delete" || t == "demote" ||
-           t == "demote_to_helper" || t == "do" || t == "dynamic_cast" || t == "enum" ||
-           t == "explicit" || t == "export" || t == "extends" || t == "extern" || t == "external" ||
-           t == "filter" || t == "final" || t == "finally" || t == "friend" || t == "from" ||
-           t == "fxgroup" || t == "get" || t == "goto" || t == "groupshared" || t == "highp" ||
-           t == "impl" || t == "implements" || t == "import" || t == "inline" ||
-           t == "instanceof" || t == "interface" || t == "layout" || t == "lowp" || t == "macro" ||
-           t == "macro_rules" || t == "match" || t == "mediump" || t == "meta" || t == "mod" ||
-           t == "module" || t == "move" || t == "mut" || t == "mutable" || t == "namespace" ||
-           t == "new" || t == "nil" || t == "noexcept" || t == "noinline" ||
-           t == "nointerpolation" || t == "noperspective" || t == "null" || t == "nullptr" ||
-           t == "of" || t == "operator" || t == "package" || t == "packoffset" ||
-           t == "partition" || t == "pass" || t == "patch" || t == "pixelfragment" ||
-           t == "precise" || t == "precision" || t == "premerge" || t == "priv" ||
-           t == "protected" || t == "pub" || t == "public" || t == "readonly" || t == "ref" ||
-           t == "regardless" || t == "register" || t == "reinterpret_cast" || t == "require" ||
-           t == "resource" || t == "restrict" || t == "self" || t == "set" || t == "shared" ||
-           t == "sizeof" || t == "smooth" || t == "snorm" || t == "static" ||
-           t == "static_assert" || t == "static_cast" || t == "std" || t == "subroutine" ||
-           t == "super" || t == "target" || t == "template" || t == "this" || t == "thread_local" ||
-           t == "throw" || t == "trait" || t == "try" || t == "type" || t == "typedef" ||
-           t == "typeid" || t == "typename" || t == "typeof" || t == "union" || t == "unless" ||
-           t == "unorm" || t == "unsafe" || t == "unsized" || t == "use" || t == "using" ||
-           t == "varying" || t == "virtual" || t == "volatile" || t == "wgsl" || t == "where" ||
-           t == "with" || t == "writeonly" || t == "yield";
+    auto s = t.to_str_view();
+    return s == "NULL" || s == "Self" || s == "abstract" || s == "active" || s == "alignas" ||
+           s == "alignof" || s == "as" || s == "asm" || s == "asm_fragment" || s == "async" ||
+           s == "attribute" || s == "auto" || s == "await" || s == "become" ||
+           s == "binding_array" || s == "cast" || s == "catch" || s == "class" || s == "co_await" ||
+           s == "co_return" || s == "co_yield" || s == "coherent" || s == "column_major" ||
+           s == "common" || s == "compile" || s == "compile_fragment" || s == "concept" ||
+           s == "const_cast" || s == "consteval" || s == "constexpr" || s == "constinit" ||
+           s == "crate" || s == "debugger" || s == "decltype" || s == "delete" || s == "demote" ||
+           s == "demote_to_helper" || s == "do" || s == "dynamic_cast" || s == "enum" ||
+           s == "explicit" || s == "export" || s == "extends" || s == "extern" || s == "external" ||
+           s == "filter" || s == "final" || s == "finally" || s == "friend" || s == "from" ||
+           s == "fxgroup" || s == "get" || s == "goto" || s == "groupshared" || s == "highp" ||
+           s == "impl" || s == "implements" || s == "import" || s == "inline" ||
+           s == "instanceof" || s == "interface" || s == "layout" || s == "lowp" || s == "macro" ||
+           s == "macro_rules" || s == "match" || s == "mediump" || s == "meta" || s == "mod" ||
+           s == "module" || s == "move" || s == "mut" || s == "mutable" || s == "namespace" ||
+           s == "new" || s == "nil" || s == "noexcept" || s == "noinline" ||
+           s == "nointerpolation" || s == "noperspective" || s == "null" || s == "nullptr" ||
+           s == "of" || s == "operator" || s == "package" || s == "packoffset" ||
+           s == "partition" || s == "pass" || s == "patch" || s == "pixelfragment" ||
+           s == "precise" || s == "precision" || s == "premerge" || s == "priv" ||
+           s == "protected" || s == "pub" || s == "public" || s == "readonly" || s == "ref" ||
+           s == "regardless" || s == "register" || s == "reinterpret_cast" || s == "require" ||
+           s == "resource" || s == "restrict" || s == "self" || s == "set" || s == "shared" ||
+           s == "sizeof" || s == "smooth" || s == "snorm" || s == "static" ||
+           s == "static_assert" || s == "static_cast" || s == "std" || s == "subroutine" ||
+           s == "super" || s == "target" || s == "template" || s == "this" || s == "thread_local" ||
+           s == "throw" || s == "trait" || s == "try" || s == "type" || s == "typedef" ||
+           s == "typeid" || s == "typename" || s == "typeof" || s == "union" || s == "unless" ||
+           s == "unorm" || s == "unsafe" || s == "unsized" || s == "use" || s == "using" ||
+           s == "varying" || s == "virtual" || s == "volatile" || s == "wgsl" || s == "where" ||
+           s == "with" || s == "writeonly" || s == "yield";
 }
 
 /// Enter-exit counters for block token types.
@@ -179,10 +182,8 @@
 
 ParserImpl::TypedIdentifier::TypedIdentifier(const TypedIdentifier&) = default;
 
-ParserImpl::TypedIdentifier::TypedIdentifier(ast::Type type_in,
-                                             std::string name_in,
-                                             Source source_in)
-    : type(type_in), name(std::move(name_in)), source(std::move(source_in)) {}
+ParserImpl::TypedIdentifier::TypedIdentifier(ast::Type type_in, const ast::Identifier* name_in)
+    : type(type_in), name(name_in) {}
 
 ParserImpl::TypedIdentifier::~TypedIdentifier() = default;
 
@@ -191,7 +192,7 @@
 ParserImpl::FunctionHeader::FunctionHeader(const FunctionHeader&) = default;
 
 ParserImpl::FunctionHeader::FunctionHeader(Source src,
-                                           std::string n,
+                                           const ast::Identifier* n,
                                            utils::VectorRef<const ast::Parameter*> p,
                                            ast::Type ret_ty,
                                            utils::VectorRef<const ast::Attribute*> ret_attrs)
@@ -722,19 +723,18 @@
     }
 
     TINT_DEFER(attrs.Clear());
-
     if (is_overridable) {
-        return builder_.Override(decl->source,       // source
-                                 decl->name,         // symbol
-                                 decl->type,         // type
-                                 initializer,        // initializer
-                                 std::move(attrs));  // attributes
+        return builder_.Override(decl->name->source,  // source
+                                 decl->name,          // symbol
+                                 decl->type,          // type
+                                 initializer,         // initializer
+                                 std::move(attrs));   // attributes
     }
-    return builder_.GlobalConst(decl->source,       // source
-                                decl->name,         // symbol
-                                decl->type,         // type
-                                initializer,        // initializer
-                                std::move(attrs));  // attributes
+    return builder_.GlobalConst(decl->name->source,  // source
+                                decl->name,          // symbol
+                                decl->type,          // type
+                                initializer,         // initializer
+                                std::move(attrs));   // attributes
 }
 
 // variable_decl
@@ -762,7 +762,7 @@
         return Failure::kErrored;
     }
 
-    return VarDeclInfo{decl->source, decl->name, vq.address_space, vq.access, decl->type};
+    return VarDeclInfo{decl->name->source, decl->name, vq.address_space, vq.access, decl->type};
 }
 
 Expect<ParserImpl::TypedIdentifier> ParserImpl::expect_ident_with_optional_type_specifier(
@@ -774,7 +774,7 @@
     }
 
     if (allow_inferred && !peek_is(Token::Type::kColon)) {
-        return TypedIdentifier{ast::Type{}, ident.value, ident.source};
+        return TypedIdentifier{ast::Type{}, ident.value};
     }
 
     if (!expect(use, Token::Type::kColon)) {
@@ -790,7 +790,7 @@
         return add_error(t.source(), "invalid type", use);
     }
 
-    return TypedIdentifier{type.value, ident.value, ident.source};
+    return TypedIdentifier{type.value, ident.value};
 }
 
 // optionally_typed_ident
@@ -1006,7 +1006,7 @@
         return Failure::kErrored;
     }
 
-    return builder_.Member(decl->source, decl->name, decl->type, std::move(attrs.value));
+    return builder_.Member(decl->name->source, decl->name, decl->type, std::move(attrs.value));
 }
 
 // const_assert_statement
@@ -1123,8 +1123,7 @@
     }
 
     return FunctionHeader{
-        source,      std::move(name.value),        std::move(params.value),
-        return_type, std::move(return_attributes),
+        source, name.value, std::move(params.value), return_type, std::move(return_attributes),
     };
 }
 
@@ -1164,7 +1163,7 @@
         return Failure::kErrored;
     }
 
-    return builder_.Param(decl->source,             // source
+    return builder_.Param(decl->name->source,       // source
                           decl->name,               // symbol
                           decl->type,               // type
                           std::move(attrs.value));  // attributes
@@ -1446,10 +1445,10 @@
             return add_error(peek(), "missing initializer for 'const' declaration");
         }
 
-        auto* const_ = builder_.Const(typed_ident->source,  // source
-                                      typed_ident->name,    // symbol
-                                      typed_ident->type,    // type
-                                      initializer.value);   // initializer
+        auto* const_ = builder_.Const(typed_ident->name->source,  // source
+                                      typed_ident->name,          // symbol
+                                      typed_ident->type,          // type
+                                      initializer.value);         // initializer
 
         return create<ast::VariableDeclStatement>(decl_source, const_);
     }
@@ -1474,10 +1473,10 @@
             return add_error(peek(), "missing initializer for 'let' declaration");
         }
 
-        auto* let = builder_.Let(typed_ident->source,  // source
-                                 typed_ident->name,    // symbol
-                                 typed_ident->type,    // type
-                                 initializer.value);   // initializer
+        auto* let = builder_.Let(typed_ident->name->source,  // source
+                                 typed_ident->name,          // symbol
+                                 typed_ident->type,          // type
+                                 initializer.value);         // initializer
 
         return create<ast::VariableDeclStatement>(decl_source, let);
     }
@@ -2149,8 +2148,7 @@
                 return Failure::kErrored;
             }
 
-            prefix = builder_.MemberAccessor(ident.source, prefix,
-                                             builder_.Ident(ident.source, ident.value));
+            prefix = builder_.MemberAccessor(ident.source, prefix, ident.value);
             continue;
         }
 
@@ -3094,7 +3092,7 @@
 }
 
 // diagnostic_control
-// : PAREN_LEFT severity_control_name COMMA ident_pattern_token COMMA ? PAREN_RIGHT
+// : PAREN_LEFT severity_control_name COMMA diagnostic_rule_name COMMA ? PAREN_RIGHT
 Expect<ast::DiagnosticControl> ParserImpl::expect_diagnostic_control() {
     return expect_paren_block("diagnostic control", [&]() -> Expect<ast::DiagnosticControl> {
         auto severity_control = expect_severity_control_name();
@@ -3106,17 +3104,41 @@
             return Failure::kErrored;
         }
 
-        auto rule_name = expect_ident("diagnostic control");
+        auto rule_name = expect_diagnostic_rule_name();
         if (rule_name.errored) {
             return Failure::kErrored;
         }
         match(Token::Type::kComma);
 
-        return ast::DiagnosticControl(severity_control.value,
-                                      builder_.Ident(rule_name.source, rule_name.value));
+        return ast::DiagnosticControl(severity_control.value, rule_name.value);
     });
 }
 
+// diagnostic_rule_name :
+// | diagnostic_name_token
+// | diagnostic_name_token '.' diagnostic_name_token
+Expect<const ast::DiagnosticRuleName*> ParserImpl::expect_diagnostic_rule_name() {
+    if (peek_is(Token::Type::kPeriod, 1)) {
+        auto category = expect_ident("", "diagnostic rule category");
+        if (category.errored) {
+            return Failure::kErrored;
+        }
+        if (!expect("diagnostic rule", Token::Type::kPeriod)) {
+            return Failure::kErrored;
+        }
+        auto name = expect_ident("", "diagnostic rule name");
+        if (name.errored) {
+            return Failure::kErrored;
+        }
+        return builder_.DiagnosticRuleName(category.value, name.value);
+    }
+    auto name = expect_ident("", "diagnostic rule name");
+    if (name.errored) {
+        return Failure::kErrored;
+    }
+    return builder_.DiagnosticRuleName(name.value);
+}
+
 bool ParserImpl::match(Token::Type tok, Source* source /*= nullptr*/) {
     auto& t = peek();
 
@@ -3217,7 +3239,9 @@
     return {static_cast<uint32_t>(sint.value), sint.source};
 }
 
-Expect<std::string> ParserImpl::expect_ident(std::string_view use) {
+Expect<const ast::Identifier*> ParserImpl::expect_ident(
+    std::string_view use,
+    std::string_view kind /* = "identifier" */) {
     auto& t = peek();
     if (t.IsIdentifier()) {
         synchronized_ = true;
@@ -3227,13 +3251,13 @@
             return add_error(t.source(), "'" + t.to_str() + "' is a reserved keyword");
         }
 
-        return {t.to_str(), t.source()};
+        return builder_.Ident(t.source(), t.to_str());
     }
     if (handle_error(t)) {
         return Failure::kErrored;
     }
     synchronized_ = false;
-    return add_error(t.source(), "expected identifier", use);
+    return add_error(t.source(), "expected " + std::string(kind), use);
 }
 
 template <typename F, typename T>
diff --git a/src/tint/reader/wgsl/parser_impl.h b/src/tint/reader/wgsl/parser_impl.h
index 9789b4d..c7ac96d 100644
--- a/src/tint/reader/wgsl/parser_impl.h
+++ b/src/tint/reader/wgsl/parser_impl.h
@@ -211,17 +211,14 @@
         /// Constructor
         /// @param type_in parsed type
         /// @param name_in parsed identifier
-        /// @param source_in source to the identifier
-        TypedIdentifier(ast::Type type_in, std::string name_in, Source source_in);
+        TypedIdentifier(ast::Type type_in, const ast::Identifier* name_in);
         /// Destructor
         ~TypedIdentifier();
 
         /// Parsed type. type.expr be nullptr for inferred types.
         ast::Type type;
         /// Parsed identifier.
-        std::string name;
-        /// Source to the identifier.
-        Source source;
+        const ast::Identifier* name = nullptr;
     };
 
     /// FunctionHeader contains the parsed information for a function header.
@@ -238,7 +235,7 @@
         /// @param ret_ty function return type
         /// @param ret_attrs return type attributes
         FunctionHeader(Source src,
-                       std::string n,
+                       const ast::Identifier* n,
                        utils::VectorRef<const ast::Parameter*> p,
                        ast::Type ret_ty,
                        utils::VectorRef<const ast::Attribute*> ret_attrs);
@@ -252,7 +249,7 @@
         /// Parsed header source
         Source source;
         /// Function name
-        std::string name;
+        const ast::Identifier* name;
         /// Function parameters
         utils::Vector<const ast::Parameter*, 8> params;
         /// Function return type
@@ -266,7 +263,7 @@
         /// Variable declaration source
         Source source;
         /// Variable name
-        std::string name;
+        const ast::Identifier* name = nullptr;
         /// Variable address space
         const ast::Expression* address_space = nullptr;
         /// Variable access control
@@ -639,14 +636,17 @@
     /// Parses a single attribute, reporting an error if the next token does not
     /// represent a attribute.
     /// @see #attribute for the full list of attributes this method parses.
-    /// @return the parsed attribute, or nullptr on error.
+    /// @return the parsed attribute.
     Expect<const ast::Attribute*> expect_attribute();
     /// Parses a severity_control_name grammar element.
-    /// @return the parsed severity control name, or nullptr on error.
+    /// @return the parsed severity control name.
     Expect<builtin::DiagnosticSeverity> expect_severity_control_name();
     /// Parses a diagnostic_control grammar element.
-    /// @return the parsed diagnostic control, or nullptr on error.
+    /// @return the parsed diagnostic control.
     Expect<ast::DiagnosticControl> expect_diagnostic_control();
+    /// Parses a diagnostic_rule_name grammar element.
+    /// @return the parsed diagnostic rule name.
+    Expect<const ast::DiagnosticRuleName*> expect_diagnostic_rule_name();
 
     /// Splits a peekable token into to parts filling in the peekable fields.
     /// @param lhs the token to set in the current position
@@ -697,8 +697,11 @@
     /// Errors if the next token is not an identifier.
     /// Consumes the next token on match.
     /// @param use a description of what was being parsed if an error was raised
+    /// @param kind a string describing the kind of identifier.
+    ///             Examples: "identifier", "diagnostic name"
     /// @returns the parsed identifier.
-    Expect<std::string> expect_ident(std::string_view use);
+    Expect<const ast::Identifier*> expect_ident(std::string_view use,
+                                                std::string_view kind = "identifier");
     /// Parses a lexical block starting with the token `start` and ending with
     /// the token `end`. `body` is called to parse the lexical block body
     /// between the `start` and `end` tokens. If the `start` or `end` tokens
diff --git a/src/tint/reader/wgsl/parser_impl_diagnostic_attribute_test.cc b/src/tint/reader/wgsl/parser_impl_diagnostic_attribute_test.cc
index 991d5b6..69f0003 100644
--- a/src/tint/reader/wgsl/parser_impl_diagnostic_attribute_test.cc
+++ b/src/tint/reader/wgsl/parser_impl_diagnostic_attribute_test.cc
@@ -20,7 +20,7 @@
 namespace tint::reader::wgsl {
 namespace {
 
-TEST_F(ParserImplTest, DiagnosticAttribute_Valid) {
+TEST_F(ParserImplTest, DiagnosticAttribute_Name) {
     auto p = parser("diagnostic(off, foo)");
     auto a = p->attribute();
     EXPECT_FALSE(p->has_error()) << p->error();
@@ -30,7 +30,22 @@
     EXPECT_EQ(d->control.severity, builtin::DiagnosticSeverity::kOff);
     auto* r = d->control.rule_name;
     ASSERT_NE(r, nullptr);
-    ast::CheckIdentifier(r, "foo");
+    EXPECT_EQ(r->category, nullptr);
+    ast::CheckIdentifier(r->name, "foo");
+}
+
+TEST_F(ParserImplTest, DiagnosticAttribute_CategoryName) {
+    auto p = parser("diagnostic(off, foo.bar)");
+    auto a = p->attribute();
+    EXPECT_FALSE(p->has_error()) << p->error();
+    EXPECT_TRUE(a.matched);
+    auto* d = a.value->As<ast::DiagnosticAttribute>();
+    ASSERT_NE(d, nullptr);
+    EXPECT_EQ(d->control.severity, builtin::DiagnosticSeverity::kOff);
+    auto* r = d->control.rule_name;
+    ASSERT_NE(r, nullptr);
+    ast::CheckIdentifier(r->category, "foo");
+    ast::CheckIdentifier(r->name, "bar");
 }
 
 }  // namespace
diff --git a/src/tint/reader/wgsl/parser_impl_diagnostic_control_test.cc b/src/tint/reader/wgsl/parser_impl_diagnostic_control_test.cc
index e45d1e7..bad434e 100644
--- a/src/tint/reader/wgsl/parser_impl_diagnostic_control_test.cc
+++ b/src/tint/reader/wgsl/parser_impl_diagnostic_control_test.cc
@@ -23,7 +23,7 @@
 using SeverityPair = std::pair<std::string, builtin::DiagnosticSeverity>;
 class DiagnosticControlParserTest : public ParserImplTestWithParam<SeverityPair> {};
 
-TEST_P(DiagnosticControlParserTest, DiagnosticControl_Valid) {
+TEST_P(DiagnosticControlParserTest, DiagnosticControl_Name) {
     auto& params = GetParam();
     auto p = parser("(" + params.first + ", foo)");
     auto e = p->expect_diagnostic_control();
@@ -33,7 +33,21 @@
 
     auto* r = e->rule_name;
     ASSERT_NE(r, nullptr);
-    ast::CheckIdentifier(r, "foo");
+    EXPECT_EQ(r->category, nullptr);
+    ast::CheckIdentifier(r->name, "foo");
+}
+TEST_P(DiagnosticControlParserTest, DiagnosticControl_CategoryAndName) {
+    auto& params = GetParam();
+    auto p = parser("(" + params.first + ", foo.bar)");
+    auto e = p->expect_diagnostic_control();
+    EXPECT_FALSE(e.errored);
+    EXPECT_FALSE(p->has_error()) << p->error();
+    EXPECT_EQ(e->severity, params.second);
+
+    auto* r = e->rule_name;
+    ASSERT_NE(r, nullptr);
+    ast::CheckIdentifier(r->category, "foo");
+    ast::CheckIdentifier(r->name, "bar");
 }
 INSTANTIATE_TEST_SUITE_P(DiagnosticControlParserTest,
                          DiagnosticControlParserTest,
@@ -43,7 +57,7 @@
                                          SeverityPair{"info", builtin::DiagnosticSeverity::kInfo},
                                          SeverityPair{"off", builtin::DiagnosticSeverity::kOff}));
 
-TEST_F(ParserImplTest, DiagnosticControl_Valid_TrailingComma) {
+TEST_F(ParserImplTest, DiagnosticControl_Name_TrailingComma) {
     auto p = parser("(error, foo,)");
     auto e = p->expect_diagnostic_control();
     EXPECT_FALSE(e.errored);
@@ -52,7 +66,21 @@
 
     auto* r = e->rule_name;
     ASSERT_NE(r, nullptr);
-    ast::CheckIdentifier(r, "foo");
+    EXPECT_EQ(r->category, nullptr);
+    ast::CheckIdentifier(r->name, "foo");
+}
+
+TEST_F(ParserImplTest, DiagnosticControl_CategoryAndName_TrailingComma) {
+    auto p = parser("(error, foo.bar,)");
+    auto e = p->expect_diagnostic_control();
+    EXPECT_FALSE(e.errored);
+    EXPECT_FALSE(p->has_error()) << p->error();
+    EXPECT_EQ(e->severity, builtin::DiagnosticSeverity::kError);
+
+    auto* r = e->rule_name;
+    ASSERT_NE(r, nullptr);
+    ast::CheckIdentifier(r->category, "foo");
+    ast::CheckIdentifier(r->name, "bar");
 }
 
 TEST_F(ParserImplTest, DiagnosticControl_MissingOpenParen) {
@@ -102,7 +130,15 @@
     auto e = p->expect_diagnostic_control();
     EXPECT_TRUE(e.errored);
     EXPECT_TRUE(p->has_error());
-    EXPECT_EQ(p->error(), R"(1:6: expected identifier for diagnostic control)");
+    EXPECT_EQ(p->error(), R"(1:6: expected diagnostic rule name)");
+}
+
+TEST_F(ParserImplTest, DiagnosticControl_MissingRuleCategory) {
+    auto p = parser("(off,for.foo)");
+    auto e = p->expect_diagnostic_control();
+    EXPECT_TRUE(e.errored);
+    EXPECT_TRUE(p->has_error());
+    EXPECT_EQ(p->error(), R"(1:6: expected diagnostic rule category)");
 }
 
 TEST_F(ParserImplTest, DiagnosticControl_InvalidRuleName) {
diff --git a/src/tint/reader/wgsl/parser_impl_diagnostic_directive_test.cc b/src/tint/reader/wgsl/parser_impl_diagnostic_directive_test.cc
index 12b69f1..a965112 100644
--- a/src/tint/reader/wgsl/parser_impl_diagnostic_directive_test.cc
+++ b/src/tint/reader/wgsl/parser_impl_diagnostic_directive_test.cc
@@ -20,7 +20,7 @@
 namespace tint::reader::wgsl {
 namespace {
 
-TEST_F(ParserImplTest, DiagnosticDirective_Valid) {
+TEST_F(ParserImplTest, DiagnosticDirective_Name) {
     auto p = parser("diagnostic(off, foo);");
     p->diagnostic_directive();
     EXPECT_FALSE(p->has_error()) << p->error();
@@ -33,7 +33,25 @@
 
     auto* r = directive->control.rule_name;
     ASSERT_NE(r, nullptr);
-    ast::CheckIdentifier(r, "foo");
+    EXPECT_EQ(r->category, nullptr);
+    ast::CheckIdentifier(r->name, "foo");
+}
+
+TEST_F(ParserImplTest, DiagnosticDirective_CategoryName) {
+    auto p = parser("diagnostic(off, foo.bar);");
+    p->diagnostic_directive();
+    EXPECT_FALSE(p->has_error()) << p->error();
+    auto& ast = p->builder().AST();
+    ASSERT_EQ(ast.DiagnosticDirectives().Length(), 1u);
+    auto* directive = ast.DiagnosticDirectives()[0];
+    EXPECT_EQ(directive->control.severity, builtin::DiagnosticSeverity::kOff);
+    ASSERT_EQ(ast.GlobalDeclarations().Length(), 1u);
+    EXPECT_EQ(ast.GlobalDeclarations()[0], directive);
+
+    auto* r = directive->control.rule_name;
+    ASSERT_NE(r, nullptr);
+    ast::CheckIdentifier(r->category, "foo");
+    ast::CheckIdentifier(r->name, "bar");
 }
 
 TEST_F(ParserImplTest, DiagnosticDirective_MissingSemicolon) {
diff --git a/src/tint/reader/wgsl/parser_impl_function_header_test.cc b/src/tint/reader/wgsl/parser_impl_function_header_test.cc
index d92fef0..bfd762a 100644
--- a/src/tint/reader/wgsl/parser_impl_function_header_test.cc
+++ b/src/tint/reader/wgsl/parser_impl_function_header_test.cc
@@ -25,7 +25,7 @@
     EXPECT_TRUE(f.matched);
     EXPECT_FALSE(f.errored);
 
-    EXPECT_EQ(f->name, "main");
+    ast::CheckIdentifier(f->name, "main");
     ASSERT_EQ(f->params.Length(), 2u);
     EXPECT_EQ(f->params[0]->name->symbol, p->builder().Symbols().Get("a"));
     EXPECT_EQ(f->params[1]->name->symbol, p->builder().Symbols().Get("b"));
@@ -38,7 +38,7 @@
     EXPECT_TRUE(f.matched);
     EXPECT_FALSE(f.errored);
 
-    EXPECT_EQ(f->name, "main");
+    ast::CheckIdentifier(f->name, "main");
     ASSERT_EQ(f->params.Length(), 1u);
     EXPECT_EQ(f->params[0]->name->symbol, p->builder().Symbols().Get("a"));
     EXPECT_EQ(f->return_type, nullptr);
@@ -51,7 +51,7 @@
     EXPECT_TRUE(f.matched);
     EXPECT_FALSE(f.errored);
 
-    EXPECT_EQ(f->name, "main");
+    ast::CheckIdentifier(f->name, "main");
     EXPECT_EQ(f->params.Length(), 0u);
     ast::CheckIdentifier(f->return_type, "f32");
     ASSERT_EQ(f->return_type_attributes.Length(), 1u);
@@ -70,7 +70,7 @@
     EXPECT_TRUE(f.matched);
     EXPECT_FALSE(f.errored);
 
-    EXPECT_EQ(f->name, "main");
+    ast::CheckIdentifier(f->name, "main");
     EXPECT_EQ(f->params.Length(), 0u);
     ast::CheckIdentifier(f->return_type, "f32");
     ASSERT_EQ(f->return_type_attributes.Length(), 1u);
diff --git a/src/tint/reader/wgsl/parser_impl_variable_decl_test.cc b/src/tint/reader/wgsl/parser_impl_variable_decl_test.cc
index c8fb651..fb4691f 100644
--- a/src/tint/reader/wgsl/parser_impl_variable_decl_test.cc
+++ b/src/tint/reader/wgsl/parser_impl_variable_decl_test.cc
@@ -23,7 +23,7 @@
     EXPECT_FALSE(p->has_error());
     EXPECT_TRUE(v.matched);
     EXPECT_FALSE(v.errored);
-    EXPECT_EQ(v->name, "my_var");
+    ast::CheckIdentifier(v->name, "my_var");
     EXPECT_NE(v->type, nullptr);
 
     ast::CheckIdentifier(v->type, "f32");
@@ -43,7 +43,7 @@
     EXPECT_FALSE(p->has_error());
     EXPECT_TRUE(v.matched);
     EXPECT_FALSE(v.errored);
-    EXPECT_EQ(v->name, ident);
+    ast::CheckIdentifier(v->name, ident);
     EXPECT_NE(v->type, nullptr);
 
     ast::CheckIdentifier(v->type, "f32");
@@ -58,7 +58,7 @@
     EXPECT_FALSE(p->has_error());
     EXPECT_TRUE(v.matched);
     EXPECT_FALSE(v.errored);
-    EXPECT_EQ(v->name, "my_var");
+    ast::CheckIdentifier(v->name, "my_var");
     EXPECT_EQ(v->type, nullptr);
 
     EXPECT_EQ(v->source.range, (Source::Range{{1u, 5u}, {1u, 11u}}));
@@ -81,7 +81,7 @@
     EXPECT_TRUE(v.matched);
     EXPECT_FALSE(v.errored);
     EXPECT_FALSE(p->has_error());
-    EXPECT_EQ(v->name, "my_var");
+    ast::CheckIdentifier(v->name, "my_var");
 
     ast::CheckIdentifier(v->type, "f32");
     ast::CheckIdentifier(v->address_space, "private");
@@ -98,7 +98,7 @@
     EXPECT_TRUE(v.matched);
     EXPECT_FALSE(v.errored);
     EXPECT_FALSE(p->has_error());
-    EXPECT_EQ(v->name, "my_var");
+    ast::CheckIdentifier(v->name, "my_var");
 
     ast::CheckIdentifier(v->type, "f32");
     ast::CheckIdentifier(v->address_space, "push_constant");
diff --git a/src/tint/reader/wgsl/parser_impl_variable_ident_decl_test.cc b/src/tint/reader/wgsl/parser_impl_variable_ident_decl_test.cc
index 8de0a52..f2e70a8 100644
--- a/src/tint/reader/wgsl/parser_impl_variable_ident_decl_test.cc
+++ b/src/tint/reader/wgsl/parser_impl_variable_ident_decl_test.cc
@@ -23,11 +23,11 @@
     auto decl = p->expect_ident_with_type_specifier("test");
     ASSERT_FALSE(p->has_error()) << p->error();
     ASSERT_FALSE(decl.errored);
-    ASSERT_EQ(decl->name, "my_var");
+    ast::CheckIdentifier(decl->name, "my_var");
     ASSERT_NE(decl->type, nullptr);
     ast::CheckIdentifier(decl->type, "f32");
 
-    EXPECT_EQ(decl->source.range, (Source::Range{{1u, 1u}, {1u, 7u}}));
+    EXPECT_EQ(decl->name->source.range, (Source::Range{{1u, 1u}, {1u, 7u}}));
     EXPECT_EQ(decl->type->source.range, (Source::Range{{1u, 10u}, {1u, 13u}}));
 }
 
@@ -36,11 +36,11 @@
     auto decl = p->expect_optionally_typed_ident("test");
     ASSERT_FALSE(p->has_error()) << p->error();
     ASSERT_FALSE(decl.errored);
-    ASSERT_EQ(decl->name, "my_var");
+    ast::CheckIdentifier(decl->name, "my_var");
     ASSERT_NE(decl->type, nullptr);
     ast::CheckIdentifier(decl->type, "f32");
 
-    EXPECT_EQ(decl->source.range, (Source::Range{{1u, 1u}, {1u, 7u}}));
+    EXPECT_EQ(decl->name->source.range, (Source::Range{{1u, 1u}, {1u, 7u}}));
     EXPECT_EQ(decl->type->source.range, (Source::Range{{1u, 10u}, {1u, 13u}}));
 }
 
@@ -56,10 +56,10 @@
     auto decl = p->expect_optionally_typed_ident("test");
     ASSERT_FALSE(p->has_error()) << p->error();
     ASSERT_FALSE(decl.errored);
-    ASSERT_EQ(decl->name, "my_var");
+    ast::CheckIdentifier(decl->name, "my_var");
     ASSERT_EQ(decl->type, nullptr);
 
-    EXPECT_EQ(decl->source.range, (Source::Range{{1u, 1u}, {1u, 7u}}));
+    EXPECT_EQ(decl->name->source.range, (Source::Range{{1u, 1u}, {1u, 7u}}));
 }
 
 TEST_F(ParserImplTest, VariableIdentDecl_MissingIdent) {
diff --git a/src/tint/reader/wgsl/token.cc b/src/tint/reader/wgsl/token.cc
index e133dfc..04124e1 100644
--- a/src/tint/reader/wgsl/token.cc
+++ b/src/tint/reader/wgsl/token.cc
@@ -256,6 +256,18 @@
     }
 }
 
+std::string_view Token::to_str_view() const {
+    if (type_ != Type::kIdentifier) {
+        return {};
+    }
+
+    if (auto* view = std::get_if<std::string_view>(&value_)) {
+        return *view;
+    }
+    auto& s = std::get<std::string>(value_);
+    return {s.data(), s.length()};
+}
+
 double Token::to_f64() const {
     return std::get<double>(value_);
 }
diff --git a/src/tint/reader/wgsl/token.h b/src/tint/reader/wgsl/token.h
index 19bdd40..f7a9e0f 100644
--- a/src/tint/reader/wgsl/token.h
+++ b/src/tint/reader/wgsl/token.h
@@ -334,6 +334,10 @@
     /// Returns the string value of the token
     /// @return std::string
     std::string to_str() const;
+    /// Returns the string view of the token
+    /// @return std::string_view
+    /// @note if the token is not an identifier, an empty string_view will be returned.
+    std::string_view to_str_view() const;
     /// Returns the float value of the token. 0 is returned if the token does not
     /// contain a float value.
     /// @return double
diff --git a/src/tint/resolver/attribute_validation_test.cc b/src/tint/resolver/attribute_validation_test.cc
index d6a2f0f..098ab17 100644
--- a/src/tint/resolver/attribute_validation_test.cc
+++ b/src/tint/resolver/attribute_validation_test.cc
@@ -101,7 +101,7 @@
             return {builder.Builtin(source, builtin::BuiltinValue::kPosition)};
         case AttributeKind::kDiagnostic:
             return {builder.DiagnosticAttribute(source, builtin::DiagnosticSeverity::kInfo,
-                                                "chromium_unreachable_code")};
+                                                "chromium", "unreachable_code")};
         case AttributeKind::kGroup:
             return {builder.Group(source, 1_a)};
         case AttributeKind::kId:
diff --git a/src/tint/resolver/const_eval_binary_op_test.cc b/src/tint/resolver/const_eval_binary_op_test.cc
index 76441cd..6bf5830 100644
--- a/src/tint/resolver/const_eval_binary_op_test.cc
+++ b/src/tint/resolver/const_eval_binary_op_test.cc
@@ -1921,10 +1921,11 @@
     EXPECT_EQ(r()->error(),
               R"(12:34 error: no matching constructor for vec2<f32>(abstract-float, bool)
 
-4 candidate constructors:
+5 candidate constructors:
   vec2(x: T, y: T) -> vec2<T>  where: T is abstract-int, abstract-float, f32, f16, i32, u32 or bool
   vec2(T) -> vec2<T>  where: T is abstract-int, abstract-float, f32, f16, i32, u32 or bool
   vec2(vec2<T>) -> vec2<T>  where: T is abstract-int, abstract-float, f32, f16, i32, u32 or bool
+  vec2() -> vec2<abstract-int>
   vec2<T>() -> vec2<T>  where: T is f32, f16, i32, u32 or bool
 
 5 candidate conversions:
@@ -1948,10 +1949,11 @@
     EXPECT_EQ(r()->error(),
               R"(12:34 error: no matching constructor for vec2<f32>(abstract-float, bool)
 
-4 candidate constructors:
+5 candidate constructors:
   vec2(x: T, y: T) -> vec2<T>  where: T is abstract-int, abstract-float, f32, f16, i32, u32 or bool
   vec2(T) -> vec2<T>  where: T is abstract-int, abstract-float, f32, f16, i32, u32 or bool
   vec2(vec2<T>) -> vec2<T>  where: T is abstract-int, abstract-float, f32, f16, i32, u32 or bool
+  vec2() -> vec2<abstract-int>
   vec2<T>() -> vec2<T>  where: T is f32, f16, i32, u32 or bool
 
 5 candidate conversions:
diff --git a/src/tint/resolver/const_eval_construction_test.cc b/src/tint/resolver/const_eval_construction_test.cc
index e98d21f..361edbf 100644
--- a/src/tint/resolver/const_eval_construction_test.cc
+++ b/src/tint/resolver/const_eval_construction_test.cc
@@ -189,6 +189,9 @@
                              C<f32>(),
                              C<f16>(),
                              C<bool>(),
+                             C<builder::vec2<AInt>>(),
+                             C<builder::vec3<AInt>>(),
+                             C<builder::vec4<AInt>>(),
                              C<builder::vec3<u32>>(),
                              C<builder::vec3<i32>>(),
                              C<builder::vec3<f32>>(),
diff --git a/src/tint/resolver/dependency_graph.cc b/src/tint/resolver/dependency_graph.cc
index ec6bda7..5ba9ee2 100644
--- a/src/tint/resolver/dependency_graph.cc
+++ b/src/tint/resolver/dependency_graph.cc
@@ -436,48 +436,44 @@
     void AddDependency(const ast::Identifier* from, Symbol to) {
         auto* resolved = scope_stack_.Get(to);
         if (!resolved) {
-            auto s = to.Name();
-            if (auto builtin_fn = builtin::ParseFunction(s);
-                builtin_fn != builtin::Function::kNone) {
-                graph_.resolved_identifiers.Add(from, ResolvedIdentifier(builtin_fn));
-                return;
+            switch (to.Type()) {
+                case Symbol::BuiltinType::kNone:
+                    graph_.resolved_identifiers.Add(from, UnresolvedIdentifier{to.Name()});
+                    break;
+                case Symbol::BuiltinType::kFunction:
+                    graph_.resolved_identifiers.Add(
+                        from, ResolvedIdentifier(to.BuiltinValue<builtin::Function>()));
+                    break;
+                case Symbol::BuiltinType::kBuiltin:
+                    graph_.resolved_identifiers.Add(
+                        from, ResolvedIdentifier(to.BuiltinValue<builtin::Builtin>()));
+                    break;
+                case Symbol::BuiltinType::kBuiltinValue:
+                    graph_.resolved_identifiers.Add(
+                        from, ResolvedIdentifier(to.BuiltinValue<builtin::BuiltinValue>()));
+                    break;
+                case Symbol::BuiltinType::kAddressSpace:
+                    graph_.resolved_identifiers.Add(
+                        from, ResolvedIdentifier(to.BuiltinValue<builtin::AddressSpace>()));
+                    break;
+                case Symbol::BuiltinType::kTexelFormat:
+                    graph_.resolved_identifiers.Add(
+                        from, ResolvedIdentifier(to.BuiltinValue<builtin::TexelFormat>()));
+                    break;
+                case Symbol::BuiltinType::kAccess:
+                    graph_.resolved_identifiers.Add(
+                        from, ResolvedIdentifier(to.BuiltinValue<builtin::Access>()));
+                    break;
+                case Symbol::BuiltinType::kInterpolationType:
+                    graph_.resolved_identifiers.Add(
+                        from, ResolvedIdentifier(to.BuiltinValue<builtin::InterpolationType>()));
+                    break;
+                case Symbol::BuiltinType::kInterpolationSampling:
+                    graph_.resolved_identifiers.Add(
+                        from,
+                        ResolvedIdentifier(to.BuiltinValue<builtin::InterpolationSampling>()));
+                    break;
             }
-            if (auto builtin_ty = builtin::ParseBuiltin(s);
-                builtin_ty != builtin::Builtin::kUndefined) {
-                graph_.resolved_identifiers.Add(from, ResolvedIdentifier(builtin_ty));
-                return;
-            }
-            if (auto builtin_val = builtin::ParseBuiltinValue(s);
-                builtin_val != builtin::BuiltinValue::kUndefined) {
-                graph_.resolved_identifiers.Add(from, ResolvedIdentifier(builtin_val));
-                return;
-            }
-            if (auto addr = builtin::ParseAddressSpace(s);
-                addr != builtin::AddressSpace::kUndefined) {
-                graph_.resolved_identifiers.Add(from, ResolvedIdentifier(addr));
-                return;
-            }
-            if (auto fmt = builtin::ParseTexelFormat(s); fmt != builtin::TexelFormat::kUndefined) {
-                graph_.resolved_identifiers.Add(from, ResolvedIdentifier(fmt));
-                return;
-            }
-            if (auto access = builtin::ParseAccess(s); access != builtin::Access::kUndefined) {
-                graph_.resolved_identifiers.Add(from, ResolvedIdentifier(access));
-                return;
-            }
-            if (auto i_type = builtin::ParseInterpolationType(s);
-                i_type != builtin::InterpolationType::kUndefined) {
-                graph_.resolved_identifiers.Add(from, ResolvedIdentifier(i_type));
-                return;
-            }
-            if (auto i_smpl = builtin::ParseInterpolationSampling(s);
-                i_smpl != builtin::InterpolationSampling::kUndefined) {
-                graph_.resolved_identifiers.Add(from, ResolvedIdentifier(i_smpl));
-                return;
-            }
-
-            // Unresolved.
-            graph_.resolved_identifiers.Add(from, UnresolvedIdentifier{s});
             return;
         }
 
diff --git a/src/tint/resolver/diagnostic_control_test.cc b/src/tint/resolver/diagnostic_control_test.cc
index d7143c7..527acd1 100644
--- a/src/tint/resolver/diagnostic_control_test.cc
+++ b/src/tint/resolver/diagnostic_control_test.cc
@@ -32,7 +32,7 @@
 }
 
 TEST_F(ResolverDiagnosticControlTest, UnreachableCode_ErrorViaDirective) {
-    DiagnosticDirective(builtin::DiagnosticSeverity::kError, "chromium_unreachable_code");
+    DiagnosticDirective(builtin::DiagnosticSeverity::kError, "chromium", "unreachable_code");
 
     auto stmts = utils::Vector{Return(), Return()};
     Func("foo", {}, ty.void_(), stmts);
@@ -42,7 +42,7 @@
 }
 
 TEST_F(ResolverDiagnosticControlTest, UnreachableCode_WarningViaDirective) {
-    DiagnosticDirective(builtin::DiagnosticSeverity::kWarning, "chromium_unreachable_code");
+    DiagnosticDirective(builtin::DiagnosticSeverity::kWarning, "chromium", "unreachable_code");
 
     auto stmts = utils::Vector{Return(), Return()};
     Func("foo", {}, ty.void_(), stmts);
@@ -52,7 +52,7 @@
 }
 
 TEST_F(ResolverDiagnosticControlTest, UnreachableCode_InfoViaDirective) {
-    DiagnosticDirective(builtin::DiagnosticSeverity::kInfo, "chromium_unreachable_code");
+    DiagnosticDirective(builtin::DiagnosticSeverity::kInfo, "chromium", "unreachable_code");
 
     auto stmts = utils::Vector{Return(), Return()};
     Func("foo", {}, ty.void_(), stmts);
@@ -62,7 +62,7 @@
 }
 
 TEST_F(ResolverDiagnosticControlTest, UnreachableCode_OffViaDirective) {
-    DiagnosticDirective(builtin::DiagnosticSeverity::kOff, "chromium_unreachable_code");
+    DiagnosticDirective(builtin::DiagnosticSeverity::kOff, "chromium", "unreachable_code");
 
     auto stmts = utils::Vector{Return(), Return()};
     Func("foo", {}, ty.void_(), stmts);
@@ -73,7 +73,7 @@
 
 TEST_F(ResolverDiagnosticControlTest, UnreachableCode_ErrorViaAttribute) {
     auto* attr =
-        DiagnosticAttribute(builtin::DiagnosticSeverity::kError, "chromium_unreachable_code");
+        DiagnosticAttribute(builtin::DiagnosticSeverity::kError, "chromium", "unreachable_code");
 
     auto stmts = utils::Vector{Return(), Return()};
     Func("foo", {}, ty.void_(), stmts, utils::Vector{attr});
@@ -84,7 +84,7 @@
 
 TEST_F(ResolverDiagnosticControlTest, UnreachableCode_WarningViaAttribute) {
     auto* attr =
-        DiagnosticAttribute(builtin::DiagnosticSeverity::kWarning, "chromium_unreachable_code");
+        DiagnosticAttribute(builtin::DiagnosticSeverity::kWarning, "chromium", "unreachable_code");
 
     auto stmts = utils::Vector{Return(), Return()};
     Func("foo", {}, ty.void_(), stmts, utils::Vector{attr});
@@ -95,7 +95,7 @@
 
 TEST_F(ResolverDiagnosticControlTest, UnreachableCode_InfoViaAttribute) {
     auto* attr =
-        DiagnosticAttribute(builtin::DiagnosticSeverity::kInfo, "chromium_unreachable_code");
+        DiagnosticAttribute(builtin::DiagnosticSeverity::kInfo, "chromium", "unreachable_code");
 
     auto stmts = utils::Vector{Return(), Return()};
     Func("foo", {}, ty.void_(), stmts, utils::Vector{attr});
@@ -106,7 +106,7 @@
 
 TEST_F(ResolverDiagnosticControlTest, UnreachableCode_OffViaAttribute) {
     auto* attr =
-        DiagnosticAttribute(builtin::DiagnosticSeverity::kOff, "chromium_unreachable_code");
+        DiagnosticAttribute(builtin::DiagnosticSeverity::kOff, "chromium", "unreachable_code");
 
     auto stmts = utils::Vector{Return(), Return()};
     Func("foo", {}, ty.void_(), stmts, utils::Vector{attr});
@@ -116,15 +116,15 @@
 }
 
 TEST_F(ResolverDiagnosticControlTest, UnreachableCode_ErrorViaDirective_OverriddenViaAttribute) {
-    // diagnostic(error, chromium_unreachable_code);
+    // diagnostic(error, chromium.unreachable_code);
     //
-    // @diagnostic(off, chromium_unreachable_code) fn foo() {
+    // @diagnostic(off, chromium.unreachable_code) fn foo() {
     //   return;
     //   return; // Should produce a warning
     // }
-    DiagnosticDirective(builtin::DiagnosticSeverity::kError, "chromium_unreachable_code");
+    DiagnosticDirective(builtin::DiagnosticSeverity::kError, "chromium", "unreachable_code");
     auto* attr =
-        DiagnosticAttribute(builtin::DiagnosticSeverity::kWarning, "chromium_unreachable_code");
+        DiagnosticAttribute(builtin::DiagnosticSeverity::kWarning, "chromium", "unreachable_code");
 
     auto stmts = utils::Vector{Return(), Return()};
     Func("foo", {}, ty.void_(), stmts, utils::Vector{attr});
@@ -134,7 +134,7 @@
 }
 
 TEST_F(ResolverDiagnosticControlTest, FunctionAttributeScope) {
-    // @diagnostic(off, chromium_unreachable_code) fn foo() {
+    // @diagnostic(off, chromium.unreachable_code) fn foo() {
     //   return;
     //   return; // Should not produce a diagnostic
     // }
@@ -144,13 +144,13 @@
     //   return; // Should produce a warning (default severity)
     // }
     //
-    // @diagnostic(info, chromium_unreachable_code) fn bar() {
+    // @diagnostic(info, chromium.unreachable_code) fn bar() {
     //   return;
     //   return; // Should produce an info
     // }
     {
         auto* attr =
-            DiagnosticAttribute(builtin::DiagnosticSeverity::kOff, "chromium_unreachable_code");
+            DiagnosticAttribute(builtin::DiagnosticSeverity::kOff, "chromium", "unreachable_code");
         Func("foo", {}, ty.void_(),
              utils::Vector{
                  Return(),
@@ -167,7 +167,7 @@
     }
     {
         auto* attr =
-            DiagnosticAttribute(builtin::DiagnosticSeverity::kInfo, "chromium_unreachable_code");
+            DiagnosticAttribute(builtin::DiagnosticSeverity::kInfo, "chromium", "unreachable_code");
         Func("zoo", {}, ty.void_(),
              utils::Vector{
                  Return(),
@@ -182,17 +182,17 @@
 }
 
 TEST_F(ResolverDiagnosticControlTest, BlockAttributeScope) {
-    // fn foo() @diagnostic(off, chromium_unreachable_code) {
+    // fn foo() @diagnostic(off, chromium.unreachable_code) {
     //   {
     //     return;
     //     return; // Should not produce a diagnostic
     //   }
-    //   @diagnostic(warning, chromium_unreachable_code) {
-    //     if (true) @diagnostic(info, chromium_unreachable_code) {
+    //   @diagnostic(warning, chromium.unreachable_code) {
+    //     if (true) @diagnostic(info, chromium.unreachable_code) {
     //       return;
     //       return; // Should produce an info
     //     } else {
-    //       while (true) @diagnostic(off, chromium_unreachable_code) {
+    //       while (true) @diagnostic(off, chromium.unreachable_code) {
     //         return;
     //         return; // Should not produce a diagnostic
     //       }
@@ -203,7 +203,7 @@
     // }
 
     auto attr = [&](auto severity) {
-        return utils::Vector{DiagnosticAttribute(severity, "chromium_unreachable_code")};
+        return utils::Vector{DiagnosticAttribute(severity, "chromium", "unreachable_code")};
     };
     Func("foo", {}, ty.void_(),
          utils::Vector{
@@ -241,113 +241,157 @@
 78:87 warning: code is unreachable)");
 }
 
-TEST_F(ResolverDiagnosticControlTest, UnrecognizedRuleName_Directive) {
+TEST_F(ResolverDiagnosticControlTest, UnrecognizedCoreRuleName_Directive) {
     DiagnosticDirective(builtin::DiagnosticSeverity::kError,
-                        Ident(Source{{12, 34}}, "chromium_unreachable_cod"));
+                        DiagnosticRuleName(Source{{12, 34}}, "derivative_uniform"));
     EXPECT_TRUE(r()->Resolve()) << r()->error();
     EXPECT_EQ(r()->error(),
-              R"(12:34 warning: unrecognized diagnostic rule 'chromium_unreachable_cod'
-Did you mean 'chromium_unreachable_code'?
-Possible values: 'chromium_unreachable_code', 'derivative_uniformity')");
+              R"(12:34 warning: unrecognized diagnostic rule 'derivative_uniform'
+Did you mean 'derivative_uniformity'?
+Possible values: 'derivative_uniformity')");
 }
 
-TEST_F(ResolverDiagnosticControlTest, UnrecognizedRuleName_Attribute) {
+TEST_F(ResolverDiagnosticControlTest, UnrecognizedCoreRuleName_Attribute) {
     auto* attr = DiagnosticAttribute(builtin::DiagnosticSeverity::kError,
-                                     Ident(Source{{12, 34}}, "chromium_unreachable_cod"));
+                                     DiagnosticRuleName(Source{{12, 34}}, "derivative_uniform"));
     Func("foo", {}, ty.void_(), {}, utils::Vector{attr});
     EXPECT_TRUE(r()->Resolve()) << r()->error();
     EXPECT_EQ(r()->error(),
-              R"(12:34 warning: unrecognized diagnostic rule 'chromium_unreachable_cod'
-Did you mean 'chromium_unreachable_code'?
-Possible values: 'chromium_unreachable_code', 'derivative_uniformity')");
+              R"(12:34 warning: unrecognized diagnostic rule 'derivative_uniform'
+Did you mean 'derivative_uniformity'?
+Possible values: 'derivative_uniformity')");
+}
+
+TEST_F(ResolverDiagnosticControlTest, UnrecognizedChromiumRuleName_Directive) {
+    DiagnosticDirective(builtin::DiagnosticSeverity::kError,
+                        DiagnosticRuleName(Source{{12, 34}}, "chromium", "unreachable_cod"));
+    EXPECT_TRUE(r()->Resolve()) << r()->error();
+    EXPECT_EQ(r()->error(),
+              R"(12:34 warning: unrecognized diagnostic rule 'chromium.unreachable_cod'
+Did you mean 'chromium.unreachable_code'?
+Possible values: 'chromium.unreachable_code')");
+}
+
+TEST_F(ResolverDiagnosticControlTest, UnrecognizedChromiumRuleName_Attribute) {
+    auto* attr =
+        DiagnosticAttribute(builtin::DiagnosticSeverity::kError,
+                            DiagnosticRuleName(Source{{12, 34}}, "chromium", "unreachable_cod"));
+    Func("foo", {}, ty.void_(), {}, utils::Vector{attr});
+    EXPECT_TRUE(r()->Resolve()) << r()->error();
+    EXPECT_EQ(r()->error(),
+              R"(12:34 warning: unrecognized diagnostic rule 'chromium.unreachable_cod'
+Did you mean 'chromium.unreachable_code'?
+Possible values: 'chromium.unreachable_code')");
+}
+
+TEST_F(ResolverDiagnosticControlTest, UnrecognizedOtherRuleName_Directive) {
+    DiagnosticDirective(builtin::DiagnosticSeverity::kError,
+                        DiagnosticRuleName(Source{{12, 34}}, "unknown", "unreachable_cod"));
+    EXPECT_TRUE(r()->Resolve()) << r()->error();
+    EXPECT_EQ(r()->error(), "");
+}
+
+TEST_F(ResolverDiagnosticControlTest, UnrecognizedOtherRuleName_Attribute) {
+    auto* attr =
+        DiagnosticAttribute(builtin::DiagnosticSeverity::kError,
+                            DiagnosticRuleName(Source{{12, 34}}, "unknown", "unreachable_cod"));
+    Func("foo", {}, ty.void_(), {}, utils::Vector{attr});
+    EXPECT_TRUE(r()->Resolve()) << r()->error();
+    EXPECT_EQ(r()->error(), "");
 }
 
 TEST_F(ResolverDiagnosticControlTest, Conflict_SameNameSameSeverity_Directive) {
     DiagnosticDirective(builtin::DiagnosticSeverity::kError,
-                        Ident(Source{{12, 34}}, "chromium_unreachable_code"));
+                        DiagnosticRuleName(Source{{12, 34}}, "chromium", "unreachable_code"));
     DiagnosticDirective(builtin::DiagnosticSeverity::kError,
-                        Ident(Source{{56, 78}}, "chromium_unreachable_code"));
+                        DiagnosticRuleName(Source{{56, 78}}, "chromium", "unreachable_code"));
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
 
 TEST_F(ResolverDiagnosticControlTest, Conflict_SameNameDifferentSeverity_Directive) {
     DiagnosticDirective(builtin::DiagnosticSeverity::kError,
-                        Ident(Source{{12, 34}}, "chromium_unreachable_code"));
+                        DiagnosticRuleName(Source{{12, 34}}, "chromium", "unreachable_code"));
     DiagnosticDirective(builtin::DiagnosticSeverity::kOff,
-                        Ident(Source{{56, 78}}, "chromium_unreachable_code"));
+                        DiagnosticRuleName(Source{{56, 78}}, "chromium", "unreachable_code"));
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(),
               R"(56:78 error: conflicting diagnostic directive
-12:34 note: severity of 'chromium_unreachable_code' set to 'off' here)");
+12:34 note: severity of 'chromium.unreachable_code' set to 'off' here)");
 }
 
 TEST_F(ResolverDiagnosticControlTest, Conflict_SameUnknownNameDifferentSeverity_Directive) {
     DiagnosticDirective(builtin::DiagnosticSeverity::kError,
-                        Ident(Source{{12, 34}}, "chromium_unreachable_codes"));
+                        DiagnosticRuleName(Source{{12, 34}}, "chromium", "unreachable_codes"));
     DiagnosticDirective(builtin::DiagnosticSeverity::kOff,
-                        Ident(Source{{56, 78}}, "chromium_unreachable_codes"));
+                        DiagnosticRuleName(Source{{56, 78}}, "chromium", "unreachable_codes"));
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(),
-              R"(12:34 warning: unrecognized diagnostic rule 'chromium_unreachable_codes'
-Did you mean 'chromium_unreachable_code'?
-Possible values: 'chromium_unreachable_code', 'derivative_uniformity'
-56:78 warning: unrecognized diagnostic rule 'chromium_unreachable_codes'
-Did you mean 'chromium_unreachable_code'?
-Possible values: 'chromium_unreachable_code', 'derivative_uniformity'
+              R"(12:34 warning: unrecognized diagnostic rule 'chromium.unreachable_codes'
+Did you mean 'chromium.unreachable_code'?
+Possible values: 'chromium.unreachable_code'
+56:78 warning: unrecognized diagnostic rule 'chromium.unreachable_codes'
+Did you mean 'chromium.unreachable_code'?
+Possible values: 'chromium.unreachable_code'
 56:78 error: conflicting diagnostic directive
-12:34 note: severity of 'chromium_unreachable_codes' set to 'off' here)");
+12:34 note: severity of 'chromium.unreachable_codes' set to 'off' here)");
 }
 
 TEST_F(ResolverDiagnosticControlTest, Conflict_DifferentUnknownNameDifferentSeverity_Directive) {
-    DiagnosticDirective(builtin::DiagnosticSeverity::kError, "chromium_unreachable_codes");
-    DiagnosticDirective(builtin::DiagnosticSeverity::kOff, "chromium_unreachable_codex");
+    DiagnosticDirective(builtin::DiagnosticSeverity::kError, "chromium", "unreachable_codes");
+    DiagnosticDirective(builtin::DiagnosticSeverity::kOff, "chromium", "unreachable_codex");
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
 
 TEST_F(ResolverDiagnosticControlTest, Conflict_SameNameSameSeverity_Attribute) {
-    auto* attr1 = DiagnosticAttribute(builtin::DiagnosticSeverity::kError,
-                                      Ident(Source{{12, 34}}, "chromium_unreachable_code"));
-    auto* attr2 = DiagnosticAttribute(builtin::DiagnosticSeverity::kError,
-                                      Ident(Source{{56, 78}}, "chromium_unreachable_code"));
+    auto* attr1 =
+        DiagnosticAttribute(builtin::DiagnosticSeverity::kError,
+                            DiagnosticRuleName(Source{{12, 34}}, "chromium", "unreachable_code"));
+    auto* attr2 =
+        DiagnosticAttribute(builtin::DiagnosticSeverity::kError,
+                            DiagnosticRuleName(Source{{56, 78}}, "chromium", "unreachable_code"));
     Func("foo", {}, ty.void_(), {}, utils::Vector{attr1, attr2});
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
 
 TEST_F(ResolverDiagnosticControlTest, Conflict_SameNameDifferentSeverity_Attribute) {
-    auto* attr1 = DiagnosticAttribute(builtin::DiagnosticSeverity::kError,
-                                      Ident(Source{{12, 34}}, "chromium_unreachable_code"));
-    auto* attr2 = DiagnosticAttribute(builtin::DiagnosticSeverity::kOff,
-                                      Ident(Source{{56, 78}}, "chromium_unreachable_code"));
+    auto* attr1 =
+        DiagnosticAttribute(builtin::DiagnosticSeverity::kError,
+                            DiagnosticRuleName(Source{{12, 34}}, "chromium", "unreachable_code"));
+    auto* attr2 =
+        DiagnosticAttribute(builtin::DiagnosticSeverity::kOff,
+                            DiagnosticRuleName(Source{{56, 78}}, "chromium", "unreachable_code"));
     Func("foo", {}, ty.void_(), {}, utils::Vector{attr1, attr2});
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(),
               R"(56:78 error: conflicting diagnostic attribute
-12:34 note: severity of 'chromium_unreachable_code' set to 'off' here)");
+12:34 note: severity of 'chromium.unreachable_code' set to 'off' here)");
 }
 
 TEST_F(ResolverDiagnosticControlTest, Conflict_SameUnknownNameDifferentSeverity_Attribute) {
-    auto* attr1 = DiagnosticAttribute(builtin::DiagnosticSeverity::kError,
-                                      Ident(Source{{12, 34}}, "chromium_unreachable_codes"));
-    auto* attr2 = DiagnosticAttribute(builtin::DiagnosticSeverity::kOff,
-                                      Ident(Source{{56, 78}}, "chromium_unreachable_codes"));
+    auto* attr1 =
+        DiagnosticAttribute(builtin::DiagnosticSeverity::kError,
+                            DiagnosticRuleName(Source{{12, 34}}, "chromium", "unreachable_codes"));
+    auto* attr2 =
+        DiagnosticAttribute(builtin::DiagnosticSeverity::kOff,
+                            DiagnosticRuleName(Source{{56, 78}}, "chromium", "unreachable_codes"));
     Func("foo", {}, ty.void_(), {}, utils::Vector{attr1, attr2});
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(),
-              R"(12:34 warning: unrecognized diagnostic rule 'chromium_unreachable_codes'
-Did you mean 'chromium_unreachable_code'?
-Possible values: 'chromium_unreachable_code', 'derivative_uniformity'
-56:78 warning: unrecognized diagnostic rule 'chromium_unreachable_codes'
-Did you mean 'chromium_unreachable_code'?
-Possible values: 'chromium_unreachable_code', 'derivative_uniformity'
+              R"(12:34 warning: unrecognized diagnostic rule 'chromium.unreachable_codes'
+Did you mean 'chromium.unreachable_code'?
+Possible values: 'chromium.unreachable_code'
+56:78 warning: unrecognized diagnostic rule 'chromium.unreachable_codes'
+Did you mean 'chromium.unreachable_code'?
+Possible values: 'chromium.unreachable_code'
 56:78 error: conflicting diagnostic attribute
-12:34 note: severity of 'chromium_unreachable_codes' set to 'off' here)");
+12:34 note: severity of 'chromium.unreachable_codes' set to 'off' here)");
 }
 
 TEST_F(ResolverDiagnosticControlTest, Conflict_DifferentUnknownNameDifferentSeverity_Attribute) {
     auto* attr1 =
-        DiagnosticAttribute(builtin::DiagnosticSeverity::kError, "chromium_unreachable_codes");
+        DiagnosticAttribute(builtin::DiagnosticSeverity::kError, "chromium", "unreachable_codes");
     auto* attr2 =
-        DiagnosticAttribute(builtin::DiagnosticSeverity::kOff, "chromium_unreachable_codex");
+        DiagnosticAttribute(builtin::DiagnosticSeverity::kOff, "chromium", "unreachable_codex");
     Func("foo", {}, ty.void_(), {}, utils::Vector{attr1, attr2});
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
diff --git a/src/tint/resolver/intrinsic_table.cc b/src/tint/resolver/intrinsic_table.cc
index 6aa050b..fc226eb 100644
--- a/src/tint/resolver/intrinsic_table.cc
+++ b/src/tint/resolver/intrinsic_table.cc
@@ -180,6 +180,9 @@
         return numbers_[idx];
     }
 
+    /// @return the total number of type and number templates
+    size_t Count() const { return types_.Length() + numbers_.Length(); }
+
   private:
     utils::Vector<const type::Type*, 4> types_;
     utils::Vector<Number, 2> numbers_;
@@ -1589,6 +1592,7 @@
     // The overloads with the lowest score will be displayed first (top-most).
     constexpr int kMismatchedParamCountPenalty = 3;
     constexpr int kMismatchedParamTypePenalty = 2;
+    constexpr int kMismatchedTemplateCountPenalty = 1;
     constexpr int kMismatchedTemplateTypePenalty = 1;
     constexpr int kMismatchedTemplateNumberPenalty = 1;
 
@@ -1602,6 +1606,15 @@
                                                  std::min(num_parameters, num_arguments));
     }
 
+    if (score == 0) {
+        // Check that all of the template arguments provided are actually expected by the overload.
+        size_t expected_templates = overload->num_template_types + overload->num_template_numbers;
+        size_t provided_templates = in_templates.Count();
+        if (provided_templates > expected_templates) {
+            score += kMismatchedTemplateCountPenalty * (provided_templates - expected_templates);
+        }
+    }
+
     // Make a mutable copy of the input templates so we can implicitly match more templated
     // arguments.
     TemplateState templates(in_templates);
diff --git a/src/tint/resolver/intrinsic_table.inl b/src/tint/resolver/intrinsic_table.inl
index 895d489..19e9b7a 100644
--- a/src/tint/resolver/intrinsic_table.inl
+++ b/src/tint/resolver/intrinsic_table.inl
@@ -3004,83 +3004,89 @@
   /* [162] */ 52,
   /* [163] */ 0,
   /* [164] */ 11,
-  /* [165] */ 10,
+  /* [165] */ 5,
   /* [166] */ 11,
-  /* [167] */ 4,
-  /* [168] */ 12,
-  /* [169] */ 10,
+  /* [167] */ 10,
+  /* [168] */ 11,
+  /* [169] */ 4,
   /* [170] */ 12,
-  /* [171] */ 4,
-  /* [172] */ 13,
-  /* [173] */ 1,
-  /* [174] */ 13,
-  /* [175] */ 10,
+  /* [171] */ 5,
+  /* [172] */ 12,
+  /* [173] */ 10,
+  /* [174] */ 12,
+  /* [175] */ 4,
   /* [176] */ 13,
-  /* [177] */ 4,
-  /* [178] */ 14,
-  /* [179] */ 0,
-  /* [180] */ 14,
-  /* [181] */ 9,
-  /* [182] */ 14,
-  /* [183] */ 10,
-  /* [184] */ 15,
+  /* [177] */ 5,
+  /* [178] */ 13,
+  /* [179] */ 1,
+  /* [180] */ 13,
+  /* [181] */ 10,
+  /* [182] */ 13,
+  /* [183] */ 4,
+  /* [184] */ 14,
   /* [185] */ 0,
-  /* [186] */ 15,
+  /* [186] */ 14,
   /* [187] */ 9,
-  /* [188] */ 15,
+  /* [188] */ 14,
   /* [189] */ 10,
-  /* [190] */ 16,
+  /* [190] */ 15,
   /* [191] */ 0,
-  /* [192] */ 16,
+  /* [192] */ 15,
   /* [193] */ 9,
-  /* [194] */ 16,
+  /* [194] */ 15,
   /* [195] */ 10,
-  /* [196] */ 17,
+  /* [196] */ 16,
   /* [197] */ 0,
-  /* [198] */ 17,
+  /* [198] */ 16,
   /* [199] */ 9,
-  /* [200] */ 17,
+  /* [200] */ 16,
   /* [201] */ 10,
-  /* [202] */ 18,
+  /* [202] */ 17,
   /* [203] */ 0,
-  /* [204] */ 18,
+  /* [204] */ 17,
   /* [205] */ 9,
-  /* [206] */ 18,
+  /* [206] */ 17,
   /* [207] */ 10,
-  /* [208] */ 19,
+  /* [208] */ 18,
   /* [209] */ 0,
-  /* [210] */ 19,
+  /* [210] */ 18,
   /* [211] */ 9,
-  /* [212] */ 19,
+  /* [212] */ 18,
   /* [213] */ 10,
-  /* [214] */ 20,
+  /* [214] */ 19,
   /* [215] */ 0,
-  /* [216] */ 20,
+  /* [216] */ 19,
   /* [217] */ 9,
-  /* [218] */ 20,
+  /* [218] */ 19,
   /* [219] */ 10,
-  /* [220] */ 21,
+  /* [220] */ 20,
   /* [221] */ 0,
-  /* [222] */ 21,
+  /* [222] */ 20,
   /* [223] */ 9,
-  /* [224] */ 21,
+  /* [224] */ 20,
   /* [225] */ 10,
-  /* [226] */ 22,
+  /* [226] */ 21,
   /* [227] */ 0,
-  /* [228] */ 22,
+  /* [228] */ 21,
   /* [229] */ 9,
-  /* [230] */ 22,
+  /* [230] */ 21,
   /* [231] */ 10,
-  /* [232] */ 47,
+  /* [232] */ 22,
   /* [233] */ 0,
-  /* [234] */ 37,
-  /* [235] */ 38,
-  /* [236] */ 39,
-  /* [237] */ 40,
-  /* [238] */ 41,
-  /* [239] */ 46,
-  /* [240] */ 28,
-  /* [241] */ 29,
+  /* [234] */ 22,
+  /* [235] */ 9,
+  /* [236] */ 22,
+  /* [237] */ 10,
+  /* [238] */ 47,
+  /* [239] */ 0,
+  /* [240] */ 37,
+  /* [241] */ 38,
+  /* [242] */ 39,
+  /* [243] */ 40,
+  /* [244] */ 41,
+  /* [245] */ 46,
+  /* [246] */ 28,
+  /* [247] */ 29,
 };
 
 // Assert that the MatcherIndex is big enough to index all the matchers, plus
@@ -3423,7 +3429,7 @@
   {
     /* [66] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [67] */
@@ -3463,7 +3469,7 @@
   {
     /* [74] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [75] */
@@ -3483,12 +3489,12 @@
   {
     /* [78] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[235],
+    /* matcher indices */ &kMatcherIndices[241],
   },
   {
     /* [79] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[241],
+    /* matcher indices */ &kMatcherIndices[247],
   },
   {
     /* [80] */
@@ -3518,7 +3524,7 @@
   {
     /* [85] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [86] */
@@ -3543,12 +3549,12 @@
   {
     /* [90] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[235],
+    /* matcher indices */ &kMatcherIndices[241],
   },
   {
     /* [91] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[241],
+    /* matcher indices */ &kMatcherIndices[247],
   },
   {
     /* [92] */
@@ -3573,12 +3579,12 @@
   {
     /* [96] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[235],
+    /* matcher indices */ &kMatcherIndices[241],
   },
   {
     /* [97] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[241],
+    /* matcher indices */ &kMatcherIndices[247],
   },
   {
     /* [98] */
@@ -3608,7 +3614,7 @@
   {
     /* [103] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [104] */
@@ -3638,7 +3644,7 @@
   {
     /* [109] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [110] */
@@ -3668,7 +3674,7 @@
   {
     /* [115] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [116] */
@@ -3698,7 +3704,7 @@
   {
     /* [121] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [122] */
@@ -3728,7 +3734,7 @@
   {
     /* [127] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [128] */
@@ -3753,12 +3759,12 @@
   {
     /* [132] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[235],
+    /* matcher indices */ &kMatcherIndices[241],
   },
   {
     /* [133] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [134] */
@@ -3853,7 +3859,7 @@
   {
     /* [152] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [153] */
@@ -3878,7 +3884,7 @@
   {
     /* [157] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [158] */
@@ -3903,7 +3909,7 @@
   {
     /* [162] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [163] */
@@ -3918,12 +3924,12 @@
   {
     /* [165] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[235],
+    /* matcher indices */ &kMatcherIndices[241],
   },
   {
     /* [166] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [167] */
@@ -3943,12 +3949,12 @@
   {
     /* [170] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[234],
+    /* matcher indices */ &kMatcherIndices[240],
   },
   {
     /* [171] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[241],
+    /* matcher indices */ &kMatcherIndices[247],
   },
   {
     /* [172] */
@@ -3968,12 +3974,12 @@
   {
     /* [175] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[235],
+    /* matcher indices */ &kMatcherIndices[241],
   },
   {
     /* [176] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[241],
+    /* matcher indices */ &kMatcherIndices[247],
   },
   {
     /* [177] */
@@ -3993,12 +3999,12 @@
   {
     /* [180] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[237],
+    /* matcher indices */ &kMatcherIndices[243],
   },
   {
     /* [181] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[241],
+    /* matcher indices */ &kMatcherIndices[247],
   },
   {
     /* [182] */
@@ -4023,7 +4029,7 @@
   {
     /* [186] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [187] */
@@ -4043,12 +4049,12 @@
   {
     /* [190] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[235],
+    /* matcher indices */ &kMatcherIndices[241],
   },
   {
     /* [191] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [192] */
@@ -4073,7 +4079,7 @@
   {
     /* [196] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [197] */
@@ -4098,7 +4104,7 @@
   {
     /* [201] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [202] */
@@ -4123,7 +4129,7 @@
   {
     /* [206] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [207] */
@@ -4148,7 +4154,7 @@
   {
     /* [211] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [212] */
@@ -4168,12 +4174,12 @@
   {
     /* [215] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[234],
+    /* matcher indices */ &kMatcherIndices[240],
   },
   {
     /* [216] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[241],
+    /* matcher indices */ &kMatcherIndices[247],
   },
   {
     /* [217] */
@@ -4193,12 +4199,12 @@
   {
     /* [220] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[235],
+    /* matcher indices */ &kMatcherIndices[241],
   },
   {
     /* [221] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[241],
+    /* matcher indices */ &kMatcherIndices[247],
   },
   {
     /* [222] */
@@ -4218,12 +4224,12 @@
   {
     /* [225] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[237],
+    /* matcher indices */ &kMatcherIndices[243],
   },
   {
     /* [226] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[241],
+    /* matcher indices */ &kMatcherIndices[247],
   },
   {
     /* [227] */
@@ -4243,12 +4249,12 @@
   {
     /* [230] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[234],
+    /* matcher indices */ &kMatcherIndices[240],
   },
   {
     /* [231] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[241],
+    /* matcher indices */ &kMatcherIndices[247],
   },
   {
     /* [232] */
@@ -4268,12 +4274,12 @@
   {
     /* [235] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[235],
+    /* matcher indices */ &kMatcherIndices[241],
   },
   {
     /* [236] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[241],
+    /* matcher indices */ &kMatcherIndices[247],
   },
   {
     /* [237] */
@@ -4293,12 +4299,12 @@
   {
     /* [240] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[237],
+    /* matcher indices */ &kMatcherIndices[243],
   },
   {
     /* [241] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[241],
+    /* matcher indices */ &kMatcherIndices[247],
   },
   {
     /* [242] */
@@ -4323,7 +4329,7 @@
   {
     /* [246] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [247] */
@@ -4348,7 +4354,7 @@
   {
     /* [251] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [252] */
@@ -4373,7 +4379,7 @@
   {
     /* [256] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [257] */
@@ -4398,7 +4404,7 @@
   {
     /* [261] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [262] */
@@ -4423,7 +4429,7 @@
   {
     /* [266] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [267] */
@@ -4448,7 +4454,7 @@
   {
     /* [271] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [272] */
@@ -4473,7 +4479,7 @@
   {
     /* [276] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [277] */
@@ -4493,12 +4499,12 @@
   {
     /* [280] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[234],
+    /* matcher indices */ &kMatcherIndices[240],
   },
   {
     /* [281] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [282] */
@@ -4518,12 +4524,12 @@
   {
     /* [285] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[235],
+    /* matcher indices */ &kMatcherIndices[241],
   },
   {
     /* [286] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [287] */
@@ -4543,12 +4549,12 @@
   {
     /* [290] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[237],
+    /* matcher indices */ &kMatcherIndices[243],
   },
   {
     /* [291] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [292] */
@@ -4618,7 +4624,7 @@
   {
     /* [305] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [306] */
@@ -4638,7 +4644,7 @@
   {
     /* [309] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [310] */
@@ -4648,12 +4654,12 @@
   {
     /* [311] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[234],
+    /* matcher indices */ &kMatcherIndices[240],
   },
   {
     /* [312] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [313] */
@@ -4668,12 +4674,12 @@
   {
     /* [315] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[235],
+    /* matcher indices */ &kMatcherIndices[241],
   },
   {
     /* [316] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [317] */
@@ -4688,12 +4694,12 @@
   {
     /* [319] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[237],
+    /* matcher indices */ &kMatcherIndices[243],
   },
   {
     /* [320] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [321] */
@@ -4708,12 +4714,12 @@
   {
     /* [323] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[234],
+    /* matcher indices */ &kMatcherIndices[240],
   },
   {
     /* [324] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[241],
+    /* matcher indices */ &kMatcherIndices[247],
   },
   {
     /* [325] */
@@ -4728,12 +4734,12 @@
   {
     /* [327] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[236],
+    /* matcher indices */ &kMatcherIndices[242],
   },
   {
     /* [328] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[241],
+    /* matcher indices */ &kMatcherIndices[247],
   },
   {
     /* [329] */
@@ -4753,7 +4759,7 @@
   {
     /* [332] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [333] */
@@ -4773,7 +4779,7 @@
   {
     /* [336] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [337] */
@@ -4793,7 +4799,7 @@
   {
     /* [340] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [341] */
@@ -4813,7 +4819,7 @@
   {
     /* [344] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [345] */
@@ -4828,12 +4834,12 @@
   {
     /* [347] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[234],
+    /* matcher indices */ &kMatcherIndices[240],
   },
   {
     /* [348] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [349] */
@@ -4848,12 +4854,12 @@
   {
     /* [351] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[235],
+    /* matcher indices */ &kMatcherIndices[241],
   },
   {
     /* [352] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [353] */
@@ -4868,12 +4874,12 @@
   {
     /* [355] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[237],
+    /* matcher indices */ &kMatcherIndices[243],
   },
   {
     /* [356] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [357] */
@@ -4893,7 +4899,7 @@
   {
     /* [360] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [361] */
@@ -4913,7 +4919,7 @@
   {
     /* [364] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [365] */
@@ -4933,7 +4939,7 @@
   {
     /* [368] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [369] */
@@ -4948,12 +4954,12 @@
   {
     /* [371] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[234],
+    /* matcher indices */ &kMatcherIndices[240],
   },
   {
     /* [372] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[241],
+    /* matcher indices */ &kMatcherIndices[247],
   },
   {
     /* [373] */
@@ -4968,12 +4974,12 @@
   {
     /* [375] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[236],
+    /* matcher indices */ &kMatcherIndices[242],
   },
   {
     /* [376] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[241],
+    /* matcher indices */ &kMatcherIndices[247],
   },
   {
     /* [377] */
@@ -4988,12 +4994,12 @@
   {
     /* [379] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[234],
+    /* matcher indices */ &kMatcherIndices[240],
   },
   {
     /* [380] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[241],
+    /* matcher indices */ &kMatcherIndices[247],
   },
   {
     /* [381] */
@@ -5008,12 +5014,12 @@
   {
     /* [383] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[236],
+    /* matcher indices */ &kMatcherIndices[242],
   },
   {
     /* [384] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[241],
+    /* matcher indices */ &kMatcherIndices[247],
   },
   {
     /* [385] */
@@ -5033,7 +5039,7 @@
   {
     /* [388] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [389] */
@@ -5053,7 +5059,7 @@
   {
     /* [392] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [393] */
@@ -5073,7 +5079,7 @@
   {
     /* [396] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [397] */
@@ -5088,12 +5094,12 @@
   {
     /* [399] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[234],
+    /* matcher indices */ &kMatcherIndices[240],
   },
   {
     /* [400] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [401] */
@@ -5108,12 +5114,12 @@
   {
     /* [403] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[236],
+    /* matcher indices */ &kMatcherIndices[242],
   },
   {
     /* [404] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [405] */
@@ -5208,7 +5214,7 @@
   {
     /* [423] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[235],
+    /* matcher indices */ &kMatcherIndices[241],
   },
   {
     /* [424] */
@@ -5568,12 +5574,12 @@
   {
     /* [495] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[234],
+    /* matcher indices */ &kMatcherIndices[240],
   },
   {
     /* [496] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [497] */
@@ -5583,12 +5589,12 @@
   {
     /* [498] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[236],
+    /* matcher indices */ &kMatcherIndices[242],
   },
   {
     /* [499] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [500] */
@@ -5603,7 +5609,7 @@
   {
     /* [502] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [503] */
@@ -5618,7 +5624,7 @@
   {
     /* [505] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [506] */
@@ -5633,7 +5639,7 @@
   {
     /* [508] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [509] */
@@ -5648,7 +5654,7 @@
   {
     /* [511] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [512] */
@@ -5658,12 +5664,12 @@
   {
     /* [513] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[234],
+    /* matcher indices */ &kMatcherIndices[240],
   },
   {
     /* [514] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [515] */
@@ -5673,12 +5679,12 @@
   {
     /* [516] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[236],
+    /* matcher indices */ &kMatcherIndices[242],
   },
   {
     /* [517] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [518] */
@@ -5693,7 +5699,7 @@
   {
     /* [520] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [521] */
@@ -5703,12 +5709,12 @@
   {
     /* [522] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[239],
+    /* matcher indices */ &kMatcherIndices[245],
   },
   {
     /* [523] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[240],
+    /* matcher indices */ &kMatcherIndices[246],
   },
   {
     /* [524] */
@@ -5913,7 +5919,7 @@
   {
     /* [564] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[234],
+    /* matcher indices */ &kMatcherIndices[240],
   },
   {
     /* [565] */
@@ -5928,7 +5934,7 @@
   {
     /* [567] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[238],
+    /* matcher indices */ &kMatcherIndices[244],
   },
   {
     /* [568] */
@@ -6313,7 +6319,7 @@
   {
     /* [644] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[234],
+    /* matcher indices */ &kMatcherIndices[240],
   },
   {
     /* [645] */
@@ -6323,7 +6329,7 @@
   {
     /* [646] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[235],
+    /* matcher indices */ &kMatcherIndices[241],
   },
   {
     /* [647] */
@@ -6333,7 +6339,7 @@
   {
     /* [648] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[236],
+    /* matcher indices */ &kMatcherIndices[242],
   },
   {
     /* [649] */
@@ -6343,7 +6349,7 @@
   {
     /* [650] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[237],
+    /* matcher indices */ &kMatcherIndices[243],
   },
   {
     /* [651] */
@@ -6353,7 +6359,7 @@
   {
     /* [652] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[239],
+    /* matcher indices */ &kMatcherIndices[245],
   },
   {
     /* [653] */
@@ -7693,27 +7699,27 @@
   {
     /* [920] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[234],
+    /* matcher indices */ &kMatcherIndices[240],
   },
   {
     /* [921] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[235],
+    /* matcher indices */ &kMatcherIndices[241],
   },
   {
     /* [922] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[236],
+    /* matcher indices */ &kMatcherIndices[242],
   },
   {
     /* [923] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[237],
+    /* matcher indices */ &kMatcherIndices[243],
   },
   {
     /* [924] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[238],
+    /* matcher indices */ &kMatcherIndices[244],
   },
   {
     /* [925] */
@@ -7738,7 +7744,7 @@
   {
     /* [929] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[239],
+    /* matcher indices */ &kMatcherIndices[245],
   },
   {
     /* [930] */
@@ -7753,12 +7759,12 @@
   {
     /* [932] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[235],
+    /* matcher indices */ &kMatcherIndices[241],
   },
   {
     /* [933] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[237],
+    /* matcher indices */ &kMatcherIndices[243],
   },
   {
     /* [934] */
@@ -7798,22 +7804,22 @@
   {
     /* [941] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[234],
+    /* matcher indices */ &kMatcherIndices[240],
   },
   {
     /* [942] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[235],
+    /* matcher indices */ &kMatcherIndices[241],
   },
   {
     /* [943] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[236],
+    /* matcher indices */ &kMatcherIndices[242],
   },
   {
     /* [944] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[237],
+    /* matcher indices */ &kMatcherIndices[243],
   },
   {
     /* [945] */
@@ -7823,7 +7829,7 @@
   {
     /* [946] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[238],
+    /* matcher indices */ &kMatcherIndices[244],
   },
   {
     /* [947] */
@@ -7998,162 +8004,162 @@
   {
     /* [981] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[172],
+    /* matcher indices */ &kMatcherIndices[178],
   },
   {
     /* [982] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[172],
+    /* matcher indices */ &kMatcherIndices[178],
   },
   {
     /* [983] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[172],
+    /* matcher indices */ &kMatcherIndices[178],
   },
   {
     /* [984] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[172],
+    /* matcher indices */ &kMatcherIndices[178],
   },
   {
     /* [985] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[172],
+    /* matcher indices */ &kMatcherIndices[178],
   },
   {
     /* [986] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[178],
+    /* matcher indices */ &kMatcherIndices[184],
   },
   {
     /* [987] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[180],
+    /* matcher indices */ &kMatcherIndices[186],
   },
   {
     /* [988] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[182],
+    /* matcher indices */ &kMatcherIndices[188],
   },
   {
     /* [989] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[184],
+    /* matcher indices */ &kMatcherIndices[190],
   },
   {
     /* [990] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[186],
+    /* matcher indices */ &kMatcherIndices[192],
   },
   {
     /* [991] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[188],
+    /* matcher indices */ &kMatcherIndices[194],
   },
   {
     /* [992] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[190],
+    /* matcher indices */ &kMatcherIndices[196],
   },
   {
     /* [993] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[192],
+    /* matcher indices */ &kMatcherIndices[198],
   },
   {
     /* [994] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[194],
+    /* matcher indices */ &kMatcherIndices[200],
   },
   {
     /* [995] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[196],
+    /* matcher indices */ &kMatcherIndices[202],
   },
   {
     /* [996] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[198],
+    /* matcher indices */ &kMatcherIndices[204],
   },
   {
     /* [997] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[200],
+    /* matcher indices */ &kMatcherIndices[206],
   },
   {
     /* [998] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[202],
+    /* matcher indices */ &kMatcherIndices[208],
   },
   {
     /* [999] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[204],
+    /* matcher indices */ &kMatcherIndices[210],
   },
   {
     /* [1000] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[206],
+    /* matcher indices */ &kMatcherIndices[212],
   },
   {
     /* [1001] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[208],
+    /* matcher indices */ &kMatcherIndices[214],
   },
   {
     /* [1002] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[210],
+    /* matcher indices */ &kMatcherIndices[216],
   },
   {
     /* [1003] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[212],
+    /* matcher indices */ &kMatcherIndices[218],
   },
   {
     /* [1004] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[214],
+    /* matcher indices */ &kMatcherIndices[220],
   },
   {
     /* [1005] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[216],
+    /* matcher indices */ &kMatcherIndices[222],
   },
   {
     /* [1006] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[218],
+    /* matcher indices */ &kMatcherIndices[224],
   },
   {
     /* [1007] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[220],
+    /* matcher indices */ &kMatcherIndices[226],
   },
   {
     /* [1008] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[222],
+    /* matcher indices */ &kMatcherIndices[228],
   },
   {
     /* [1009] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[224],
+    /* matcher indices */ &kMatcherIndices[230],
   },
   {
     /* [1010] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[226],
+    /* matcher indices */ &kMatcherIndices[232],
   },
   {
     /* [1011] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[228],
+    /* matcher indices */ &kMatcherIndices[234],
   },
   {
     /* [1012] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[230],
+    /* matcher indices */ &kMatcherIndices[236],
   },
   {
     /* [1013] */
@@ -8735,186 +8741,18 @@
   },
   {
     /* [27] */
-    /* num parameters */ 3,
+    /* num parameters */ 0,
     /* num template types */ 0,
     /* num template numbers */ 0,
     /* template types */ &kTemplateTypes[38],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[501],
-    /* return matcher indices */ &kMatcherIndices[114],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
+    /* parameters */ &kParameters[1014],
+    /* return matcher indices */ &kMatcherIndices[176],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Zero,
   },
   {
     /* [28] */
-    /* num parameters */ 3,
-    /* num template types */ 0,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[38],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[504],
-    /* return matcher indices */ &kMatcherIndices[114],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
-  },
-  {
-    /* [29] */
-    /* num parameters */ 4,
-    /* num template types */ 0,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[38],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[331],
-    /* return matcher indices */ &kMatcherIndices[114],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
-  },
-  {
-    /* [30] */
-    /* num parameters */ 4,
-    /* num template types */ 1,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[2],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[335],
-    /* return matcher indices */ &kMatcherIndices[114],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
-  },
-  {
-    /* [31] */
-    /* num parameters */ 5,
-    /* num template types */ 1,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[2],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[185],
-    /* return matcher indices */ &kMatcherIndices[114],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
-  },
-  {
-    /* [32] */
-    /* num parameters */ 3,
-    /* num template types */ 0,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[38],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[507],
-    /* return matcher indices */ &kMatcherIndices[114],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
-  },
-  {
-    /* [33] */
-    /* num parameters */ 4,
-    /* num template types */ 0,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[38],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[339],
-    /* return matcher indices */ &kMatcherIndices[114],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
-  },
-  {
-    /* [34] */
-    /* num parameters */ 3,
-    /* num template types */ 0,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[38],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[510],
-    /* return matcher indices */ &kMatcherIndices[114],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
-  },
-  {
-    /* [35] */
-    /* num parameters */ 4,
-    /* num template types */ 1,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[2],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[343],
-    /* return matcher indices */ &kMatcherIndices[114],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
-  },
-  {
-    /* [36] */
-    /* num parameters */ 3,
-    /* num template types */ 0,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[38],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[513],
-    /* return matcher indices */ &kMatcherIndices[42],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
-  },
-  {
-    /* [37] */
-    /* num parameters */ 4,
-    /* num template types */ 0,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[38],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[347],
-    /* return matcher indices */ &kMatcherIndices[42],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
-  },
-  {
-    /* [38] */
-    /* num parameters */ 4,
-    /* num template types */ 1,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[2],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[351],
-    /* return matcher indices */ &kMatcherIndices[42],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
-  },
-  {
-    /* [39] */
-    /* num parameters */ 5,
-    /* num template types */ 1,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[2],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[190],
-    /* return matcher indices */ &kMatcherIndices[42],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
-  },
-  {
-    /* [40] */
-    /* num parameters */ 3,
-    /* num template types */ 0,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[38],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[516],
-    /* return matcher indices */ &kMatcherIndices[42],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
-  },
-  {
-    /* [41] */
-    /* num parameters */ 4,
-    /* num template types */ 1,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[2],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[355],
-    /* return matcher indices */ &kMatcherIndices[42],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
-  },
-  {
-    /* [42] */
     /* num parameters */ 0,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -8926,7 +8764,7 @@
     /* const eval */ &ConstEval::Zero,
   },
   {
-    /* [43] */
+    /* [29] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -8938,7 +8776,7 @@
     /* const eval */ &ConstEval::Identity,
   },
   {
-    /* [44] */
+    /* [30] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -8950,7 +8788,7 @@
     /* const eval */ &ConstEval::VecSplat,
   },
   {
-    /* [45] */
+    /* [31] */
     /* num parameters */ 4,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -8962,7 +8800,7 @@
     /* const eval */ &ConstEval::VecInitS,
   },
   {
-    /* [46] */
+    /* [32] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -8974,7 +8812,7 @@
     /* const eval */ &ConstEval::VecInitM,
   },
   {
-    /* [47] */
+    /* [33] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -8986,7 +8824,7 @@
     /* const eval */ &ConstEval::VecInitM,
   },
   {
-    /* [48] */
+    /* [34] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -8998,7 +8836,7 @@
     /* const eval */ &ConstEval::VecInitM,
   },
   {
-    /* [49] */
+    /* [35] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9010,7 +8848,7 @@
     /* const eval */ &ConstEval::VecInitM,
   },
   {
-    /* [50] */
+    /* [36] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9022,7 +8860,7 @@
     /* const eval */ &ConstEval::VecInitM,
   },
   {
-    /* [51] */
+    /* [37] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9034,7 +8872,7 @@
     /* const eval */ &ConstEval::VecInitM,
   },
   {
-    /* [52] */
+    /* [38] */
     /* num parameters */ 1,
     /* num template types */ 2,
     /* num template numbers */ 0,
@@ -9046,19 +8884,19 @@
     /* const eval */ &ConstEval::Conv,
   },
   {
-    /* [53] */
+    /* [39] */
     /* num parameters */ 1,
     /* num template types */ 2,
     /* num template numbers */ 0,
     /* template types */ &kTemplateTypes[16],
     /* template numbers */ &kTemplateNumbers[10],
     /* parameters */ &kParameters[982],
-    /* return matcher indices */ &kMatcherIndices[174],
+    /* return matcher indices */ &kMatcherIndices[180],
     /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* const eval */ &ConstEval::Conv,
   },
   {
-    /* [54] */
+    /* [40] */
     /* num parameters */ 1,
     /* num template types */ 2,
     /* num template numbers */ 0,
@@ -9070,7 +8908,7 @@
     /* const eval */ &ConstEval::Conv,
   },
   {
-    /* [55] */
+    /* [41] */
     /* num parameters */ 1,
     /* num template types */ 2,
     /* num template numbers */ 0,
@@ -9082,20 +8920,200 @@
     /* const eval */ &ConstEval::Conv,
   },
   {
-    /* [56] */
+    /* [42] */
     /* num parameters */ 1,
     /* num template types */ 2,
     /* num template numbers */ 0,
     /* template types */ &kTemplateTypes[22],
     /* template numbers */ &kTemplateNumbers[10],
     /* parameters */ &kParameters[985],
-    /* return matcher indices */ &kMatcherIndices[176],
+    /* return matcher indices */ &kMatcherIndices[182],
     /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* const eval */ &ConstEval::Conv,
   },
   {
+    /* [43] */
+    /* num parameters */ 3,
+    /* num template types */ 0,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[38],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[501],
+    /* return matcher indices */ &kMatcherIndices[114],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
+    /* [44] */
+    /* num parameters */ 3,
+    /* num template types */ 0,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[38],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[504],
+    /* return matcher indices */ &kMatcherIndices[114],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
+    /* [45] */
+    /* num parameters */ 4,
+    /* num template types */ 0,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[38],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[331],
+    /* return matcher indices */ &kMatcherIndices[114],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
+    /* [46] */
+    /* num parameters */ 4,
+    /* num template types */ 1,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[2],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[335],
+    /* return matcher indices */ &kMatcherIndices[114],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
+    /* [47] */
+    /* num parameters */ 5,
+    /* num template types */ 1,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[2],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[185],
+    /* return matcher indices */ &kMatcherIndices[114],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
+    /* [48] */
+    /* num parameters */ 3,
+    /* num template types */ 0,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[38],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[507],
+    /* return matcher indices */ &kMatcherIndices[114],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
+    /* [49] */
+    /* num parameters */ 4,
+    /* num template types */ 0,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[38],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[339],
+    /* return matcher indices */ &kMatcherIndices[114],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
+    /* [50] */
+    /* num parameters */ 3,
+    /* num template types */ 0,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[38],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[510],
+    /* return matcher indices */ &kMatcherIndices[114],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
+    /* [51] */
+    /* num parameters */ 4,
+    /* num template types */ 1,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[2],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[343],
+    /* return matcher indices */ &kMatcherIndices[114],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
+    /* [52] */
+    /* num parameters */ 3,
+    /* num template types */ 0,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[38],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[513],
+    /* return matcher indices */ &kMatcherIndices[42],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
+    /* [53] */
+    /* num parameters */ 4,
+    /* num template types */ 0,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[38],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[347],
+    /* return matcher indices */ &kMatcherIndices[42],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
+    /* [54] */
+    /* num parameters */ 4,
+    /* num template types */ 1,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[2],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[351],
+    /* return matcher indices */ &kMatcherIndices[42],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
+    /* [55] */
+    /* num parameters */ 5,
+    /* num template types */ 1,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[2],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[190],
+    /* return matcher indices */ &kMatcherIndices[42],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
+    /* [56] */
+    /* num parameters */ 3,
+    /* num template types */ 0,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[38],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[516],
+    /* return matcher indices */ &kMatcherIndices[42],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
     /* [57] */
     /* num parameters */ 4,
+    /* num template types */ 1,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[2],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[355],
+    /* return matcher indices */ &kMatcherIndices[42],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
+    /* [58] */
+    /* num parameters */ 4,
     /* num template types */ 0,
     /* num template numbers */ 0,
     /* template types */ &kTemplateTypes[38],
@@ -9106,7 +9124,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [58] */
+    /* [59] */
     /* num parameters */ 5,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -9118,7 +9136,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [59] */
+    /* [60] */
     /* num parameters */ 5,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9130,7 +9148,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [60] */
+    /* [61] */
     /* num parameters */ 6,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9142,7 +9160,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [61] */
+    /* [62] */
     /* num parameters */ 4,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -9154,7 +9172,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [62] */
+    /* [63] */
     /* num parameters */ 5,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -9166,7 +9184,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [63] */
+    /* [64] */
     /* num parameters */ 4,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -9178,7 +9196,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [64] */
+    /* [65] */
     /* num parameters */ 5,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9190,7 +9208,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [65] */
+    /* [66] */
     /* num parameters */ 4,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9202,7 +9220,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [66] */
+    /* [67] */
     /* num parameters */ 5,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9214,7 +9232,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [67] */
+    /* [68] */
     /* num parameters */ 5,
     /* num template types */ 2,
     /* num template numbers */ 0,
@@ -9226,7 +9244,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [68] */
+    /* [69] */
     /* num parameters */ 6,
     /* num template types */ 2,
     /* num template numbers */ 0,
@@ -9238,7 +9256,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [69] */
+    /* [70] */
     /* num parameters */ 4,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9250,7 +9268,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [70] */
+    /* [71] */
     /* num parameters */ 5,
     /* num template types */ 2,
     /* num template numbers */ 0,
@@ -9262,7 +9280,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [71] */
+    /* [72] */
     /* num parameters */ 4,
     /* num template types */ 2,
     /* num template numbers */ 0,
@@ -9274,7 +9292,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [72] */
+    /* [73] */
     /* num parameters */ 5,
     /* num template types */ 2,
     /* num template numbers */ 0,
@@ -9286,7 +9304,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [73] */
+    /* [74] */
     /* num parameters */ 5,
     /* num template types */ 3,
     /* num template numbers */ 0,
@@ -9298,7 +9316,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [74] */
+    /* [75] */
     /* num parameters */ 6,
     /* num template types */ 3,
     /* num template numbers */ 0,
@@ -9310,7 +9328,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [75] */
+    /* [76] */
     /* num parameters */ 4,
     /* num template types */ 2,
     /* num template numbers */ 0,
@@ -9322,7 +9340,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [76] */
+    /* [77] */
     /* num parameters */ 5,
     /* num template types */ 3,
     /* num template numbers */ 0,
@@ -9334,7 +9352,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [77] */
+    /* [78] */
     /* num parameters */ 3,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -9346,7 +9364,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [78] */
+    /* [79] */
     /* num parameters */ 4,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -9358,7 +9376,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [79] */
+    /* [80] */
     /* num parameters */ 4,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9370,7 +9388,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [80] */
+    /* [81] */
     /* num parameters */ 5,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9382,7 +9400,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [81] */
+    /* [82] */
     /* num parameters */ 3,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -9394,7 +9412,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [82] */
+    /* [83] */
     /* num parameters */ 4,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9406,7 +9424,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [83] */
+    /* [84] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9418,7 +9436,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [84] */
+    /* [85] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9430,7 +9448,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [85] */
+    /* [86] */
     /* num parameters */ 4,
     /* num template types */ 2,
     /* num template numbers */ 0,
@@ -9442,7 +9460,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [86] */
+    /* [87] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9454,7 +9472,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [87] */
+    /* [88] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9466,7 +9484,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [88] */
+    /* [89] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9478,7 +9496,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [89] */
+    /* [90] */
     /* num parameters */ 4,
     /* num template types */ 2,
     /* num template numbers */ 0,
@@ -9490,7 +9508,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [90] */
+    /* [91] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9502,7 +9520,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [91] */
+    /* [92] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9514,7 +9532,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [92] */
+    /* [93] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9526,7 +9544,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [93] */
+    /* [94] */
     /* num parameters */ 4,
     /* num template types */ 2,
     /* num template numbers */ 0,
@@ -9538,7 +9556,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [94] */
+    /* [95] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9550,7 +9568,19 @@
     /* const eval */ nullptr,
   },
   {
-    /* [95] */
+    /* [96] */
+    /* num parameters */ 0,
+    /* num template types */ 0,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[38],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[1014],
+    /* return matcher indices */ &kMatcherIndices[170],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Zero,
+  },
+  {
+    /* [97] */
     /* num parameters */ 0,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9562,7 +9592,7 @@
     /* const eval */ &ConstEval::Zero,
   },
   {
-    /* [96] */
+    /* [98] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9574,7 +9604,7 @@
     /* const eval */ &ConstEval::Identity,
   },
   {
-    /* [97] */
+    /* [99] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9586,7 +9616,7 @@
     /* const eval */ &ConstEval::VecSplat,
   },
   {
-    /* [98] */
+    /* [100] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9598,7 +9628,7 @@
     /* const eval */ &ConstEval::VecInitS,
   },
   {
-    /* [99] */
+    /* [101] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9610,7 +9640,7 @@
     /* const eval */ &ConstEval::VecInitM,
   },
   {
-    /* [100] */
+    /* [102] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9622,7 +9652,7 @@
     /* const eval */ &ConstEval::VecInitM,
   },
   {
-    /* [101] */
+    /* [103] */
     /* num parameters */ 1,
     /* num template types */ 2,
     /* num template numbers */ 0,
@@ -9634,19 +9664,19 @@
     /* const eval */ &ConstEval::Conv,
   },
   {
-    /* [102] */
+    /* [104] */
     /* num parameters */ 1,
     /* num template types */ 2,
     /* num template numbers */ 0,
     /* template types */ &kTemplateTypes[16],
     /* template numbers */ &kTemplateNumbers[10],
     /* parameters */ &kParameters[975],
-    /* return matcher indices */ &kMatcherIndices[168],
+    /* return matcher indices */ &kMatcherIndices[172],
     /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* const eval */ &ConstEval::Conv,
   },
   {
-    /* [103] */
+    /* [105] */
     /* num parameters */ 1,
     /* num template types */ 2,
     /* num template numbers */ 0,
@@ -9658,7 +9688,7 @@
     /* const eval */ &ConstEval::Conv,
   },
   {
-    /* [104] */
+    /* [106] */
     /* num parameters */ 1,
     /* num template types */ 2,
     /* num template numbers */ 0,
@@ -9670,19 +9700,19 @@
     /* const eval */ &ConstEval::Conv,
   },
   {
-    /* [105] */
+    /* [107] */
     /* num parameters */ 1,
     /* num template types */ 2,
     /* num template numbers */ 0,
     /* template types */ &kTemplateTypes[22],
     /* template numbers */ &kTemplateNumbers[10],
     /* parameters */ &kParameters[978],
-    /* return matcher indices */ &kMatcherIndices[170],
+    /* return matcher indices */ &kMatcherIndices[174],
     /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* const eval */ &ConstEval::Conv,
   },
   {
-    /* [106] */
+    /* [108] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9694,7 +9724,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [107] */
+    /* [109] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9706,7 +9736,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [108] */
+    /* [110] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9718,7 +9748,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [109] */
+    /* [111] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9730,7 +9760,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [110] */
+    /* [112] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9742,7 +9772,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [111] */
+    /* [113] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -9754,7 +9784,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [112] */
+    /* [114] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -9766,7 +9796,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [113] */
+    /* [115] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -9778,7 +9808,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [114] */
+    /* [116] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -9790,7 +9820,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [115] */
+    /* [117] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -9802,223 +9832,19 @@
     /* const eval */ nullptr,
   },
   {
-    /* [116] */
-    /* num parameters */ 3,
-    /* num template types */ 3,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[4],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[552],
-    /* return matcher indices */ &kMatcherIndices[134],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
-  },
-  {
-    /* [117] */
-    /* num parameters */ 3,
-    /* num template types */ 3,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[4],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[555],
-    /* return matcher indices */ &kMatcherIndices[134],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
-  },
-  {
     /* [118] */
-    /* num parameters */ 4,
-    /* num template types */ 4,
+    /* num parameters */ 0,
+    /* num template types */ 0,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[0],
+    /* template types */ &kTemplateTypes[38],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[419],
-    /* return matcher indices */ &kMatcherIndices[134],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
+    /* parameters */ &kParameters[1014],
+    /* return matcher indices */ &kMatcherIndices[164],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Zero,
   },
   {
     /* [119] */
-    /* num parameters */ 3,
-    /* num template types */ 3,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[4],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[558],
-    /* return matcher indices */ &kMatcherIndices[134],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
-  },
-  {
-    /* [120] */
-    /* num parameters */ 3,
-    /* num template types */ 3,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[7],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[561],
-    /* return matcher indices */ &kMatcherIndices[134],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
-  },
-  {
-    /* [121] */
-    /* num parameters */ 3,
-    /* num template types */ 2,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[5],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[564],
-    /* return matcher indices */ &kMatcherIndices[42],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
-  },
-  {
-    /* [122] */
-    /* num parameters */ 4,
-    /* num template types */ 3,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[1],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[423],
-    /* return matcher indices */ &kMatcherIndices[42],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
-  },
-  {
-    /* [123] */
-    /* num parameters */ 3,
-    /* num template types */ 2,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[8],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[567],
-    /* return matcher indices */ &kMatcherIndices[42],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
-  },
-  {
-    /* [124] */
-    /* num parameters */ 2,
-    /* num template types */ 1,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[1],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[652],
-    /* return matcher indices */ &kMatcherIndices[114],
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ nullptr,
-  },
-  {
-    /* [125] */
-    /* num parameters */ 2,
-    /* num template types */ 1,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[24],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[692],
-    /* return matcher indices */ &kMatcherIndices[3],
-    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::OpMultiply,
-  },
-  {
-    /* [126] */
-    /* num parameters */ 2,
-    /* num template types */ 1,
-    /* num template numbers */ 1,
-    /* template types */ &kTemplateTypes[24],
-    /* template numbers */ &kTemplateNumbers[4],
-    /* parameters */ &kParameters[694],
-    /* return matcher indices */ &kMatcherIndices[34],
-    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::OpMultiply,
-  },
-  {
-    /* [127] */
-    /* num parameters */ 2,
-    /* num template types */ 1,
-    /* num template numbers */ 1,
-    /* template types */ &kTemplateTypes[24],
-    /* template numbers */ &kTemplateNumbers[4],
-    /* parameters */ &kParameters[696],
-    /* return matcher indices */ &kMatcherIndices[34],
-    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::OpMultiply,
-  },
-  {
-    /* [128] */
-    /* num parameters */ 2,
-    /* num template types */ 1,
-    /* num template numbers */ 1,
-    /* template types */ &kTemplateTypes[24],
-    /* template numbers */ &kTemplateNumbers[4],
-    /* parameters */ &kParameters[698],
-    /* return matcher indices */ &kMatcherIndices[34],
-    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::OpMultiply,
-  },
-  {
-    /* [129] */
-    /* num parameters */ 2,
-    /* num template types */ 1,
-    /* num template numbers */ 2,
-    /* template types */ &kTemplateTypes[10],
-    /* template numbers */ &kTemplateNumbers[4],
-    /* parameters */ &kParameters[700],
-    /* return matcher indices */ &kMatcherIndices[14],
-    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::OpMultiply,
-  },
-  {
-    /* [130] */
-    /* num parameters */ 2,
-    /* num template types */ 1,
-    /* num template numbers */ 2,
-    /* template types */ &kTemplateTypes[10],
-    /* template numbers */ &kTemplateNumbers[4],
-    /* parameters */ &kParameters[702],
-    /* return matcher indices */ &kMatcherIndices[14],
-    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::OpMultiply,
-  },
-  {
-    /* [131] */
-    /* num parameters */ 2,
-    /* num template types */ 1,
-    /* num template numbers */ 2,
-    /* template types */ &kTemplateTypes[10],
-    /* template numbers */ &kTemplateNumbers[1],
-    /* parameters */ &kParameters[704],
-    /* return matcher indices */ &kMatcherIndices[100],
-    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::OpMultiplyMatVec,
-  },
-  {
-    /* [132] */
-    /* num parameters */ 2,
-    /* num template types */ 1,
-    /* num template numbers */ 2,
-    /* template types */ &kTemplateTypes[10],
-    /* template numbers */ &kTemplateNumbers[1],
-    /* parameters */ &kParameters[706],
-    /* return matcher indices */ &kMatcherIndices[34],
-    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::OpMultiplyVecMat,
-  },
-  {
-    /* [133] */
-    /* num parameters */ 2,
-    /* num template types */ 1,
-    /* num template numbers */ 3,
-    /* template types */ &kTemplateTypes[10],
-    /* template numbers */ &kTemplateNumbers[0],
-    /* parameters */ &kParameters[708],
-    /* return matcher indices */ &kMatcherIndices[30],
-    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::OpMultiplyMatMat,
-  },
-  {
-    /* [134] */
     /* num parameters */ 0,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -10030,7 +9856,7 @@
     /* const eval */ &ConstEval::Zero,
   },
   {
-    /* [135] */
+    /* [120] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -10042,7 +9868,7 @@
     /* const eval */ &ConstEval::Identity,
   },
   {
-    /* [136] */
+    /* [121] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -10054,7 +9880,7 @@
     /* const eval */ &ConstEval::VecSplat,
   },
   {
-    /* [137] */
+    /* [122] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -10066,7 +9892,7 @@
     /* const eval */ &ConstEval::VecInitS,
   },
   {
-    /* [138] */
+    /* [123] */
     /* num parameters */ 1,
     /* num template types */ 2,
     /* num template numbers */ 0,
@@ -10078,19 +9904,19 @@
     /* const eval */ &ConstEval::Conv,
   },
   {
-    /* [139] */
+    /* [124] */
     /* num parameters */ 1,
     /* num template types */ 2,
     /* num template numbers */ 0,
     /* template types */ &kTemplateTypes[16],
     /* template numbers */ &kTemplateNumbers[10],
     /* parameters */ &kParameters[968],
-    /* return matcher indices */ &kMatcherIndices[164],
+    /* return matcher indices */ &kMatcherIndices[166],
     /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* const eval */ &ConstEval::Conv,
   },
   {
-    /* [140] */
+    /* [125] */
     /* num parameters */ 1,
     /* num template types */ 2,
     /* num template numbers */ 0,
@@ -10102,7 +9928,7 @@
     /* const eval */ &ConstEval::Conv,
   },
   {
-    /* [141] */
+    /* [126] */
     /* num parameters */ 1,
     /* num template types */ 2,
     /* num template numbers */ 0,
@@ -10114,19 +9940,235 @@
     /* const eval */ &ConstEval::Conv,
   },
   {
-    /* [142] */
+    /* [127] */
     /* num parameters */ 1,
     /* num template types */ 2,
     /* num template numbers */ 0,
     /* template types */ &kTemplateTypes[22],
     /* template numbers */ &kTemplateNumbers[10],
     /* parameters */ &kParameters[971],
-    /* return matcher indices */ &kMatcherIndices[166],
+    /* return matcher indices */ &kMatcherIndices[168],
     /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* const eval */ &ConstEval::Conv,
   },
   {
+    /* [128] */
+    /* num parameters */ 3,
+    /* num template types */ 3,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[4],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[552],
+    /* return matcher indices */ &kMatcherIndices[134],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
+    /* [129] */
+    /* num parameters */ 3,
+    /* num template types */ 3,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[4],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[555],
+    /* return matcher indices */ &kMatcherIndices[134],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
+    /* [130] */
+    /* num parameters */ 4,
+    /* num template types */ 4,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[0],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[419],
+    /* return matcher indices */ &kMatcherIndices[134],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
+    /* [131] */
+    /* num parameters */ 3,
+    /* num template types */ 3,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[4],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[558],
+    /* return matcher indices */ &kMatcherIndices[134],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
+    /* [132] */
+    /* num parameters */ 3,
+    /* num template types */ 3,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[7],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[561],
+    /* return matcher indices */ &kMatcherIndices[134],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
+    /* [133] */
+    /* num parameters */ 3,
+    /* num template types */ 2,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[5],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[564],
+    /* return matcher indices */ &kMatcherIndices[42],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
+    /* [134] */
+    /* num parameters */ 4,
+    /* num template types */ 3,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[1],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[423],
+    /* return matcher indices */ &kMatcherIndices[42],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
+    /* [135] */
+    /* num parameters */ 3,
+    /* num template types */ 2,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[8],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[567],
+    /* return matcher indices */ &kMatcherIndices[42],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
+    /* [136] */
+    /* num parameters */ 2,
+    /* num template types */ 1,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[1],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[652],
+    /* return matcher indices */ &kMatcherIndices[114],
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ nullptr,
+  },
+  {
+    /* [137] */
+    /* num parameters */ 2,
+    /* num template types */ 1,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[24],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[692],
+    /* return matcher indices */ &kMatcherIndices[3],
+    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::OpMultiply,
+  },
+  {
+    /* [138] */
+    /* num parameters */ 2,
+    /* num template types */ 1,
+    /* num template numbers */ 1,
+    /* template types */ &kTemplateTypes[24],
+    /* template numbers */ &kTemplateNumbers[4],
+    /* parameters */ &kParameters[694],
+    /* return matcher indices */ &kMatcherIndices[34],
+    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::OpMultiply,
+  },
+  {
+    /* [139] */
+    /* num parameters */ 2,
+    /* num template types */ 1,
+    /* num template numbers */ 1,
+    /* template types */ &kTemplateTypes[24],
+    /* template numbers */ &kTemplateNumbers[4],
+    /* parameters */ &kParameters[696],
+    /* return matcher indices */ &kMatcherIndices[34],
+    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::OpMultiply,
+  },
+  {
+    /* [140] */
+    /* num parameters */ 2,
+    /* num template types */ 1,
+    /* num template numbers */ 1,
+    /* template types */ &kTemplateTypes[24],
+    /* template numbers */ &kTemplateNumbers[4],
+    /* parameters */ &kParameters[698],
+    /* return matcher indices */ &kMatcherIndices[34],
+    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::OpMultiply,
+  },
+  {
+    /* [141] */
+    /* num parameters */ 2,
+    /* num template types */ 1,
+    /* num template numbers */ 2,
+    /* template types */ &kTemplateTypes[10],
+    /* template numbers */ &kTemplateNumbers[4],
+    /* parameters */ &kParameters[700],
+    /* return matcher indices */ &kMatcherIndices[14],
+    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::OpMultiply,
+  },
+  {
+    /* [142] */
+    /* num parameters */ 2,
+    /* num template types */ 1,
+    /* num template numbers */ 2,
+    /* template types */ &kTemplateTypes[10],
+    /* template numbers */ &kTemplateNumbers[4],
+    /* parameters */ &kParameters[702],
+    /* return matcher indices */ &kMatcherIndices[14],
+    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::OpMultiply,
+  },
+  {
     /* [143] */
+    /* num parameters */ 2,
+    /* num template types */ 1,
+    /* num template numbers */ 2,
+    /* template types */ &kTemplateTypes[10],
+    /* template numbers */ &kTemplateNumbers[1],
+    /* parameters */ &kParameters[704],
+    /* return matcher indices */ &kMatcherIndices[100],
+    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::OpMultiplyMatVec,
+  },
+  {
+    /* [144] */
+    /* num parameters */ 2,
+    /* num template types */ 1,
+    /* num template numbers */ 2,
+    /* template types */ &kTemplateTypes[10],
+    /* template numbers */ &kTemplateNumbers[1],
+    /* parameters */ &kParameters[706],
+    /* return matcher indices */ &kMatcherIndices[34],
+    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::OpMultiplyVecMat,
+  },
+  {
+    /* [145] */
+    /* num parameters */ 2,
+    /* num template types */ 1,
+    /* num template numbers */ 3,
+    /* template types */ &kTemplateTypes[10],
+    /* template numbers */ &kTemplateNumbers[0],
+    /* parameters */ &kParameters[708],
+    /* return matcher indices */ &kMatcherIndices[30],
+    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::OpMultiplyMatMat,
+  },
+  {
+    /* [146] */
     /* num parameters */ 4,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -10138,7 +10180,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [144] */
+    /* [147] */
     /* num parameters */ 5,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -10150,7 +10192,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [145] */
+    /* [148] */
     /* num parameters */ 5,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -10162,7 +10204,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [146] */
+    /* [149] */
     /* num parameters */ 6,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -10174,7 +10216,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [147] */
+    /* [150] */
     /* num parameters */ 4,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -10186,7 +10228,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [148] */
+    /* [151] */
     /* num parameters */ 5,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -10198,7 +10240,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [149] */
+    /* [152] */
     /* num parameters */ 4,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -10210,7 +10252,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [150] */
+    /* [153] */
     /* num parameters */ 5,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -10222,7 +10264,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [151] */
+    /* [154] */
     /* num parameters */ 5,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -10234,7 +10276,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [152] */
+    /* [155] */
     /* num parameters */ 6,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -10246,7 +10288,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [153] */
+    /* [156] */
     /* num parameters */ 6,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -10258,7 +10300,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [154] */
+    /* [157] */
     /* num parameters */ 7,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -10270,7 +10312,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [155] */
+    /* [158] */
     /* num parameters */ 5,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -10282,7 +10324,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [156] */
+    /* [159] */
     /* num parameters */ 6,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -10294,7 +10336,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [157] */
+    /* [160] */
     /* num parameters */ 5,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -10306,7 +10348,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [158] */
+    /* [161] */
     /* num parameters */ 6,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -10318,7 +10360,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [159] */
+    /* [162] */
     /* num parameters */ 4,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -10330,7 +10372,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [160] */
+    /* [163] */
     /* num parameters */ 5,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -10342,7 +10384,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [161] */
+    /* [164] */
     /* num parameters */ 5,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -10354,7 +10396,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [162] */
+    /* [165] */
     /* num parameters */ 6,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -10366,7 +10408,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [163] */
+    /* [166] */
     /* num parameters */ 4,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -10378,7 +10420,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [164] */
+    /* [167] */
     /* num parameters */ 5,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -10390,7 +10432,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [165] */
+    /* [168] */
     /* num parameters */ 4,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -10402,7 +10444,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [166] */
+    /* [169] */
     /* num parameters */ 5,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -10414,7 +10456,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [167] */
+    /* [170] */
     /* num parameters */ 5,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -10426,7 +10468,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [168] */
+    /* [171] */
     /* num parameters */ 6,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -10438,7 +10480,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [169] */
+    /* [172] */
     /* num parameters */ 4,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -10450,7 +10492,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [170] */
+    /* [173] */
     /* num parameters */ 5,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -10462,7 +10504,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [171] */
+    /* [174] */
     /* num parameters */ 4,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -10474,7 +10516,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [172] */
+    /* [175] */
     /* num parameters */ 5,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -10486,7 +10528,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [173] */
+    /* [176] */
     /* num parameters */ 5,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -10498,7 +10540,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [174] */
+    /* [177] */
     /* num parameters */ 6,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -10510,7 +10552,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [175] */
+    /* [178] */
     /* num parameters */ 4,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -10522,7 +10564,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [176] */
+    /* [179] */
     /* num parameters */ 5,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -10534,583 +10576,511 @@
     /* const eval */ nullptr,
   },
   {
-    /* [177] */
+    /* [180] */
     /* num parameters */ 0,
     /* num template types */ 1,
     /* num template numbers */ 0,
     /* template types */ &kTemplateTypes[37],
     /* template numbers */ &kTemplateNumbers[10],
     /* parameters */ &kParameters[1014],
-    /* return matcher indices */ &kMatcherIndices[178],
+    /* return matcher indices */ &kMatcherIndices[184],
     /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* const eval */ &ConstEval::Zero,
   },
   {
-    /* [178] */
-    /* num parameters */ 1,
-    /* num template types */ 1,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[37],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[986],
-    /* return matcher indices */ &kMatcherIndices[178],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Identity,
-  },
-  {
-    /* [179] */
-    /* num parameters */ 4,
-    /* num template types */ 1,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[10],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[431],
-    /* return matcher indices */ &kMatcherIndices[178],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::MatInitS,
-  },
-  {
-    /* [180] */
-    /* num parameters */ 2,
-    /* num template types */ 1,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[10],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[794],
-    /* return matcher indices */ &kMatcherIndices[178],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::MatInitV,
-  },
-  {
     /* [181] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[16],
+    /* template types */ &kTemplateTypes[37],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[987],
-    /* return matcher indices */ &kMatcherIndices[182],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Conv,
+    /* parameters */ &kParameters[986],
+    /* return matcher indices */ &kMatcherIndices[184],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Identity,
   },
   {
     /* [182] */
-    /* num parameters */ 1,
+    /* num parameters */ 4,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[14],
+    /* template types */ &kTemplateTypes[10],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[988],
-    /* return matcher indices */ &kMatcherIndices[180],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Conv,
+    /* parameters */ &kParameters[431],
+    /* return matcher indices */ &kMatcherIndices[184],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::MatInitS,
   },
   {
     /* [183] */
-    /* num parameters */ 0,
+    /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[37],
+    /* template types */ &kTemplateTypes[10],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[1014],
+    /* parameters */ &kParameters[794],
     /* return matcher indices */ &kMatcherIndices[184],
     /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Zero,
+    /* const eval */ &ConstEval::MatInitV,
   },
   {
     /* [184] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[37],
+    /* template types */ &kTemplateTypes[16],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[989],
-    /* return matcher indices */ &kMatcherIndices[184],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Identity,
+    /* parameters */ &kParameters[987],
+    /* return matcher indices */ &kMatcherIndices[188],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Conv,
   },
   {
     /* [185] */
-    /* num parameters */ 6,
+    /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[10],
+    /* template types */ &kTemplateTypes[14],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[138],
-    /* return matcher indices */ &kMatcherIndices[184],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::MatInitS,
+    /* parameters */ &kParameters[988],
+    /* return matcher indices */ &kMatcherIndices[186],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Conv,
   },
   {
     /* [186] */
-    /* num parameters */ 2,
+    /* num parameters */ 0,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[10],
+    /* template types */ &kTemplateTypes[37],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[796],
-    /* return matcher indices */ &kMatcherIndices[184],
+    /* parameters */ &kParameters[1014],
+    /* return matcher indices */ &kMatcherIndices[190],
     /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::MatInitV,
+    /* const eval */ &ConstEval::Zero,
   },
   {
     /* [187] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[16],
+    /* template types */ &kTemplateTypes[37],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[990],
-    /* return matcher indices */ &kMatcherIndices[188],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Conv,
+    /* parameters */ &kParameters[989],
+    /* return matcher indices */ &kMatcherIndices[190],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Identity,
   },
   {
     /* [188] */
-    /* num parameters */ 1,
+    /* num parameters */ 6,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[14],
+    /* template types */ &kTemplateTypes[10],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[991],
-    /* return matcher indices */ &kMatcherIndices[186],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Conv,
+    /* parameters */ &kParameters[138],
+    /* return matcher indices */ &kMatcherIndices[190],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::MatInitS,
   },
   {
     /* [189] */
-    /* num parameters */ 0,
+    /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[37],
+    /* template types */ &kTemplateTypes[10],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[1014],
+    /* parameters */ &kParameters[796],
     /* return matcher indices */ &kMatcherIndices[190],
     /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Zero,
+    /* const eval */ &ConstEval::MatInitV,
   },
   {
     /* [190] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[37],
+    /* template types */ &kTemplateTypes[16],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[992],
-    /* return matcher indices */ &kMatcherIndices[190],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Identity,
+    /* parameters */ &kParameters[990],
+    /* return matcher indices */ &kMatcherIndices[194],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Conv,
   },
   {
     /* [191] */
-    /* num parameters */ 8,
+    /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[10],
+    /* template types */ &kTemplateTypes[14],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[49],
-    /* return matcher indices */ &kMatcherIndices[190],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::MatInitS,
+    /* parameters */ &kParameters[991],
+    /* return matcher indices */ &kMatcherIndices[192],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Conv,
   },
   {
     /* [192] */
-    /* num parameters */ 2,
+    /* num parameters */ 0,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[10],
+    /* template types */ &kTemplateTypes[37],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[798],
-    /* return matcher indices */ &kMatcherIndices[190],
+    /* parameters */ &kParameters[1014],
+    /* return matcher indices */ &kMatcherIndices[196],
     /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::MatInitV,
+    /* const eval */ &ConstEval::Zero,
   },
   {
     /* [193] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[16],
+    /* template types */ &kTemplateTypes[37],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[993],
-    /* return matcher indices */ &kMatcherIndices[194],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Conv,
+    /* parameters */ &kParameters[992],
+    /* return matcher indices */ &kMatcherIndices[196],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Identity,
   },
   {
     /* [194] */
-    /* num parameters */ 1,
+    /* num parameters */ 8,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[14],
+    /* template types */ &kTemplateTypes[10],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[994],
-    /* return matcher indices */ &kMatcherIndices[192],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Conv,
+    /* parameters */ &kParameters[49],
+    /* return matcher indices */ &kMatcherIndices[196],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::MatInitS,
   },
   {
     /* [195] */
-    /* num parameters */ 0,
+    /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[37],
+    /* template types */ &kTemplateTypes[10],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[1014],
+    /* parameters */ &kParameters[798],
     /* return matcher indices */ &kMatcherIndices[196],
     /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Zero,
+    /* const eval */ &ConstEval::MatInitV,
   },
   {
     /* [196] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[37],
+    /* template types */ &kTemplateTypes[16],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[995],
-    /* return matcher indices */ &kMatcherIndices[196],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Identity,
+    /* parameters */ &kParameters[993],
+    /* return matcher indices */ &kMatcherIndices[200],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Conv,
   },
   {
     /* [197] */
-    /* num parameters */ 6,
+    /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[10],
+    /* template types */ &kTemplateTypes[14],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[144],
-    /* return matcher indices */ &kMatcherIndices[196],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::MatInitS,
+    /* parameters */ &kParameters[994],
+    /* return matcher indices */ &kMatcherIndices[198],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Conv,
   },
   {
     /* [198] */
-    /* num parameters */ 3,
+    /* num parameters */ 0,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[10],
+    /* template types */ &kTemplateTypes[37],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[585],
-    /* return matcher indices */ &kMatcherIndices[196],
+    /* parameters */ &kParameters[1014],
+    /* return matcher indices */ &kMatcherIndices[202],
     /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::MatInitV,
+    /* const eval */ &ConstEval::Zero,
   },
   {
     /* [199] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[16],
+    /* template types */ &kTemplateTypes[37],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[996],
-    /* return matcher indices */ &kMatcherIndices[200],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Conv,
+    /* parameters */ &kParameters[995],
+    /* return matcher indices */ &kMatcherIndices[202],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Identity,
   },
   {
     /* [200] */
-    /* num parameters */ 1,
+    /* num parameters */ 6,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[14],
+    /* template types */ &kTemplateTypes[10],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[997],
-    /* return matcher indices */ &kMatcherIndices[198],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Conv,
+    /* parameters */ &kParameters[144],
+    /* return matcher indices */ &kMatcherIndices[202],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::MatInitS,
   },
   {
     /* [201] */
-    /* num parameters */ 0,
+    /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[37],
+    /* template types */ &kTemplateTypes[10],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[1014],
+    /* parameters */ &kParameters[585],
     /* return matcher indices */ &kMatcherIndices[202],
     /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Zero,
+    /* const eval */ &ConstEval::MatInitV,
   },
   {
     /* [202] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[37],
+    /* template types */ &kTemplateTypes[16],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[998],
-    /* return matcher indices */ &kMatcherIndices[202],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Identity,
+    /* parameters */ &kParameters[996],
+    /* return matcher indices */ &kMatcherIndices[206],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Conv,
   },
   {
     /* [203] */
-    /* num parameters */ 9,
+    /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[10],
+    /* template types */ &kTemplateTypes[14],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[40],
-    /* return matcher indices */ &kMatcherIndices[202],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::MatInitS,
+    /* parameters */ &kParameters[997],
+    /* return matcher indices */ &kMatcherIndices[204],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Conv,
   },
   {
     /* [204] */
-    /* num parameters */ 3,
+    /* num parameters */ 0,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[10],
+    /* template types */ &kTemplateTypes[37],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[588],
-    /* return matcher indices */ &kMatcherIndices[202],
+    /* parameters */ &kParameters[1014],
+    /* return matcher indices */ &kMatcherIndices[208],
     /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::MatInitV,
+    /* const eval */ &ConstEval::Zero,
   },
   {
     /* [205] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[16],
+    /* template types */ &kTemplateTypes[37],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[999],
-    /* return matcher indices */ &kMatcherIndices[206],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Conv,
+    /* parameters */ &kParameters[998],
+    /* return matcher indices */ &kMatcherIndices[208],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Identity,
   },
   {
     /* [206] */
-    /* num parameters */ 1,
+    /* num parameters */ 9,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[14],
+    /* template types */ &kTemplateTypes[10],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[1000],
-    /* return matcher indices */ &kMatcherIndices[204],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Conv,
+    /* parameters */ &kParameters[40],
+    /* return matcher indices */ &kMatcherIndices[208],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::MatInitS,
   },
   {
     /* [207] */
-    /* num parameters */ 0,
+    /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[37],
+    /* template types */ &kTemplateTypes[10],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[1014],
+    /* parameters */ &kParameters[588],
     /* return matcher indices */ &kMatcherIndices[208],
     /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Zero,
+    /* const eval */ &ConstEval::MatInitV,
   },
   {
     /* [208] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[37],
+    /* template types */ &kTemplateTypes[16],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[1001],
-    /* return matcher indices */ &kMatcherIndices[208],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Identity,
+    /* parameters */ &kParameters[999],
+    /* return matcher indices */ &kMatcherIndices[212],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Conv,
   },
   {
     /* [209] */
-    /* num parameters */ 12,
+    /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[10],
+    /* template types */ &kTemplateTypes[14],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[16],
-    /* return matcher indices */ &kMatcherIndices[208],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::MatInitS,
+    /* parameters */ &kParameters[1000],
+    /* return matcher indices */ &kMatcherIndices[210],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Conv,
   },
   {
     /* [210] */
-    /* num parameters */ 3,
+    /* num parameters */ 0,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[10],
+    /* template types */ &kTemplateTypes[37],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[591],
-    /* return matcher indices */ &kMatcherIndices[208],
+    /* parameters */ &kParameters[1014],
+    /* return matcher indices */ &kMatcherIndices[214],
     /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::MatInitV,
+    /* const eval */ &ConstEval::Zero,
   },
   {
     /* [211] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[16],
+    /* template types */ &kTemplateTypes[37],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[1002],
-    /* return matcher indices */ &kMatcherIndices[212],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Conv,
+    /* parameters */ &kParameters[1001],
+    /* return matcher indices */ &kMatcherIndices[214],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Identity,
   },
   {
     /* [212] */
-    /* num parameters */ 1,
+    /* num parameters */ 12,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[14],
+    /* template types */ &kTemplateTypes[10],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[1003],
-    /* return matcher indices */ &kMatcherIndices[210],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Conv,
+    /* parameters */ &kParameters[16],
+    /* return matcher indices */ &kMatcherIndices[214],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::MatInitS,
   },
   {
     /* [213] */
-    /* num parameters */ 0,
+    /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[37],
+    /* template types */ &kTemplateTypes[10],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[1014],
+    /* parameters */ &kParameters[591],
     /* return matcher indices */ &kMatcherIndices[214],
     /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Zero,
+    /* const eval */ &ConstEval::MatInitV,
   },
   {
     /* [214] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[37],
+    /* template types */ &kTemplateTypes[16],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[1004],
-    /* return matcher indices */ &kMatcherIndices[214],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Identity,
+    /* parameters */ &kParameters[1002],
+    /* return matcher indices */ &kMatcherIndices[218],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Conv,
   },
   {
     /* [215] */
-    /* num parameters */ 8,
+    /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[10],
+    /* template types */ &kTemplateTypes[14],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[57],
-    /* return matcher indices */ &kMatcherIndices[214],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::MatInitS,
+    /* parameters */ &kParameters[1003],
+    /* return matcher indices */ &kMatcherIndices[216],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Conv,
   },
   {
     /* [216] */
-    /* num parameters */ 4,
+    /* num parameters */ 0,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[10],
+    /* template types */ &kTemplateTypes[37],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[435],
-    /* return matcher indices */ &kMatcherIndices[214],
+    /* parameters */ &kParameters[1014],
+    /* return matcher indices */ &kMatcherIndices[220],
     /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::MatInitV,
+    /* const eval */ &ConstEval::Zero,
   },
   {
     /* [217] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[16],
+    /* template types */ &kTemplateTypes[37],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[1005],
-    /* return matcher indices */ &kMatcherIndices[218],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Conv,
+    /* parameters */ &kParameters[1004],
+    /* return matcher indices */ &kMatcherIndices[220],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Identity,
   },
   {
     /* [218] */
-    /* num parameters */ 1,
+    /* num parameters */ 8,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[14],
+    /* template types */ &kTemplateTypes[10],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[1006],
-    /* return matcher indices */ &kMatcherIndices[216],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Conv,
+    /* parameters */ &kParameters[57],
+    /* return matcher indices */ &kMatcherIndices[220],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::MatInitS,
   },
   {
     /* [219] */
-    /* num parameters */ 0,
+    /* num parameters */ 4,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[37],
+    /* template types */ &kTemplateTypes[10],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[1014],
+    /* parameters */ &kParameters[435],
     /* return matcher indices */ &kMatcherIndices[220],
     /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Zero,
+    /* const eval */ &ConstEval::MatInitV,
   },
   {
     /* [220] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[37],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[1007],
-    /* return matcher indices */ &kMatcherIndices[220],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::Identity,
-  },
-  {
-    /* [221] */
-    /* num parameters */ 12,
-    /* num template types */ 1,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[10],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[28],
-    /* return matcher indices */ &kMatcherIndices[220],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::MatInitS,
-  },
-  {
-    /* [222] */
-    /* num parameters */ 4,
-    /* num template types */ 1,
-    /* num template numbers */ 0,
-    /* template types */ &kTemplateTypes[10],
-    /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[439],
-    /* return matcher indices */ &kMatcherIndices[220],
-    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* const eval */ &ConstEval::MatInitV,
-  },
-  {
-    /* [223] */
-    /* num parameters */ 1,
-    /* num template types */ 1,
-    /* num template numbers */ 0,
     /* template types */ &kTemplateTypes[16],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[1008],
+    /* parameters */ &kParameters[1005],
     /* return matcher indices */ &kMatcherIndices[224],
     /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* const eval */ &ConstEval::Conv,
   },
   {
-    /* [224] */
+    /* [221] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
     /* template types */ &kTemplateTypes[14],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[1009],
+    /* parameters */ &kParameters[1006],
     /* return matcher indices */ &kMatcherIndices[222],
     /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* const eval */ &ConstEval::Conv,
   },
   {
-    /* [225] */
+    /* [222] */
     /* num parameters */ 0,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -11122,67 +11092,139 @@
     /* const eval */ &ConstEval::Zero,
   },
   {
-    /* [226] */
+    /* [223] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
     /* template types */ &kTemplateTypes[37],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[1010],
+    /* parameters */ &kParameters[1007],
     /* return matcher indices */ &kMatcherIndices[226],
     /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* const eval */ &ConstEval::Identity,
   },
   {
-    /* [227] */
-    /* num parameters */ 16,
+    /* [224] */
+    /* num parameters */ 12,
     /* num template types */ 1,
     /* num template numbers */ 0,
     /* template types */ &kTemplateTypes[10],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[0],
+    /* parameters */ &kParameters[28],
     /* return matcher indices */ &kMatcherIndices[226],
     /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* const eval */ &ConstEval::MatInitS,
   },
   {
-    /* [228] */
+    /* [225] */
     /* num parameters */ 4,
     /* num template types */ 1,
     /* num template numbers */ 0,
     /* template types */ &kTemplateTypes[10],
     /* template numbers */ &kTemplateNumbers[10],
-    /* parameters */ &kParameters[443],
+    /* parameters */ &kParameters[439],
     /* return matcher indices */ &kMatcherIndices[226],
     /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* const eval */ &ConstEval::MatInitV,
   },
   {
+    /* [226] */
+    /* num parameters */ 1,
+    /* num template types */ 1,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[16],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[1008],
+    /* return matcher indices */ &kMatcherIndices[230],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Conv,
+  },
+  {
+    /* [227] */
+    /* num parameters */ 1,
+    /* num template types */ 1,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[14],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[1009],
+    /* return matcher indices */ &kMatcherIndices[228],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Conv,
+  },
+  {
+    /* [228] */
+    /* num parameters */ 0,
+    /* num template types */ 1,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[37],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[1014],
+    /* return matcher indices */ &kMatcherIndices[232],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Zero,
+  },
+  {
     /* [229] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[37],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[1010],
+    /* return matcher indices */ &kMatcherIndices[232],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::Identity,
+  },
+  {
+    /* [230] */
+    /* num parameters */ 16,
+    /* num template types */ 1,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[10],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[0],
+    /* return matcher indices */ &kMatcherIndices[232],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::MatInitS,
+  },
+  {
+    /* [231] */
+    /* num parameters */ 4,
+    /* num template types */ 1,
+    /* num template numbers */ 0,
+    /* template types */ &kTemplateTypes[10],
+    /* template numbers */ &kTemplateNumbers[10],
+    /* parameters */ &kParameters[443],
+    /* return matcher indices */ &kMatcherIndices[232],
+    /* flags */ OverloadFlags(OverloadFlag::kIsConstructor, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* const eval */ &ConstEval::MatInitV,
+  },
+  {
+    /* [232] */
+    /* num parameters */ 1,
+    /* num template types */ 1,
+    /* num template numbers */ 0,
     /* template types */ &kTemplateTypes[16],
     /* template numbers */ &kTemplateNumbers[10],
     /* parameters */ &kParameters[1011],
-    /* return matcher indices */ &kMatcherIndices[230],
+    /* return matcher indices */ &kMatcherIndices[236],
     /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* const eval */ &ConstEval::Conv,
   },
   {
-    /* [230] */
+    /* [233] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
     /* template types */ &kTemplateTypes[14],
     /* template numbers */ &kTemplateNumbers[10],
     /* parameters */ &kParameters[1012],
-    /* return matcher indices */ &kMatcherIndices[228],
+    /* return matcher indices */ &kMatcherIndices[234],
     /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* const eval */ &ConstEval::Conv,
   },
   {
-    /* [231] */
+    /* [234] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -11194,7 +11236,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [232] */
+    /* [235] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -11206,7 +11248,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [233] */
+    /* [236] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -11218,7 +11260,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [234] */
+    /* [237] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -11230,7 +11272,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [235] */
+    /* [238] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 2,
@@ -11242,7 +11284,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [236] */
+    /* [239] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -11254,7 +11296,7 @@
     /* const eval */ &ConstEval::OpPlus,
   },
   {
-    /* [237] */
+    /* [240] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11266,7 +11308,7 @@
     /* const eval */ &ConstEval::OpPlus,
   },
   {
-    /* [238] */
+    /* [241] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11278,7 +11320,7 @@
     /* const eval */ &ConstEval::OpPlus,
   },
   {
-    /* [239] */
+    /* [242] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11290,7 +11332,7 @@
     /* const eval */ &ConstEval::OpPlus,
   },
   {
-    /* [240] */
+    /* [243] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 2,
@@ -11302,7 +11344,7 @@
     /* const eval */ &ConstEval::OpPlus,
   },
   {
-    /* [241] */
+    /* [244] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -11314,7 +11356,7 @@
     /* const eval */ &ConstEval::OpMinus,
   },
   {
-    /* [242] */
+    /* [245] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11326,7 +11368,7 @@
     /* const eval */ &ConstEval::OpMinus,
   },
   {
-    /* [243] */
+    /* [246] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11338,7 +11380,7 @@
     /* const eval */ &ConstEval::OpMinus,
   },
   {
-    /* [244] */
+    /* [247] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11350,7 +11392,7 @@
     /* const eval */ &ConstEval::OpMinus,
   },
   {
-    /* [245] */
+    /* [248] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 2,
@@ -11362,7 +11404,7 @@
     /* const eval */ &ConstEval::OpMinus,
   },
   {
-    /* [246] */
+    /* [249] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -11374,7 +11416,7 @@
     /* const eval */ &ConstEval::OpDivide,
   },
   {
-    /* [247] */
+    /* [250] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11386,7 +11428,7 @@
     /* const eval */ &ConstEval::OpDivide,
   },
   {
-    /* [248] */
+    /* [251] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11398,7 +11440,7 @@
     /* const eval */ &ConstEval::OpDivide,
   },
   {
-    /* [249] */
+    /* [252] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11410,7 +11452,7 @@
     /* const eval */ &ConstEval::OpDivide,
   },
   {
-    /* [250] */
+    /* [253] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -11422,7 +11464,7 @@
     /* const eval */ &ConstEval::OpModulo,
   },
   {
-    /* [251] */
+    /* [254] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11434,7 +11476,7 @@
     /* const eval */ &ConstEval::OpModulo,
   },
   {
-    /* [252] */
+    /* [255] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11446,7 +11488,7 @@
     /* const eval */ &ConstEval::OpModulo,
   },
   {
-    /* [253] */
+    /* [256] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11458,7 +11500,7 @@
     /* const eval */ &ConstEval::OpModulo,
   },
   {
-    /* [254] */
+    /* [257] */
     /* num parameters */ 2,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -11470,7 +11512,7 @@
     /* const eval */ &ConstEval::OpAnd,
   },
   {
-    /* [255] */
+    /* [258] */
     /* num parameters */ 2,
     /* num template types */ 0,
     /* num template numbers */ 1,
@@ -11482,7 +11524,7 @@
     /* const eval */ &ConstEval::OpAnd,
   },
   {
-    /* [256] */
+    /* [259] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -11494,7 +11536,7 @@
     /* const eval */ &ConstEval::OpAnd,
   },
   {
-    /* [257] */
+    /* [260] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11506,7 +11548,7 @@
     /* const eval */ &ConstEval::OpAnd,
   },
   {
-    /* [258] */
+    /* [261] */
     /* num parameters */ 2,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -11518,7 +11560,7 @@
     /* const eval */ &ConstEval::OpOr,
   },
   {
-    /* [259] */
+    /* [262] */
     /* num parameters */ 2,
     /* num template types */ 0,
     /* num template numbers */ 1,
@@ -11530,7 +11572,7 @@
     /* const eval */ &ConstEval::OpOr,
   },
   {
-    /* [260] */
+    /* [263] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -11542,7 +11584,7 @@
     /* const eval */ &ConstEval::OpOr,
   },
   {
-    /* [261] */
+    /* [264] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11554,7 +11596,7 @@
     /* const eval */ &ConstEval::OpOr,
   },
   {
-    /* [262] */
+    /* [265] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -11566,7 +11608,7 @@
     /* const eval */ &ConstEval::mix,
   },
   {
-    /* [263] */
+    /* [266] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11578,7 +11620,7 @@
     /* const eval */ &ConstEval::mix,
   },
   {
-    /* [264] */
+    /* [267] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11590,7 +11632,7 @@
     /* const eval */ &ConstEval::mix,
   },
   {
-    /* [265] */
+    /* [268] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -11602,7 +11644,7 @@
     /* const eval */ &ConstEval::select_bool,
   },
   {
-    /* [266] */
+    /* [269] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11614,7 +11656,7 @@
     /* const eval */ &ConstEval::select_bool,
   },
   {
-    /* [267] */
+    /* [270] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11626,7 +11668,7 @@
     /* const eval */ &ConstEval::select_boolvec,
   },
   {
-    /* [268] */
+    /* [271] */
     /* num parameters */ 0,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -11638,7 +11680,7 @@
     /* const eval */ &ConstEval::Zero,
   },
   {
-    /* [269] */
+    /* [272] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -11650,7 +11692,7 @@
     /* const eval */ &ConstEval::Identity,
   },
   {
-    /* [270] */
+    /* [273] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -11662,7 +11704,7 @@
     /* const eval */ &ConstEval::Conv,
   },
   {
-    /* [271] */
+    /* [274] */
     /* num parameters */ 0,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -11674,7 +11716,7 @@
     /* const eval */ &ConstEval::Zero,
   },
   {
-    /* [272] */
+    /* [275] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -11686,7 +11728,7 @@
     /* const eval */ &ConstEval::Identity,
   },
   {
-    /* [273] */
+    /* [276] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -11698,7 +11740,7 @@
     /* const eval */ &ConstEval::Conv,
   },
   {
-    /* [274] */
+    /* [277] */
     /* num parameters */ 0,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -11710,7 +11752,7 @@
     /* const eval */ &ConstEval::Zero,
   },
   {
-    /* [275] */
+    /* [278] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -11722,7 +11764,7 @@
     /* const eval */ &ConstEval::Identity,
   },
   {
-    /* [276] */
+    /* [279] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -11734,7 +11776,7 @@
     /* const eval */ &ConstEval::Conv,
   },
   {
-    /* [277] */
+    /* [280] */
     /* num parameters */ 0,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -11746,7 +11788,7 @@
     /* const eval */ &ConstEval::Zero,
   },
   {
-    /* [278] */
+    /* [281] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -11758,7 +11800,7 @@
     /* const eval */ &ConstEval::Identity,
   },
   {
-    /* [279] */
+    /* [282] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -11770,7 +11812,7 @@
     /* const eval */ &ConstEval::Conv,
   },
   {
-    /* [280] */
+    /* [283] */
     /* num parameters */ 0,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -11782,7 +11824,7 @@
     /* const eval */ &ConstEval::Zero,
   },
   {
-    /* [281] */
+    /* [284] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -11794,7 +11836,7 @@
     /* const eval */ &ConstEval::Identity,
   },
   {
-    /* [282] */
+    /* [285] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -11806,7 +11848,7 @@
     /* const eval */ &ConstEval::Conv,
   },
   {
-    /* [283] */
+    /* [286] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -11818,7 +11860,7 @@
     /* const eval */ &ConstEval::abs,
   },
   {
-    /* [284] */
+    /* [287] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11830,7 +11872,7 @@
     /* const eval */ &ConstEval::abs,
   },
   {
-    /* [285] */
+    /* [288] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -11842,7 +11884,7 @@
     /* const eval */ &ConstEval::acos,
   },
   {
-    /* [286] */
+    /* [289] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11854,7 +11896,7 @@
     /* const eval */ &ConstEval::acos,
   },
   {
-    /* [287] */
+    /* [290] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -11866,7 +11908,7 @@
     /* const eval */ &ConstEval::acosh,
   },
   {
-    /* [288] */
+    /* [291] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11878,7 +11920,7 @@
     /* const eval */ &ConstEval::acosh,
   },
   {
-    /* [289] */
+    /* [292] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -11890,7 +11932,7 @@
     /* const eval */ &ConstEval::all,
   },
   {
-    /* [290] */
+    /* [293] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 1,
@@ -11902,7 +11944,7 @@
     /* const eval */ &ConstEval::all,
   },
   {
-    /* [291] */
+    /* [294] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -11914,7 +11956,7 @@
     /* const eval */ &ConstEval::any,
   },
   {
-    /* [292] */
+    /* [295] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 1,
@@ -11926,7 +11968,7 @@
     /* const eval */ &ConstEval::any,
   },
   {
-    /* [293] */
+    /* [296] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -11938,7 +11980,7 @@
     /* const eval */ &ConstEval::asin,
   },
   {
-    /* [294] */
+    /* [297] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11950,7 +11992,7 @@
     /* const eval */ &ConstEval::asin,
   },
   {
-    /* [295] */
+    /* [298] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -11962,7 +12004,7 @@
     /* const eval */ &ConstEval::asinh,
   },
   {
-    /* [296] */
+    /* [299] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11974,7 +12016,7 @@
     /* const eval */ &ConstEval::asinh,
   },
   {
-    /* [297] */
+    /* [300] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -11986,7 +12028,7 @@
     /* const eval */ &ConstEval::atan,
   },
   {
-    /* [298] */
+    /* [301] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -11998,7 +12040,7 @@
     /* const eval */ &ConstEval::atan,
   },
   {
-    /* [299] */
+    /* [302] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12010,7 +12052,7 @@
     /* const eval */ &ConstEval::atan2,
   },
   {
-    /* [300] */
+    /* [303] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12022,7 +12064,7 @@
     /* const eval */ &ConstEval::atan2,
   },
   {
-    /* [301] */
+    /* [304] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12034,7 +12076,7 @@
     /* const eval */ &ConstEval::atanh,
   },
   {
-    /* [302] */
+    /* [305] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12046,7 +12088,7 @@
     /* const eval */ &ConstEval::atanh,
   },
   {
-    /* [303] */
+    /* [306] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12058,7 +12100,7 @@
     /* const eval */ &ConstEval::ceil,
   },
   {
-    /* [304] */
+    /* [307] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12070,7 +12112,7 @@
     /* const eval */ &ConstEval::ceil,
   },
   {
-    /* [305] */
+    /* [308] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12082,7 +12124,7 @@
     /* const eval */ &ConstEval::clamp,
   },
   {
-    /* [306] */
+    /* [309] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12094,7 +12136,7 @@
     /* const eval */ &ConstEval::clamp,
   },
   {
-    /* [307] */
+    /* [310] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12106,7 +12148,7 @@
     /* const eval */ &ConstEval::cos,
   },
   {
-    /* [308] */
+    /* [311] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12118,7 +12160,7 @@
     /* const eval */ &ConstEval::cos,
   },
   {
-    /* [309] */
+    /* [312] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12130,7 +12172,7 @@
     /* const eval */ &ConstEval::cosh,
   },
   {
-    /* [310] */
+    /* [313] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12142,7 +12184,7 @@
     /* const eval */ &ConstEval::cosh,
   },
   {
-    /* [311] */
+    /* [314] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12154,7 +12196,7 @@
     /* const eval */ &ConstEval::countLeadingZeros,
   },
   {
-    /* [312] */
+    /* [315] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12166,7 +12208,7 @@
     /* const eval */ &ConstEval::countLeadingZeros,
   },
   {
-    /* [313] */
+    /* [316] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12178,7 +12220,7 @@
     /* const eval */ &ConstEval::countOneBits,
   },
   {
-    /* [314] */
+    /* [317] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12190,7 +12232,7 @@
     /* const eval */ &ConstEval::countOneBits,
   },
   {
-    /* [315] */
+    /* [318] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12202,7 +12244,7 @@
     /* const eval */ &ConstEval::countTrailingZeros,
   },
   {
-    /* [316] */
+    /* [319] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12214,7 +12256,7 @@
     /* const eval */ &ConstEval::countTrailingZeros,
   },
   {
-    /* [317] */
+    /* [320] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12226,7 +12268,7 @@
     /* const eval */ &ConstEval::degrees,
   },
   {
-    /* [318] */
+    /* [321] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12238,7 +12280,7 @@
     /* const eval */ &ConstEval::degrees,
   },
   {
-    /* [319] */
+    /* [322] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12250,7 +12292,7 @@
     /* const eval */ &ConstEval::distance,
   },
   {
-    /* [320] */
+    /* [323] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12262,7 +12304,7 @@
     /* const eval */ &ConstEval::distance,
   },
   {
-    /* [321] */
+    /* [324] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -12274,7 +12316,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [322] */
+    /* [325] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 1,
@@ -12286,7 +12328,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [323] */
+    /* [326] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -12298,7 +12340,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [324] */
+    /* [327] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 1,
@@ -12310,7 +12352,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [325] */
+    /* [328] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -12322,7 +12364,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [326] */
+    /* [329] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 1,
@@ -12334,7 +12376,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [327] */
+    /* [330] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -12346,7 +12388,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [328] */
+    /* [331] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 1,
@@ -12358,7 +12400,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [329] */
+    /* [332] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -12370,7 +12412,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [330] */
+    /* [333] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 1,
@@ -12382,7 +12424,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [331] */
+    /* [334] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -12394,7 +12436,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [332] */
+    /* [335] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 1,
@@ -12406,7 +12448,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [333] */
+    /* [336] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12418,7 +12460,7 @@
     /* const eval */ &ConstEval::exp,
   },
   {
-    /* [334] */
+    /* [337] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12430,7 +12472,7 @@
     /* const eval */ &ConstEval::exp,
   },
   {
-    /* [335] */
+    /* [338] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12442,7 +12484,7 @@
     /* const eval */ &ConstEval::exp2,
   },
   {
-    /* [336] */
+    /* [339] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12454,7 +12496,7 @@
     /* const eval */ &ConstEval::exp2,
   },
   {
-    /* [337] */
+    /* [340] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12466,7 +12508,7 @@
     /* const eval */ &ConstEval::extractBits,
   },
   {
-    /* [338] */
+    /* [341] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12478,7 +12520,7 @@
     /* const eval */ &ConstEval::extractBits,
   },
   {
-    /* [339] */
+    /* [342] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12490,7 +12532,7 @@
     /* const eval */ &ConstEval::firstLeadingBit,
   },
   {
-    /* [340] */
+    /* [343] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12502,7 +12544,7 @@
     /* const eval */ &ConstEval::firstLeadingBit,
   },
   {
-    /* [341] */
+    /* [344] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12514,7 +12556,7 @@
     /* const eval */ &ConstEval::firstTrailingBit,
   },
   {
-    /* [342] */
+    /* [345] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12526,7 +12568,7 @@
     /* const eval */ &ConstEval::firstTrailingBit,
   },
   {
-    /* [343] */
+    /* [346] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12538,7 +12580,7 @@
     /* const eval */ &ConstEval::floor,
   },
   {
-    /* [344] */
+    /* [347] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12550,7 +12592,7 @@
     /* const eval */ &ConstEval::floor,
   },
   {
-    /* [345] */
+    /* [348] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12562,7 +12604,7 @@
     /* const eval */ &ConstEval::fma,
   },
   {
-    /* [346] */
+    /* [349] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12574,7 +12616,7 @@
     /* const eval */ &ConstEval::fma,
   },
   {
-    /* [347] */
+    /* [350] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12586,7 +12628,7 @@
     /* const eval */ &ConstEval::fract,
   },
   {
-    /* [348] */
+    /* [351] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12598,7 +12640,7 @@
     /* const eval */ &ConstEval::fract,
   },
   {
-    /* [349] */
+    /* [352] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12610,7 +12652,7 @@
     /* const eval */ &ConstEval::frexp,
   },
   {
-    /* [350] */
+    /* [353] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12622,7 +12664,7 @@
     /* const eval */ &ConstEval::frexp,
   },
   {
-    /* [351] */
+    /* [354] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -12634,7 +12676,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [352] */
+    /* [355] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 1,
@@ -12646,7 +12688,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [353] */
+    /* [356] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -12658,7 +12700,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [354] */
+    /* [357] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 1,
@@ -12670,7 +12712,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [355] */
+    /* [358] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -12682,7 +12724,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [356] */
+    /* [359] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 1,
@@ -12694,7 +12736,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [357] */
+    /* [360] */
     /* num parameters */ 4,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12706,7 +12748,7 @@
     /* const eval */ &ConstEval::insertBits,
   },
   {
-    /* [358] */
+    /* [361] */
     /* num parameters */ 4,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12718,7 +12760,7 @@
     /* const eval */ &ConstEval::insertBits,
   },
   {
-    /* [359] */
+    /* [362] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12730,7 +12772,7 @@
     /* const eval */ &ConstEval::inverseSqrt,
   },
   {
-    /* [360] */
+    /* [363] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12742,7 +12784,7 @@
     /* const eval */ &ConstEval::inverseSqrt,
   },
   {
-    /* [361] */
+    /* [364] */
     /* num parameters */ 2,
     /* num template types */ 2,
     /* num template numbers */ 0,
@@ -12754,7 +12796,7 @@
     /* const eval */ &ConstEval::ldexp,
   },
   {
-    /* [362] */
+    /* [365] */
     /* num parameters */ 2,
     /* num template types */ 2,
     /* num template numbers */ 1,
@@ -12766,7 +12808,7 @@
     /* const eval */ &ConstEval::ldexp,
   },
   {
-    /* [363] */
+    /* [366] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12778,7 +12820,7 @@
     /* const eval */ &ConstEval::length,
   },
   {
-    /* [364] */
+    /* [367] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12790,7 +12832,7 @@
     /* const eval */ &ConstEval::length,
   },
   {
-    /* [365] */
+    /* [368] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12802,7 +12844,7 @@
     /* const eval */ &ConstEval::log,
   },
   {
-    /* [366] */
+    /* [369] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12814,7 +12856,7 @@
     /* const eval */ &ConstEval::log,
   },
   {
-    /* [367] */
+    /* [370] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12826,7 +12868,7 @@
     /* const eval */ &ConstEval::log2,
   },
   {
-    /* [368] */
+    /* [371] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12838,7 +12880,7 @@
     /* const eval */ &ConstEval::log2,
   },
   {
-    /* [369] */
+    /* [372] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12850,7 +12892,7 @@
     /* const eval */ &ConstEval::max,
   },
   {
-    /* [370] */
+    /* [373] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12862,7 +12904,7 @@
     /* const eval */ &ConstEval::max,
   },
   {
-    /* [371] */
+    /* [374] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12874,7 +12916,7 @@
     /* const eval */ &ConstEval::min,
   },
   {
-    /* [372] */
+    /* [375] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12886,7 +12928,7 @@
     /* const eval */ &ConstEval::min,
   },
   {
-    /* [373] */
+    /* [376] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12898,7 +12940,7 @@
     /* const eval */ &ConstEval::modf,
   },
   {
-    /* [374] */
+    /* [377] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12910,7 +12952,7 @@
     /* const eval */ &ConstEval::modf,
   },
   {
-    /* [375] */
+    /* [378] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12922,7 +12964,7 @@
     /* const eval */ &ConstEval::pow,
   },
   {
-    /* [376] */
+    /* [379] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12934,7 +12976,7 @@
     /* const eval */ &ConstEval::pow,
   },
   {
-    /* [377] */
+    /* [380] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -12946,7 +12988,7 @@
     /* const eval */ &ConstEval::quantizeToF16,
   },
   {
-    /* [378] */
+    /* [381] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 1,
@@ -12958,7 +13000,7 @@
     /* const eval */ &ConstEval::quantizeToF16,
   },
   {
-    /* [379] */
+    /* [382] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12970,7 +13012,7 @@
     /* const eval */ &ConstEval::radians,
   },
   {
-    /* [380] */
+    /* [383] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -12982,7 +13024,7 @@
     /* const eval */ &ConstEval::radians,
   },
   {
-    /* [381] */
+    /* [384] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -12994,7 +13036,7 @@
     /* const eval */ &ConstEval::reverseBits,
   },
   {
-    /* [382] */
+    /* [385] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13006,7 +13048,7 @@
     /* const eval */ &ConstEval::reverseBits,
   },
   {
-    /* [383] */
+    /* [386] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13018,7 +13060,7 @@
     /* const eval */ &ConstEval::round,
   },
   {
-    /* [384] */
+    /* [387] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13030,7 +13072,7 @@
     /* const eval */ &ConstEval::round,
   },
   {
-    /* [385] */
+    /* [388] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13042,7 +13084,7 @@
     /* const eval */ &ConstEval::saturate,
   },
   {
-    /* [386] */
+    /* [389] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13054,7 +13096,7 @@
     /* const eval */ &ConstEval::saturate,
   },
   {
-    /* [387] */
+    /* [390] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13066,7 +13108,7 @@
     /* const eval */ &ConstEval::sign,
   },
   {
-    /* [388] */
+    /* [391] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13078,7 +13120,7 @@
     /* const eval */ &ConstEval::sign,
   },
   {
-    /* [389] */
+    /* [392] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13090,7 +13132,7 @@
     /* const eval */ &ConstEval::sin,
   },
   {
-    /* [390] */
+    /* [393] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13102,7 +13144,7 @@
     /* const eval */ &ConstEval::sin,
   },
   {
-    /* [391] */
+    /* [394] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13114,7 +13156,7 @@
     /* const eval */ &ConstEval::sinh,
   },
   {
-    /* [392] */
+    /* [395] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13126,7 +13168,7 @@
     /* const eval */ &ConstEval::sinh,
   },
   {
-    /* [393] */
+    /* [396] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13138,7 +13180,7 @@
     /* const eval */ &ConstEval::smoothstep,
   },
   {
-    /* [394] */
+    /* [397] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13150,7 +13192,7 @@
     /* const eval */ &ConstEval::smoothstep,
   },
   {
-    /* [395] */
+    /* [398] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13162,7 +13204,7 @@
     /* const eval */ &ConstEval::sqrt,
   },
   {
-    /* [396] */
+    /* [399] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13174,7 +13216,7 @@
     /* const eval */ &ConstEval::sqrt,
   },
   {
-    /* [397] */
+    /* [400] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13186,7 +13228,7 @@
     /* const eval */ &ConstEval::step,
   },
   {
-    /* [398] */
+    /* [401] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13198,7 +13240,7 @@
     /* const eval */ &ConstEval::step,
   },
   {
-    /* [399] */
+    /* [402] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13210,7 +13252,7 @@
     /* const eval */ &ConstEval::tan,
   },
   {
-    /* [400] */
+    /* [403] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13222,7 +13264,7 @@
     /* const eval */ &ConstEval::tan,
   },
   {
-    /* [401] */
+    /* [404] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13234,7 +13276,7 @@
     /* const eval */ &ConstEval::tanh,
   },
   {
-    /* [402] */
+    /* [405] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13246,7 +13288,7 @@
     /* const eval */ &ConstEval::tanh,
   },
   {
-    /* [403] */
+    /* [406] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13258,7 +13300,7 @@
     /* const eval */ &ConstEval::trunc,
   },
   {
-    /* [404] */
+    /* [407] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13270,7 +13312,7 @@
     /* const eval */ &ConstEval::trunc,
   },
   {
-    /* [405] */
+    /* [408] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13282,7 +13324,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [406] */
+    /* [409] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -13294,7 +13336,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [407] */
+    /* [410] */
     /* num parameters */ 3,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -13306,7 +13348,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [408] */
+    /* [411] */
     /* num parameters */ 3,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -13318,7 +13360,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [409] */
+    /* [412] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -13330,7 +13372,7 @@
     /* const eval */ &ConstEval::OpNot,
   },
   {
-    /* [410] */
+    /* [413] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 1,
@@ -13342,7 +13384,7 @@
     /* const eval */ &ConstEval::OpNot,
   },
   {
-    /* [411] */
+    /* [414] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13354,7 +13396,7 @@
     /* const eval */ &ConstEval::OpComplement,
   },
   {
-    /* [412] */
+    /* [415] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13366,7 +13408,7 @@
     /* const eval */ &ConstEval::OpComplement,
   },
   {
-    /* [413] */
+    /* [416] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13378,7 +13420,7 @@
     /* const eval */ &ConstEval::OpUnaryMinus,
   },
   {
-    /* [414] */
+    /* [417] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13390,7 +13432,7 @@
     /* const eval */ &ConstEval::OpUnaryMinus,
   },
   {
-    /* [415] */
+    /* [418] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13402,7 +13444,7 @@
     /* const eval */ &ConstEval::OpXor,
   },
   {
-    /* [416] */
+    /* [419] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13414,7 +13456,7 @@
     /* const eval */ &ConstEval::OpXor,
   },
   {
-    /* [417] */
+    /* [420] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13426,7 +13468,7 @@
     /* const eval */ &ConstEval::OpEqual,
   },
   {
-    /* [418] */
+    /* [421] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13438,7 +13480,7 @@
     /* const eval */ &ConstEval::OpEqual,
   },
   {
-    /* [419] */
+    /* [422] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13450,7 +13492,7 @@
     /* const eval */ &ConstEval::OpNotEqual,
   },
   {
-    /* [420] */
+    /* [423] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13462,7 +13504,7 @@
     /* const eval */ &ConstEval::OpNotEqual,
   },
   {
-    /* [421] */
+    /* [424] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13474,7 +13516,7 @@
     /* const eval */ &ConstEval::OpLessThan,
   },
   {
-    /* [422] */
+    /* [425] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13486,7 +13528,7 @@
     /* const eval */ &ConstEval::OpLessThan,
   },
   {
-    /* [423] */
+    /* [426] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13498,7 +13540,7 @@
     /* const eval */ &ConstEval::OpGreaterThan,
   },
   {
-    /* [424] */
+    /* [427] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13510,7 +13552,7 @@
     /* const eval */ &ConstEval::OpGreaterThan,
   },
   {
-    /* [425] */
+    /* [428] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13522,7 +13564,7 @@
     /* const eval */ &ConstEval::OpLessThanEqual,
   },
   {
-    /* [426] */
+    /* [429] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13534,7 +13576,7 @@
     /* const eval */ &ConstEval::OpLessThanEqual,
   },
   {
-    /* [427] */
+    /* [430] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13546,7 +13588,7 @@
     /* const eval */ &ConstEval::OpGreaterThanEqual,
   },
   {
-    /* [428] */
+    /* [431] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13558,7 +13600,7 @@
     /* const eval */ &ConstEval::OpGreaterThanEqual,
   },
   {
-    /* [429] */
+    /* [432] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13570,7 +13612,7 @@
     /* const eval */ &ConstEval::OpShiftLeft,
   },
   {
-    /* [430] */
+    /* [433] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13582,7 +13624,7 @@
     /* const eval */ &ConstEval::OpShiftLeft,
   },
   {
-    /* [431] */
+    /* [434] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13594,7 +13636,7 @@
     /* const eval */ &ConstEval::OpShiftRight,
   },
   {
-    /* [432] */
+    /* [435] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13606,7 +13648,7 @@
     /* const eval */ &ConstEval::OpShiftRight,
   },
   {
-    /* [433] */
+    /* [436] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13618,7 +13660,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [434] */
+    /* [437] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13630,7 +13672,7 @@
     /* const eval */ &ConstEval::cross,
   },
   {
-    /* [435] */
+    /* [438] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13642,7 +13684,7 @@
     /* const eval */ &ConstEval::determinant,
   },
   {
-    /* [436] */
+    /* [439] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13654,7 +13696,7 @@
     /* const eval */ &ConstEval::dot,
   },
   {
-    /* [437] */
+    /* [440] */
     /* num parameters */ 2,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -13666,7 +13708,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [438] */
+    /* [441] */
     /* num parameters */ 2,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -13678,7 +13720,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [439] */
+    /* [442] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13690,7 +13732,7 @@
     /* const eval */ &ConstEval::faceForward,
   },
   {
-    /* [440] */
+    /* [443] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13702,7 +13744,7 @@
     /* const eval */ &ConstEval::normalize,
   },
   {
-    /* [441] */
+    /* [444] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -13714,7 +13756,7 @@
     /* const eval */ &ConstEval::pack2x16float,
   },
   {
-    /* [442] */
+    /* [445] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -13726,7 +13768,7 @@
     /* const eval */ &ConstEval::pack2x16snorm,
   },
   {
-    /* [443] */
+    /* [446] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -13738,7 +13780,7 @@
     /* const eval */ &ConstEval::pack2x16unorm,
   },
   {
-    /* [444] */
+    /* [447] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -13750,7 +13792,7 @@
     /* const eval */ &ConstEval::pack4x8snorm,
   },
   {
-    /* [445] */
+    /* [448] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -13762,7 +13804,7 @@
     /* const eval */ &ConstEval::pack4x8unorm,
   },
   {
-    /* [446] */
+    /* [449] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13774,7 +13816,7 @@
     /* const eval */ &ConstEval::reflect,
   },
   {
-    /* [447] */
+    /* [450] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13786,7 +13828,7 @@
     /* const eval */ &ConstEval::refract,
   },
   {
-    /* [448] */
+    /* [451] */
     /* num parameters */ 0,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -13798,7 +13840,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [449] */
+    /* [452] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 2,
@@ -13810,7 +13852,7 @@
     /* const eval */ &ConstEval::transpose,
   },
   {
-    /* [450] */
+    /* [453] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -13822,7 +13864,7 @@
     /* const eval */ &ConstEval::unpack2x16float,
   },
   {
-    /* [451] */
+    /* [454] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -13834,7 +13876,7 @@
     /* const eval */ &ConstEval::unpack2x16snorm,
   },
   {
-    /* [452] */
+    /* [455] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -13846,7 +13888,7 @@
     /* const eval */ &ConstEval::unpack2x16unorm,
   },
   {
-    /* [453] */
+    /* [456] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -13858,7 +13900,7 @@
     /* const eval */ &ConstEval::unpack4x8snorm,
   },
   {
-    /* [454] */
+    /* [457] */
     /* num parameters */ 1,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -13870,7 +13912,7 @@
     /* const eval */ &ConstEval::unpack4x8unorm,
   },
   {
-    /* [455] */
+    /* [458] */
     /* num parameters */ 0,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -13882,7 +13924,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [456] */
+    /* [459] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -13894,7 +13936,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [457] */
+    /* [460] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13906,7 +13948,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [458] */
+    /* [461] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13918,7 +13960,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [459] */
+    /* [462] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13930,7 +13972,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [460] */
+    /* [463] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13942,7 +13984,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [461] */
+    /* [464] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13954,7 +13996,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [462] */
+    /* [465] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13966,7 +14008,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [463] */
+    /* [466] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13978,7 +14020,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [464] */
+    /* [467] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -13990,7 +14032,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [465] */
+    /* [468] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -14002,7 +14044,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [466] */
+    /* [469] */
     /* num parameters */ 2,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -14014,7 +14056,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [467] */
+    /* [470] */
     /* num parameters */ 3,
     /* num template types */ 1,
     /* num template numbers */ 1,
@@ -14026,7 +14068,7 @@
     /* const eval */ nullptr,
   },
   {
-    /* [468] */
+    /* [471] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
@@ -14038,7 +14080,7 @@
     /* const eval */ &ConstEval::Identity,
   },
   {
-    /* [469] */
+    /* [472] */
     /* num parameters */ 2,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -14050,7 +14092,7 @@
     /* const eval */ &ConstEval::OpLogicalAnd,
   },
   {
-    /* [470] */
+    /* [473] */
     /* num parameters */ 2,
     /* num template types */ 0,
     /* num template numbers */ 0,
@@ -14062,14 +14104,14 @@
     /* const eval */ &ConstEval::OpLogicalOr,
   },
   {
-    /* [471] */
+    /* [474] */
     /* num parameters */ 1,
     /* num template types */ 1,
     /* num template numbers */ 0,
     /* template types */ &kTemplateTypes[36],
     /* template numbers */ &kTemplateNumbers[10],
     /* parameters */ &kParameters[1013],
-    /* return matcher indices */ &kMatcherIndices[232],
+    /* return matcher indices */ &kMatcherIndices[238],
     /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* const eval */ &ConstEval::Conv,
   },
@@ -14081,357 +14123,357 @@
     /* fn abs<T : fia_fiu32_f16>(T) -> T */
     /* fn abs<N : num, T : fia_fiu32_f16>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[283],
+    /* overloads */ &kOverloads[286],
   },
   {
     /* [1] */
     /* fn acos<T : fa_f32_f16>(@test_value(0.96891242171) T) -> T */
     /* fn acos<N : num, T : fa_f32_f16>(@test_value(0.96891242171) vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[285],
+    /* overloads */ &kOverloads[288],
   },
   {
     /* [2] */
     /* fn acosh<T : fa_f32_f16>(@test_value(1.5430806348) T) -> T */
     /* fn acosh<N : num, T : fa_f32_f16>(@test_value(1.5430806348) vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[287],
+    /* overloads */ &kOverloads[290],
   },
   {
     /* [3] */
     /* fn all(bool) -> bool */
     /* fn all<N : num>(vec<N, bool>) -> bool */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[289],
+    /* overloads */ &kOverloads[292],
   },
   {
     /* [4] */
     /* fn any(bool) -> bool */
     /* fn any<N : num>(vec<N, bool>) -> bool */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[291],
+    /* overloads */ &kOverloads[294],
   },
   {
     /* [5] */
     /* fn arrayLength<T, A : access>(ptr<storage, array<T>, A>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[433],
+    /* overloads */ &kOverloads[436],
   },
   {
     /* [6] */
     /* fn asin<T : fa_f32_f16>(@test_value(0.479425538604) T) -> T */
     /* fn asin<N : num, T : fa_f32_f16>(@test_value(0.479425538604) vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[293],
+    /* overloads */ &kOverloads[296],
   },
   {
     /* [7] */
     /* fn asinh<T : fa_f32_f16>(T) -> T */
     /* fn asinh<N : num, T : fa_f32_f16>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[295],
+    /* overloads */ &kOverloads[298],
   },
   {
     /* [8] */
     /* fn atan<T : fa_f32_f16>(T) -> T */
     /* fn atan<N : num, T : fa_f32_f16>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[297],
+    /* overloads */ &kOverloads[300],
   },
   {
     /* [9] */
     /* fn atan2<T : fa_f32_f16>(T, T) -> T */
     /* fn atan2<T : fa_f32_f16, N : num>(vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[299],
+    /* overloads */ &kOverloads[302],
   },
   {
     /* [10] */
     /* fn atanh<T : fa_f32_f16>(@test_value(0.5) T) -> T */
     /* fn atanh<N : num, T : fa_f32_f16>(@test_value(0.5) vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[301],
+    /* overloads */ &kOverloads[304],
   },
   {
     /* [11] */
     /* fn ceil<T : fa_f32_f16>(@test_value(1.5) T) -> T */
     /* fn ceil<N : num, T : fa_f32_f16>(@test_value(1.5) vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[303],
+    /* overloads */ &kOverloads[306],
   },
   {
     /* [12] */
     /* fn clamp<T : fia_fiu32_f16>(T, T, T) -> T */
     /* fn clamp<T : fia_fiu32_f16, N : num>(vec<N, T>, vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[305],
+    /* overloads */ &kOverloads[308],
   },
   {
     /* [13] */
     /* fn cos<T : fa_f32_f16>(@test_value(0) T) -> T */
     /* fn cos<N : num, T : fa_f32_f16>(@test_value(0) vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[307],
+    /* overloads */ &kOverloads[310],
   },
   {
     /* [14] */
     /* fn cosh<T : fa_f32_f16>(@test_value(0) T) -> T */
     /* fn cosh<N : num, T : fa_f32_f16>(@test_value(0) vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[309],
+    /* overloads */ &kOverloads[312],
   },
   {
     /* [15] */
     /* fn countLeadingZeros<T : iu32>(T) -> T */
     /* fn countLeadingZeros<N : num, T : iu32>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[311],
+    /* overloads */ &kOverloads[314],
   },
   {
     /* [16] */
     /* fn countOneBits<T : iu32>(T) -> T */
     /* fn countOneBits<N : num, T : iu32>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[313],
+    /* overloads */ &kOverloads[316],
   },
   {
     /* [17] */
     /* fn countTrailingZeros<T : iu32>(T) -> T */
     /* fn countTrailingZeros<N : num, T : iu32>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[315],
+    /* overloads */ &kOverloads[318],
   },
   {
     /* [18] */
     /* fn cross<T : fa_f32_f16>(vec3<T>, vec3<T>) -> vec3<T> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[434],
+    /* overloads */ &kOverloads[437],
   },
   {
     /* [19] */
     /* fn degrees<T : fa_f32_f16>(T) -> T */
     /* fn degrees<N : num, T : fa_f32_f16>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[317],
+    /* overloads */ &kOverloads[320],
   },
   {
     /* [20] */
     /* fn determinant<N : num, T : fa_f32_f16>(mat<N, N, T>) -> T */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[435],
+    /* overloads */ &kOverloads[438],
   },
   {
     /* [21] */
     /* fn distance<T : fa_f32_f16>(T, T) -> T */
     /* fn distance<N : num, T : fa_f32_f16>(vec<N, T>, vec<N, T>) -> T */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[319],
+    /* overloads */ &kOverloads[322],
   },
   {
     /* [22] */
     /* fn dot<N : num, T : fia_fiu32_f16>(vec<N, T>, vec<N, T>) -> T */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[436],
+    /* overloads */ &kOverloads[439],
   },
   {
     /* [23] */
     /* fn dot4I8Packed(u32, u32) -> i32 */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[437],
+    /* overloads */ &kOverloads[440],
   },
   {
     /* [24] */
     /* fn dot4U8Packed(u32, u32) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[438],
+    /* overloads */ &kOverloads[441],
   },
   {
     /* [25] */
     /* fn dpdx(f32) -> f32 */
     /* fn dpdx<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[321],
+    /* overloads */ &kOverloads[324],
   },
   {
     /* [26] */
     /* fn dpdxCoarse(f32) -> f32 */
     /* fn dpdxCoarse<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[323],
+    /* overloads */ &kOverloads[326],
   },
   {
     /* [27] */
     /* fn dpdxFine(f32) -> f32 */
     /* fn dpdxFine<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[325],
+    /* overloads */ &kOverloads[328],
   },
   {
     /* [28] */
     /* fn dpdy(f32) -> f32 */
     /* fn dpdy<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[327],
+    /* overloads */ &kOverloads[330],
   },
   {
     /* [29] */
     /* fn dpdyCoarse(f32) -> f32 */
     /* fn dpdyCoarse<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[329],
+    /* overloads */ &kOverloads[332],
   },
   {
     /* [30] */
     /* fn dpdyFine(f32) -> f32 */
     /* fn dpdyFine<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[331],
+    /* overloads */ &kOverloads[334],
   },
   {
     /* [31] */
     /* fn exp<T : fa_f32_f16>(T) -> T */
     /* fn exp<N : num, T : fa_f32_f16>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[333],
+    /* overloads */ &kOverloads[336],
   },
   {
     /* [32] */
     /* fn exp2<T : fa_f32_f16>(T) -> T */
     /* fn exp2<N : num, T : fa_f32_f16>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[335],
+    /* overloads */ &kOverloads[338],
   },
   {
     /* [33] */
     /* fn extractBits<T : iu32>(T, u32, u32) -> T */
     /* fn extractBits<N : num, T : iu32>(vec<N, T>, u32, u32) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[337],
+    /* overloads */ &kOverloads[340],
   },
   {
     /* [34] */
     /* fn faceForward<N : num, T : fa_f32_f16>(vec<N, T>, vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[439],
+    /* overloads */ &kOverloads[442],
   },
   {
     /* [35] */
     /* fn firstLeadingBit<T : iu32>(T) -> T */
     /* fn firstLeadingBit<N : num, T : iu32>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[339],
+    /* overloads */ &kOverloads[342],
   },
   {
     /* [36] */
     /* fn firstTrailingBit<T : iu32>(T) -> T */
     /* fn firstTrailingBit<N : num, T : iu32>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[341],
+    /* overloads */ &kOverloads[344],
   },
   {
     /* [37] */
     /* fn floor<T : fa_f32_f16>(@test_value(1.5) T) -> T */
     /* fn floor<N : num, T : fa_f32_f16>(@test_value(1.5) vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[343],
+    /* overloads */ &kOverloads[346],
   },
   {
     /* [38] */
     /* fn fma<T : fa_f32_f16>(T, T, T) -> T */
     /* fn fma<N : num, T : fa_f32_f16>(vec<N, T>, vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[345],
+    /* overloads */ &kOverloads[348],
   },
   {
     /* [39] */
     /* fn fract<T : fa_f32_f16>(@test_value(1.25) T) -> T */
     /* fn fract<N : num, T : fa_f32_f16>(@test_value(1.25) vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[347],
+    /* overloads */ &kOverloads[350],
   },
   {
     /* [40] */
     /* fn frexp<T : fa_f32_f16>(T) -> __frexp_result<T> */
     /* fn frexp<N : num, T : fa_f32_f16>(vec<N, T>) -> __frexp_result_vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[349],
+    /* overloads */ &kOverloads[352],
   },
   {
     /* [41] */
     /* fn fwidth(f32) -> f32 */
     /* fn fwidth<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[351],
+    /* overloads */ &kOverloads[354],
   },
   {
     /* [42] */
     /* fn fwidthCoarse(f32) -> f32 */
     /* fn fwidthCoarse<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[353],
+    /* overloads */ &kOverloads[356],
   },
   {
     /* [43] */
     /* fn fwidthFine(f32) -> f32 */
     /* fn fwidthFine<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[355],
+    /* overloads */ &kOverloads[358],
   },
   {
     /* [44] */
     /* fn insertBits<T : iu32>(T, T, u32, u32) -> T */
     /* fn insertBits<N : num, T : iu32>(vec<N, T>, vec<N, T>, u32, u32) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[357],
+    /* overloads */ &kOverloads[360],
   },
   {
     /* [45] */
     /* fn inverseSqrt<T : fa_f32_f16>(T) -> T */
     /* fn inverseSqrt<N : num, T : fa_f32_f16>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[359],
+    /* overloads */ &kOverloads[362],
   },
   {
     /* [46] */
     /* fn ldexp<T : fa_f32_f16, U : ia_i32>(T, U) -> T */
     /* fn ldexp<N : num, T : fa_f32_f16, U : ia_i32>(vec<N, T>, vec<N, U>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[361],
+    /* overloads */ &kOverloads[364],
   },
   {
     /* [47] */
     /* fn length<T : fa_f32_f16>(@test_value(0) T) -> T */
     /* fn length<N : num, T : fa_f32_f16>(@test_value(0) vec<N, T>) -> T */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[363],
+    /* overloads */ &kOverloads[366],
   },
   {
     /* [48] */
     /* fn log<T : fa_f32_f16>(T) -> T */
     /* fn log<N : num, T : fa_f32_f16>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[365],
+    /* overloads */ &kOverloads[368],
   },
   {
     /* [49] */
     /* fn log2<T : fa_f32_f16>(T) -> T */
     /* fn log2<N : num, T : fa_f32_f16>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[367],
+    /* overloads */ &kOverloads[370],
   },
   {
     /* [50] */
     /* fn max<T : fia_fiu32_f16>(T, T) -> T */
     /* fn max<N : num, T : fia_fiu32_f16>(vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[369],
+    /* overloads */ &kOverloads[372],
   },
   {
     /* [51] */
     /* fn min<T : fia_fiu32_f16>(T, T) -> T */
     /* fn min<N : num, T : fia_fiu32_f16>(vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[371],
+    /* overloads */ &kOverloads[374],
   },
   {
     /* [52] */
@@ -14439,104 +14481,104 @@
     /* fn mix<N : num, T : fa_f32_f16>(vec<N, T>, vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* fn mix<N : num, T : fa_f32_f16>(vec<N, T>, vec<N, T>, T) -> vec<N, T> */
     /* num overloads */ 3,
-    /* overloads */ &kOverloads[262],
+    /* overloads */ &kOverloads[265],
   },
   {
     /* [53] */
     /* fn modf<T : fa_f32_f16>(@test_value(-1.5) T) -> __modf_result<T> */
     /* fn modf<N : num, T : fa_f32_f16>(@test_value(-1.5) vec<N, T>) -> __modf_result_vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[373],
+    /* overloads */ &kOverloads[376],
   },
   {
     /* [54] */
     /* fn normalize<N : num, T : fa_f32_f16>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[440],
+    /* overloads */ &kOverloads[443],
   },
   {
     /* [55] */
     /* fn pack2x16float(vec2<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[441],
+    /* overloads */ &kOverloads[444],
   },
   {
     /* [56] */
     /* fn pack2x16snorm(vec2<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[442],
+    /* overloads */ &kOverloads[445],
   },
   {
     /* [57] */
     /* fn pack2x16unorm(vec2<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[443],
+    /* overloads */ &kOverloads[446],
   },
   {
     /* [58] */
     /* fn pack4x8snorm(vec4<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[444],
+    /* overloads */ &kOverloads[447],
   },
   {
     /* [59] */
     /* fn pack4x8unorm(vec4<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[445],
+    /* overloads */ &kOverloads[448],
   },
   {
     /* [60] */
     /* fn pow<T : fa_f32_f16>(T, T) -> T */
     /* fn pow<N : num, T : fa_f32_f16>(vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[375],
+    /* overloads */ &kOverloads[378],
   },
   {
     /* [61] */
     /* fn quantizeToF16(f32) -> f32 */
     /* fn quantizeToF16<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[377],
+    /* overloads */ &kOverloads[380],
   },
   {
     /* [62] */
     /* fn radians<T : fa_f32_f16>(T) -> T */
     /* fn radians<N : num, T : fa_f32_f16>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[379],
+    /* overloads */ &kOverloads[382],
   },
   {
     /* [63] */
     /* fn reflect<N : num, T : fa_f32_f16>(vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[446],
+    /* overloads */ &kOverloads[449],
   },
   {
     /* [64] */
     /* fn refract<N : num, T : fa_f32_f16>(vec<N, T>, vec<N, T>, T) -> vec<N, T> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[447],
+    /* overloads */ &kOverloads[450],
   },
   {
     /* [65] */
     /* fn reverseBits<T : iu32>(T) -> T */
     /* fn reverseBits<N : num, T : iu32>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[381],
+    /* overloads */ &kOverloads[384],
   },
   {
     /* [66] */
     /* fn round<T : fa_f32_f16>(@test_value(3.5) T) -> T */
     /* fn round<N : num, T : fa_f32_f16>(@test_value(3.5) vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[383],
+    /* overloads */ &kOverloads[386],
   },
   {
     /* [67] */
     /* fn saturate<T : fa_f32_f16>(@test_value(2) T) -> T */
     /* fn saturate<T : fa_f32_f16, N : num>(@test_value(2) vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[385],
+    /* overloads */ &kOverloads[388],
   },
   {
     /* [68] */
@@ -14544,124 +14586,124 @@
     /* fn select<T : scalar, N : num>(vec<N, T>, vec<N, T>, bool) -> vec<N, T> */
     /* fn select<N : num, T : scalar>(vec<N, T>, vec<N, T>, vec<N, bool>) -> vec<N, T> */
     /* num overloads */ 3,
-    /* overloads */ &kOverloads[265],
+    /* overloads */ &kOverloads[268],
   },
   {
     /* [69] */
     /* fn sign<T : fia_fi32_f16>(T) -> T */
     /* fn sign<N : num, T : fia_fi32_f16>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[387],
+    /* overloads */ &kOverloads[390],
   },
   {
     /* [70] */
     /* fn sin<T : fa_f32_f16>(@test_value(1.57079632679) T) -> T */
     /* fn sin<N : num, T : fa_f32_f16>(@test_value(1.57079632679) vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[389],
+    /* overloads */ &kOverloads[392],
   },
   {
     /* [71] */
     /* fn sinh<T : fa_f32_f16>(T) -> T */
     /* fn sinh<N : num, T : fa_f32_f16>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[391],
+    /* overloads */ &kOverloads[394],
   },
   {
     /* [72] */
     /* fn smoothstep<T : fa_f32_f16>(@test_value(2) T, @test_value(4) T, @test_value(3) T) -> T */
     /* 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> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[393],
+    /* overloads */ &kOverloads[396],
   },
   {
     /* [73] */
     /* fn sqrt<T : fa_f32_f16>(T) -> T */
     /* fn sqrt<N : num, T : fa_f32_f16>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[395],
+    /* overloads */ &kOverloads[398],
   },
   {
     /* [74] */
     /* fn step<T : fa_f32_f16>(T, T) -> T */
     /* fn step<N : num, T : fa_f32_f16>(vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[397],
+    /* overloads */ &kOverloads[400],
   },
   {
     /* [75] */
     /* fn storageBarrier() */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[448],
+    /* overloads */ &kOverloads[451],
   },
   {
     /* [76] */
     /* fn tan<T : fa_f32_f16>(T) -> T */
     /* fn tan<N : num, T : fa_f32_f16>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[399],
+    /* overloads */ &kOverloads[402],
   },
   {
     /* [77] */
     /* fn tanh<T : fa_f32_f16>(T) -> T */
     /* fn tanh<N : num, T : fa_f32_f16>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[401],
+    /* overloads */ &kOverloads[404],
   },
   {
     /* [78] */
     /* fn transpose<M : num, N : num, T : fa_f32_f16>(mat<M, N, T>) -> mat<N, M, T> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[449],
+    /* overloads */ &kOverloads[452],
   },
   {
     /* [79] */
     /* fn trunc<T : fa_f32_f16>(@test_value(1.5) T) -> T */
     /* fn trunc<N : num, T : fa_f32_f16>(@test_value(1.5) vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[403],
+    /* overloads */ &kOverloads[406],
   },
   {
     /* [80] */
     /* fn unpack2x16float(u32) -> vec2<f32> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[450],
+    /* overloads */ &kOverloads[453],
   },
   {
     /* [81] */
     /* fn unpack2x16snorm(u32) -> vec2<f32> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[451],
+    /* overloads */ &kOverloads[454],
   },
   {
     /* [82] */
     /* fn unpack2x16unorm(u32) -> vec2<f32> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[452],
+    /* overloads */ &kOverloads[455],
   },
   {
     /* [83] */
     /* fn unpack4x8snorm(u32) -> vec4<f32> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[453],
+    /* overloads */ &kOverloads[456],
   },
   {
     /* [84] */
     /* fn unpack4x8unorm(u32) -> vec4<f32> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[454],
+    /* overloads */ &kOverloads[457],
   },
   {
     /* [85] */
     /* fn workgroupBarrier() */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[455],
+    /* overloads */ &kOverloads[458],
   },
   {
     /* [86] */
     /* fn workgroupUniformLoad<T>(ptr<workgroup, T, read_write>) -> T */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[456],
+    /* overloads */ &kOverloads[459],
   },
   {
     /* [87] */
@@ -14710,7 +14752,7 @@
     /* fn textureGather(texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>) -> vec4<f32> */
     /* fn textureGather<A : iu32>(texture: texture_depth_cube_array, sampler: sampler, coords: vec3<f32>, array_index: A) -> vec4<f32> */
     /* num overloads */ 12,
-    /* overloads */ &kOverloads[71],
+    /* overloads */ &kOverloads[72],
   },
   {
     /* [89] */
@@ -14721,7 +14763,7 @@
     /* fn textureGatherCompare(texture: texture_depth_cube, sampler: sampler_comparison, coords: vec3<f32>, depth_ref: f32) -> vec4<f32> */
     /* fn textureGatherCompare<A : iu32>(texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: A, depth_ref: f32) -> vec4<f32> */
     /* num overloads */ 6,
-    /* overloads */ &kOverloads[159],
+    /* overloads */ &kOverloads[162],
   },
   {
     /* [90] */
@@ -14731,7 +14773,7 @@
     /* fn textureNumLayers(texture: texture_depth_cube_array) -> u32 */
     /* fn textureNumLayers<F : texel_format, A : write>(texture: texture_storage_2d_array<F, A>) -> u32 */
     /* num overloads */ 5,
-    /* overloads */ &kOverloads[231],
+    /* overloads */ &kOverloads[234],
   },
   {
     /* [91] */
@@ -14746,14 +14788,14 @@
     /* fn textureNumLevels(texture: texture_depth_cube) -> u32 */
     /* fn textureNumLevels(texture: texture_depth_cube_array) -> u32 */
     /* num overloads */ 10,
-    /* overloads */ &kOverloads[106],
+    /* overloads */ &kOverloads[108],
   },
   {
     /* [92] */
     /* fn textureNumSamples<T : fiu32>(texture: texture_multisampled_2d<T>) -> u32 */
     /* fn textureNumSamples(texture: texture_depth_multisampled_2d) -> u32 */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[405],
+    /* overloads */ &kOverloads[408],
   },
   {
     /* [93] */
@@ -14773,7 +14815,7 @@
     /* fn textureSample(texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>) -> f32 */
     /* fn textureSample<A : iu32>(texture: texture_depth_cube_array, sampler: sampler, coords: vec3<f32>, array_index: A) -> f32 */
     /* num overloads */ 15,
-    /* overloads */ &kOverloads[27],
+    /* overloads */ &kOverloads[43],
   },
   {
     /* [94] */
@@ -14786,7 +14828,7 @@
     /* fn textureSampleBias(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>, bias: f32) -> vec4<f32> */
     /* fn textureSampleBias<A : iu32>(texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: A, bias: f32) -> vec4<f32> */
     /* num overloads */ 8,
-    /* overloads */ &kOverloads[143],
+    /* overloads */ &kOverloads[146],
   },
   {
     /* [95] */
@@ -14797,7 +14839,7 @@
     /* fn textureSampleCompare(texture: texture_depth_cube, sampler: sampler_comparison, coords: vec3<f32>, depth_ref: f32) -> f32 */
     /* fn textureSampleCompare<A : iu32>(texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: A, depth_ref: f32) -> f32 */
     /* num overloads */ 6,
-    /* overloads */ &kOverloads[165],
+    /* overloads */ &kOverloads[168],
   },
   {
     /* [96] */
@@ -14808,7 +14850,7 @@
     /* fn textureSampleCompareLevel(texture: texture_depth_cube, sampler: sampler_comparison, coords: vec3<f32>, depth_ref: f32) -> f32 */
     /* fn textureSampleCompareLevel<A : iu32>(texture: texture_depth_cube_array, sampler: sampler_comparison, coords: vec3<f32>, array_index: A, depth_ref: f32) -> f32 */
     /* num overloads */ 6,
-    /* overloads */ &kOverloads[171],
+    /* overloads */ &kOverloads[174],
   },
   {
     /* [97] */
@@ -14821,7 +14863,7 @@
     /* fn textureSampleGrad(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>, ddx: vec3<f32>, ddy: vec3<f32>) -> vec4<f32> */
     /* 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> */
     /* num overloads */ 8,
-    /* overloads */ &kOverloads[151],
+    /* overloads */ &kOverloads[154],
   },
   {
     /* [98] */
@@ -14840,14 +14882,14 @@
     /* fn textureSampleLevel<L : iu32>(texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>, level: L) -> f32 */
     /* fn textureSampleLevel<A : iu32, L : iu32>(texture: texture_depth_cube_array, sampler: sampler, coords: vec3<f32>, array_index: A, level: L) -> f32 */
     /* num overloads */ 14,
-    /* overloads */ &kOverloads[57],
+    /* overloads */ &kOverloads[58],
   },
   {
     /* [99] */
     /* fn textureSampleBaseClampToEdge(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>) -> vec4<f32> */
     /* fn textureSampleBaseClampToEdge(texture: texture_external, sampler: sampler, coords: vec2<f32>) -> vec4<f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[407],
+    /* overloads */ &kOverloads[410],
   },
   {
     /* [100] */
@@ -14864,7 +14906,7 @@
     /* fn textureStore<C : iu32, A : iu32>(texture: texture_storage_2d_array<u32_texel_format, write>, coords: vec2<C>, array_index: A, value: vec4<u32>) */
     /* fn textureStore<C : iu32>(texture: texture_storage_3d<u32_texel_format, write>, coords: vec3<C>, value: vec4<u32>) */
     /* num overloads */ 12,
-    /* overloads */ &kOverloads[83],
+    /* overloads */ &kOverloads[84],
   },
   {
     /* [101] */
@@ -14878,79 +14920,79 @@
     /* fn textureLoad<C : iu32, S : iu32>(texture: texture_depth_multisampled_2d, coords: vec2<C>, sample_index: S) -> f32 */
     /* fn textureLoad<C : iu32>(texture: texture_external, coords: vec2<C>) -> vec4<f32> */
     /* num overloads */ 9,
-    /* overloads */ &kOverloads[116],
+    /* overloads */ &kOverloads[128],
   },
   {
     /* [102] */
     /* fn atomicLoad<T : iu32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>) -> T */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[457],
+    /* overloads */ &kOverloads[460],
   },
   {
     /* [103] */
     /* fn atomicStore<T : iu32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[458],
+    /* overloads */ &kOverloads[461],
   },
   {
     /* [104] */
     /* fn atomicAdd<T : iu32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[459],
+    /* overloads */ &kOverloads[462],
   },
   {
     /* [105] */
     /* fn atomicSub<T : iu32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[460],
+    /* overloads */ &kOverloads[463],
   },
   {
     /* [106] */
     /* fn atomicMax<T : iu32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[461],
+    /* overloads */ &kOverloads[464],
   },
   {
     /* [107] */
     /* fn atomicMin<T : iu32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[462],
+    /* overloads */ &kOverloads[465],
   },
   {
     /* [108] */
     /* fn atomicAnd<T : iu32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[463],
+    /* overloads */ &kOverloads[466],
   },
   {
     /* [109] */
     /* fn atomicOr<T : iu32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[464],
+    /* overloads */ &kOverloads[467],
   },
   {
     /* [110] */
     /* fn atomicXor<T : iu32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[465],
+    /* overloads */ &kOverloads[468],
   },
   {
     /* [111] */
     /* fn atomicExchange<T : iu32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[466],
+    /* overloads */ &kOverloads[469],
   },
   {
     /* [112] */
     /* fn atomicCompareExchangeWeak<T : iu32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T, T) -> __atomic_compare_exchange_result<T> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[467],
+    /* overloads */ &kOverloads[470],
   },
   {
     /* [113] */
     /* fn _tint_materialize<T>(T) -> T */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[468],
+    /* overloads */ &kOverloads[471],
   },
 };
 
@@ -14960,21 +15002,21 @@
     /* op !(bool) -> bool */
     /* op !<N : num>(vec<N, bool>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[409],
+    /* overloads */ &kOverloads[412],
   },
   {
     /* [1] */
     /* op ~<T : ia_iu32>(T) -> T */
     /* op ~<T : ia_iu32, N : num>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[411],
+    /* overloads */ &kOverloads[414],
   },
   {
     /* [2] */
     /* op -<T : fia_fi32_f16>(T) -> T */
     /* op -<T : fia_fi32_f16, N : num>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[413],
+    /* overloads */ &kOverloads[416],
   },
 };
 constexpr uint8_t kUnaryOperatorNot = 0;
@@ -14990,7 +15032,7 @@
     /* op +<T : fia_fiu32_f16, N : num>(T, vec<N, T>) -> vec<N, T> */
     /* op +<T : fa_f32_f16, N : num, M : num>(mat<N, M, T>, mat<N, M, T>) -> mat<N, M, T> */
     /* num overloads */ 5,
-    /* overloads */ &kOverloads[236],
+    /* overloads */ &kOverloads[239],
   },
   {
     /* [1] */
@@ -15000,7 +15042,7 @@
     /* op -<T : fia_fiu32_f16, N : num>(T, vec<N, T>) -> vec<N, T> */
     /* op -<T : fa_f32_f16, N : num, M : num>(mat<N, M, T>, mat<N, M, T>) -> mat<N, M, T> */
     /* num overloads */ 5,
-    /* overloads */ &kOverloads[241],
+    /* overloads */ &kOverloads[244],
   },
   {
     /* [2] */
@@ -15014,7 +15056,7 @@
     /* op *<T : fa_f32_f16, C : num, R : num>(vec<R, T>, mat<C, R, T>) -> vec<C, T> */
     /* op *<T : fa_f32_f16, K : num, C : num, R : num>(mat<K, R, T>, mat<C, K, T>) -> mat<C, R, T> */
     /* num overloads */ 9,
-    /* overloads */ &kOverloads[125],
+    /* overloads */ &kOverloads[137],
   },
   {
     /* [3] */
@@ -15023,7 +15065,7 @@
     /* op /<T : fia_fiu32_f16, N : num>(vec<N, T>, T) -> vec<N, T> */
     /* op /<T : fia_fiu32_f16, N : num>(T, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 4,
-    /* overloads */ &kOverloads[246],
+    /* overloads */ &kOverloads[249],
   },
   {
     /* [4] */
@@ -15032,14 +15074,14 @@
     /* op %<T : fia_fiu32_f16, N : num>(vec<N, T>, T) -> vec<N, T> */
     /* op %<T : fia_fiu32_f16, N : num>(T, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 4,
-    /* overloads */ &kOverloads[250],
+    /* overloads */ &kOverloads[253],
   },
   {
     /* [5] */
     /* op ^<T : ia_iu32>(T, T) -> T */
     /* op ^<T : ia_iu32, N : num>(vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[415],
+    /* overloads */ &kOverloads[418],
   },
   {
     /* [6] */
@@ -15048,7 +15090,7 @@
     /* op &<T : ia_iu32>(T, T) -> T */
     /* op &<T : ia_iu32, N : num>(vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 4,
-    /* overloads */ &kOverloads[254],
+    /* overloads */ &kOverloads[257],
   },
   {
     /* [7] */
@@ -15057,75 +15099,75 @@
     /* op |<T : ia_iu32>(T, T) -> T */
     /* op |<T : ia_iu32, N : num>(vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 4,
-    /* overloads */ &kOverloads[258],
+    /* overloads */ &kOverloads[261],
   },
   {
     /* [8] */
     /* op &&(bool, bool) -> bool */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[469],
+    /* overloads */ &kOverloads[472],
   },
   {
     /* [9] */
     /* op ||(bool, bool) -> bool */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[470],
+    /* overloads */ &kOverloads[473],
   },
   {
     /* [10] */
     /* op ==<T : scalar>(T, T) -> bool */
     /* op ==<T : scalar, N : num>(vec<N, T>, vec<N, T>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[417],
+    /* overloads */ &kOverloads[420],
   },
   {
     /* [11] */
     /* op !=<T : scalar>(T, T) -> bool */
     /* op !=<T : scalar, N : num>(vec<N, T>, vec<N, T>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[419],
+    /* overloads */ &kOverloads[422],
   },
   {
     /* [12] */
     /* op <<T : fia_fiu32_f16>(T, T) -> bool */
     /* op <<T : fia_fiu32_f16, N : num>(vec<N, T>, vec<N, T>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[421],
+    /* overloads */ &kOverloads[424],
   },
   {
     /* [13] */
     /* op ><T : fia_fiu32_f16>(T, T) -> bool */
     /* op ><T : fia_fiu32_f16, N : num>(vec<N, T>, vec<N, T>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[423],
+    /* overloads */ &kOverloads[426],
   },
   {
     /* [14] */
     /* op <=<T : fia_fiu32_f16>(T, T) -> bool */
     /* op <=<T : fia_fiu32_f16, N : num>(vec<N, T>, vec<N, T>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[425],
+    /* overloads */ &kOverloads[428],
   },
   {
     /* [15] */
     /* op >=<T : fia_fiu32_f16>(T, T) -> bool */
     /* op >=<T : fiu32_f16, N : num>(vec<N, T>, vec<N, T>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[427],
+    /* overloads */ &kOverloads[430],
   },
   {
     /* [16] */
     /* op <<<T : ia_iu32>(T, u32) -> T */
     /* op <<<T : ia_iu32, N : num>(vec<N, T>, vec<N, u32>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[429],
+    /* overloads */ &kOverloads[432],
   },
   {
     /* [17] */
     /* op >><T : ia_iu32>(T, u32) -> T */
     /* op >><T : ia_iu32, N : num>(vec<N, T>, vec<N, u32>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[431],
+    /* overloads */ &kOverloads[434],
   },
 };
 constexpr uint8_t kBinaryOperatorPlus = 0;
@@ -15154,7 +15196,7 @@
     /* ctor i32(i32) -> i32 */
     /* conv i32<T : scalar_no_i32>(T) -> i32 */
     /* num overloads */ 3,
-    /* overloads */ &kOverloads[268],
+    /* overloads */ &kOverloads[271],
   },
   {
     /* [1] */
@@ -15162,7 +15204,7 @@
     /* ctor u32(u32) -> u32 */
     /* conv u32<T : scalar_no_u32>(T) -> u32 */
     /* num overloads */ 3,
-    /* overloads */ &kOverloads[271],
+    /* overloads */ &kOverloads[274],
   },
   {
     /* [2] */
@@ -15170,7 +15212,7 @@
     /* ctor f32(f32) -> f32 */
     /* conv f32<T : scalar_no_f32>(T) -> f32 */
     /* num overloads */ 3,
-    /* overloads */ &kOverloads[274],
+    /* overloads */ &kOverloads[277],
   },
   {
     /* [3] */
@@ -15178,7 +15220,7 @@
     /* ctor f16(f16) -> f16 */
     /* conv f16<T : scalar_no_f16>(T) -> f16 */
     /* num overloads */ 3,
-    /* overloads */ &kOverloads[277],
+    /* overloads */ &kOverloads[280],
   },
   {
     /* [4] */
@@ -15186,10 +15228,11 @@
     /* ctor bool(bool) -> bool */
     /* conv bool<T : scalar_no_bool>(T) -> bool */
     /* num overloads */ 3,
-    /* overloads */ &kOverloads[280],
+    /* overloads */ &kOverloads[283],
   },
   {
     /* [5] */
+    /* ctor vec2() -> vec2<ia> */
     /* ctor vec2<T : concrete_scalar>() -> vec2<T> */
     /* ctor vec2<T : scalar>(vec2<T>) -> vec2<T> */
     /* ctor vec2<T : scalar>(T) -> vec2<T> */
@@ -15199,11 +15242,12 @@
     /* conv vec2<T : i32, U : scalar_no_i32>(vec2<U>) -> vec2<i32> */
     /* conv vec2<T : u32, U : scalar_no_u32>(vec2<U>) -> vec2<u32> */
     /* conv vec2<T : bool, U : scalar_no_bool>(vec2<U>) -> vec2<bool> */
-    /* num overloads */ 9,
-    /* overloads */ &kOverloads[134],
+    /* num overloads */ 10,
+    /* overloads */ &kOverloads[118],
   },
   {
     /* [6] */
+    /* ctor vec3() -> vec3<ia> */
     /* ctor vec3<T : concrete_scalar>() -> vec3<T> */
     /* ctor vec3<T : scalar>(vec3<T>) -> vec3<T> */
     /* ctor vec3<T : scalar>(T) -> vec3<T> */
@@ -15215,11 +15259,12 @@
     /* conv vec3<T : i32, U : scalar_no_i32>(vec3<U>) -> vec3<i32> */
     /* conv vec3<T : u32, U : scalar_no_u32>(vec3<U>) -> vec3<u32> */
     /* conv vec3<T : bool, U : scalar_no_bool>(vec3<U>) -> vec3<bool> */
-    /* num overloads */ 11,
-    /* overloads */ &kOverloads[95],
+    /* num overloads */ 12,
+    /* overloads */ &kOverloads[96],
   },
   {
     /* [7] */
+    /* ctor vec4() -> vec4<ia> */
     /* ctor vec4<T : concrete_scalar>() -> vec4<T> */
     /* ctor vec4<T : scalar>(vec4<T>) -> vec4<T> */
     /* ctor vec4<T : scalar>(T) -> vec4<T> */
@@ -15235,8 +15280,8 @@
     /* conv vec4<T : i32, U : scalar_no_i32>(vec4<U>) -> vec4<i32> */
     /* conv vec4<T : u32, U : scalar_no_u32>(vec4<U>) -> vec4<u32> */
     /* conv vec4<T : bool, U : scalar_no_bool>(vec4<U>) -> vec4<bool> */
-    /* num overloads */ 15,
-    /* overloads */ &kOverloads[42],
+    /* num overloads */ 16,
+    /* overloads */ &kOverloads[27],
   },
   {
     /* [8] */
@@ -15247,7 +15292,7 @@
     /* conv mat2x2<T : f16>(mat2x2<f32>) -> mat2x2<f16> */
     /* conv mat2x2<T : f32>(mat2x2<f16>) -> mat2x2<f32> */
     /* num overloads */ 6,
-    /* overloads */ &kOverloads[177],
+    /* overloads */ &kOverloads[180],
   },
   {
     /* [9] */
@@ -15258,7 +15303,7 @@
     /* conv mat2x3<T : f16>(mat2x3<f32>) -> mat2x3<f16> */
     /* conv mat2x3<T : f32>(mat2x3<f16>) -> mat2x3<f32> */
     /* num overloads */ 6,
-    /* overloads */ &kOverloads[183],
+    /* overloads */ &kOverloads[186],
   },
   {
     /* [10] */
@@ -15269,7 +15314,7 @@
     /* conv mat2x4<T : f16>(mat2x4<f32>) -> mat2x4<f16> */
     /* conv mat2x4<T : f32>(mat2x4<f16>) -> mat2x4<f32> */
     /* num overloads */ 6,
-    /* overloads */ &kOverloads[189],
+    /* overloads */ &kOverloads[192],
   },
   {
     /* [11] */
@@ -15280,7 +15325,7 @@
     /* conv mat3x2<T : f16>(mat3x2<f32>) -> mat3x2<f16> */
     /* conv mat3x2<T : f32>(mat3x2<f16>) -> mat3x2<f32> */
     /* num overloads */ 6,
-    /* overloads */ &kOverloads[195],
+    /* overloads */ &kOverloads[198],
   },
   {
     /* [12] */
@@ -15291,7 +15336,7 @@
     /* conv mat3x3<T : f16>(mat3x3<f32>) -> mat3x3<f16> */
     /* conv mat3x3<T : f32>(mat3x3<f16>) -> mat3x3<f32> */
     /* num overloads */ 6,
-    /* overloads */ &kOverloads[201],
+    /* overloads */ &kOverloads[204],
   },
   {
     /* [13] */
@@ -15302,7 +15347,7 @@
     /* conv mat3x4<T : f16>(mat3x4<f32>) -> mat3x4<f16> */
     /* conv mat3x4<T : f32>(mat3x4<f16>) -> mat3x4<f32> */
     /* num overloads */ 6,
-    /* overloads */ &kOverloads[207],
+    /* overloads */ &kOverloads[210],
   },
   {
     /* [14] */
@@ -15313,7 +15358,7 @@
     /* conv mat4x2<T : f16>(mat4x2<f32>) -> mat4x2<f16> */
     /* conv mat4x2<T : f32>(mat4x2<f16>) -> mat4x2<f32> */
     /* num overloads */ 6,
-    /* overloads */ &kOverloads[213],
+    /* overloads */ &kOverloads[216],
   },
   {
     /* [15] */
@@ -15324,7 +15369,7 @@
     /* conv mat4x3<T : f16>(mat4x3<f32>) -> mat4x3<f16> */
     /* conv mat4x3<T : f32>(mat4x3<f16>) -> mat4x3<f32> */
     /* num overloads */ 6,
-    /* overloads */ &kOverloads[219],
+    /* overloads */ &kOverloads[222],
   },
   {
     /* [16] */
@@ -15335,13 +15380,13 @@
     /* conv mat4x4<T : f16>(mat4x4<f32>) -> mat4x4<f16> */
     /* conv mat4x4<T : f32>(mat4x4<f16>) -> mat4x4<f32> */
     /* num overloads */ 6,
-    /* overloads */ &kOverloads[225],
+    /* overloads */ &kOverloads[228],
   },
   {
     /* [17] */
     /* conv packedVec3<T : concrete_scalar>(vec3<T>) -> packedVec3<T> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[471],
+    /* overloads */ &kOverloads[474],
   },
 };
 
diff --git a/src/tint/resolver/intrinsic_table_test.cc b/src/tint/resolver/intrinsic_table_test.cc
index c842af5..19ead21 100644
--- a/src/tint/resolver/intrinsic_table_test.cc
+++ b/src/tint/resolver/intrinsic_table_test.cc
@@ -841,12 +841,13 @@
     EXPECT_EQ(Diagnostics().str(),
               R"(12:34 error: no matching constructor for vec3(i32, f32, i32)
 
-6 candidate constructors:
+7 candidate constructors:
   vec3(x: T, y: T, z: T) -> vec3<T>  where: T is abstract-int, abstract-float, f32, f16, i32, u32 or bool
   vec3(xy: vec2<T>, z: T) -> vec3<T>  where: T is abstract-int, abstract-float, f32, f16, i32, u32 or bool
   vec3(x: T, yz: vec2<T>) -> vec3<T>  where: T is abstract-int, abstract-float, f32, f16, i32, u32 or bool
   vec3(T) -> vec3<T>  where: T is abstract-int, abstract-float, f32, f16, i32, u32 or bool
   vec3(vec3<T>) -> vec3<T>  where: T is abstract-int, abstract-float, f32, f16, i32, u32 or bool
+  vec3() -> vec3<abstract-int>
   vec3<T>() -> vec3<T>  where: T is f32, f16, i32, u32 or bool
 
 5 candidate conversions:
@@ -867,12 +868,13 @@
     EXPECT_EQ(Diagnostics().str(),
               R"(12:34 error: no matching constructor for vec3<i32>(i32, f32, i32)
 
-6 candidate constructors:
+7 candidate constructors:
   vec3(x: T, y: T, z: T) -> vec3<T>  where: T is abstract-int, abstract-float, f32, f16, i32, u32 or bool
   vec3(x: T, yz: vec2<T>) -> vec3<T>  where: T is abstract-int, abstract-float, f32, f16, i32, u32 or bool
   vec3(T) -> vec3<T>  where: T is abstract-int, abstract-float, f32, f16, i32, u32 or bool
   vec3(xy: vec2<T>, z: T) -> vec3<T>  where: T is abstract-int, abstract-float, f32, f16, i32, u32 or bool
   vec3(vec3<T>) -> vec3<T>  where: T is abstract-int, abstract-float, f32, f16, i32, u32 or bool
+  vec3() -> vec3<abstract-int>
   vec3<T>() -> vec3<T>  where: T is f32, f16, i32, u32 or bool
 
 5 candidate conversions:
@@ -971,9 +973,10 @@
     EXPECT_EQ(Diagnostics().str(),
               R"(12:34 error: no matching constructor for vec3<f32>(array<u32>)
 
-6 candidate constructors:
+7 candidate constructors:
   vec3(vec3<T>) -> vec3<T>  where: T is abstract-int, abstract-float, f32, f16, i32, u32 or bool
   vec3(T) -> vec3<T>  where: T is abstract-int, abstract-float, f32, f16, i32, u32 or bool
+  vec3() -> vec3<abstract-int>
   vec3<T>() -> vec3<T>  where: T is f32, f16, i32, u32 or bool
   vec3(xy: vec2<T>, z: T) -> vec3<T>  where: T is abstract-int, abstract-float, f32, f16, i32, u32 or bool
   vec3(x: T, yz: vec2<T>) -> vec3<T>  where: T is abstract-int, abstract-float, f32, f16, i32, u32 or bool
diff --git a/src/tint/resolver/resolver.cc b/src/tint/resolver/resolver.cc
index 1ec680d..19571a7 100644
--- a/src/tint/resolver/resolver.cc
+++ b/src/tint/resolver/resolver.cc
@@ -3466,15 +3466,33 @@
 
 bool Resolver::DiagnosticControl(const ast::DiagnosticControl& control) {
     Mark(control.rule_name);
+    Mark(control.rule_name->name);
+    auto name = control.rule_name->name->symbol.Name();
 
-    auto rule_name = control.rule_name->symbol.Name();
-    auto rule = builtin::ParseDiagnosticRule(rule_name);
-    if (rule != builtin::DiagnosticRule::kUndefined) {
+    if (control.rule_name->category) {
+        Mark(control.rule_name->category);
+        if (control.rule_name->category->symbol.Name() == "chromium") {
+            auto rule = builtin::ParseChromiumDiagnosticRule(name);
+            if (rule != builtin::ChromiumDiagnosticRule::kUndefined) {
+                validator_.DiagnosticFilters().Set(rule, control.severity);
+            } else {
+                utils::StringStream ss;
+                ss << "unrecognized diagnostic rule 'chromium." << name << "'\n";
+                utils::SuggestAlternatives(name, builtin::kChromiumDiagnosticRuleStrings, ss,
+                                           "chromium.");
+                AddWarning(ss.str(), control.rule_name->source);
+            }
+        }
+        return true;
+    }
+
+    auto rule = builtin::ParseCoreDiagnosticRule(name);
+    if (rule != builtin::CoreDiagnosticRule::kUndefined) {
         validator_.DiagnosticFilters().Set(rule, control.severity);
     } else {
         utils::StringStream ss;
-        ss << "unrecognized diagnostic rule '" << rule_name << "'\n";
-        utils::SuggestAlternatives(rule_name, builtin::kDiagnosticRuleStrings, ss);
+        ss << "unrecognized diagnostic rule '" << name << "'\n";
+        utils::SuggestAlternatives(name, builtin::kCoreDiagnosticRuleStrings, ss);
         AddWarning(ss.str(), control.rule_name->source);
     }
     return true;
diff --git a/src/tint/resolver/uniformity.cc b/src/tint/resolver/uniformity.cc
index fc84826..45c919e 100644
--- a/src/tint/resolver/uniformity.cc
+++ b/src/tint/resolver/uniformity.cc
@@ -1563,7 +1563,7 @@
                            builtin->Type() == builtin::Function::kTextureSampleCompare) {
                     // Get the severity of derivative uniformity violations in this context.
                     auto severity = sem_.DiagnosticSeverity(
-                        call, builtin::DiagnosticRule::kDerivativeUniformity);
+                        call, builtin::CoreDiagnosticRule::kDerivativeUniformity);
                     if (severity != builtin::DiagnosticSeverity::kOff) {
                         callsite_tag = {CallSiteTag::CallSiteRequiredToBeUniform, severity};
                     }
diff --git a/src/tint/resolver/validator.cc b/src/tint/resolver/validator.cc
index f72000b..97eae88 100644
--- a/src/tint/resolver/validator.cc
+++ b/src/tint/resolver/validator.cc
@@ -159,9 +159,9 @@
       atomic_composite_info_(atomic_composite_info),
       valid_type_storage_layouts_(valid_type_storage_layouts) {
     // Set default severities for filterable diagnostic rules.
-    diagnostic_filters_.Set(builtin::DiagnosticRule::kDerivativeUniformity,
+    diagnostic_filters_.Set(builtin::CoreDiagnosticRule::kDerivativeUniformity,
                             builtin::DiagnosticSeverity::kError);
-    diagnostic_filters_.Set(builtin::DiagnosticRule::kChromiumUnreachableCode,
+    diagnostic_filters_.Set(builtin::ChromiumDiagnosticRule::kUnreachableCode,
                             builtin::DiagnosticSeverity::kWarning);
 }
 
@@ -1417,7 +1417,7 @@
 bool Validator::Statements(utils::VectorRef<const ast::Statement*> stmts) const {
     for (auto* stmt : stmts) {
         if (!sem_.Get(stmt)->IsReachable()) {
-            if (!AddDiagnostic(builtin::DiagnosticRule::kChromiumUnreachableCode,
+            if (!AddDiagnostic(builtin::ChromiumDiagnosticRule::kUnreachableCode,
                                "code is unreachable", stmt->source)) {
                 return false;
             }
@@ -2530,9 +2530,12 @@
                                    const char* use) const {
     // Make sure that no two diagnostic controls conflict.
     // They conflict if the rule name is the same and the severity is different.
-    utils::Hashmap<Symbol, const ast::DiagnosticControl*, 8> diagnostics;
+    utils::Hashmap<std::pair<Symbol, Symbol>, const ast::DiagnosticControl*, 8> diagnostics;
     for (auto* dc : controls) {
-        auto diag_added = diagnostics.Add(dc->rule_name->symbol, dc);
+        auto category = dc->rule_name->category ? dc->rule_name->category->symbol : Symbol();
+        auto name = dc->rule_name->name->symbol;
+
+        auto diag_added = diagnostics.Add(std::make_pair(category, name), dc);
         if (!diag_added && (*diag_added.value)->severity != dc->severity) {
             {
                 utils::StringStream ss;
@@ -2541,8 +2544,8 @@
             }
             {
                 utils::StringStream ss;
-                ss << "severity of '" << dc->rule_name->symbol.Name() << "' set to '"
-                   << dc->severity << "' here";
+                ss << "severity of '" << dc->rule_name->String() << "' set to '" << dc->severity
+                   << "' here";
                 AddNote(ss.str(), (*diag_added.value)->rule_name->source);
             }
             return false;
diff --git a/src/tint/resolver/value_constructor_validation_test.cc b/src/tint/resolver/value_constructor_validation_test.cc
index 21603fe..772b9c1 100644
--- a/src/tint/resolver/value_constructor_validation_test.cc
+++ b/src/tint/resolver/value_constructor_validation_test.cc
@@ -2299,11 +2299,26 @@
     EXPECT_EQ(TypeOf(vec4_f16)->As<type::Vector>()->Width(), 4u);
 }
 
-TEST_F(ResolverValueConstructorValidationTest, CannotInferVectorElementTypeWithoutArgs) {
-    WrapInFunction(Call(Source{{12, 34}}, "vec3"));
+TEST_F(ResolverValueConstructorValidationTest, InferVecNoArgs) {
+    auto* v2 = vec2<Infer>();
+    auto* v3 = vec3<Infer>();
+    auto* v4 = vec4<Infer>();
 
-    EXPECT_FALSE(r()->Resolve());
-    EXPECT_THAT(r()->error(), HasSubstr("12:34 error: no matching constructor for vec3()"));
+    GlobalConst("v2", v2);
+    GlobalConst("v3", v3);
+    GlobalConst("v4", v4);
+
+    ASSERT_TRUE(r()->Resolve()) << r()->error();
+
+    ASSERT_TRUE(TypeOf(v2)->Is<type::Vector>());
+    ASSERT_TRUE(TypeOf(v3)->Is<type::Vector>());
+    ASSERT_TRUE(TypeOf(v4)->Is<type::Vector>());
+    EXPECT_TRUE(TypeOf(v2)->As<type::Vector>()->type()->Is<type::AbstractInt>());
+    EXPECT_TRUE(TypeOf(v3)->As<type::Vector>()->type()->Is<type::AbstractInt>());
+    EXPECT_TRUE(TypeOf(v4)->As<type::Vector>()->type()->Is<type::AbstractInt>());
+    EXPECT_EQ(TypeOf(v2)->As<type::Vector>()->Width(), 2u);
+    EXPECT_EQ(TypeOf(v3)->As<type::Vector>()->Width(), 3u);
+    EXPECT_EQ(TypeOf(v4)->As<type::Vector>()->Width(), 4u);
 }
 
 TEST_F(ResolverValueConstructorValidationTest, CannotInferVec2ElementTypeFromScalarsMismatch) {
diff --git a/src/tint/sem/diagnostic_severity_test.cc b/src/tint/sem/diagnostic_severity_test.cc
index 9d36ea2..a378add 100644
--- a/src/tint/sem/diagnostic_severity_test.cc
+++ b/src/tint/sem/diagnostic_severity_test.cc
@@ -23,27 +23,27 @@
 
 class DiagnosticSeverityTest : public TestHelper {
   protected:
-    /// Create a program with two functions, setting the severity for "chromium_unreachable_code"
+    /// Create a program with two functions, setting the severity for "chromium.unreachable_code"
     /// using an attribute. Test that we correctly track the severity of the filter for the
     /// functions and the statements with them.
-    /// @param global_severity the global severity of the "chromium_unreachable_code" filter
+    /// @param global_severity the global severity of the "chromium.unreachable_code" filter
     void Run(builtin::DiagnosticSeverity global_severity) {
-        // @diagnostic(off, chromium_unreachable_code)
+        // @diagnostic(off, chromium.unreachable_code)
         // fn foo() {
-        //   @diagnostic(info, chromium_unreachable_code) {
-        //     @diagnostic(error, chromium_unreachable_code)
-        //     if (true) @diagnostic(warning, chromium_unreachable_code) {
+        //   @diagnostic(info, chromium.unreachable_code) {
+        //     @diagnostic(error, chromium.unreachable_code)
+        //     if (true) @diagnostic(warning, chromium.unreachable_code) {
         //       return;
         //     } else if (false) {
         //       return;
-        //     } else @diagnostic(info, chromium_unreachable_code) {
+        //     } else @diagnostic(info, chromium.unreachable_code) {
         //       return;
         //     }
         //     return;
         //
-        //     @diagnostic(error, chromium_unreachable_code)
-        //     switch (42) @diagnostic(off, chromium_unreachable_code) {
-        //       case 0 @diagnostic(warning, chromium_unreachable_code) {
+        //     @diagnostic(error, chromium.unreachable_code)
+        //     switch (42) @diagnostic(off, chromium.unreachable_code) {
+        //       case 0 @diagnostic(warning, chromium.unreachable_code) {
         //         return;
         //       }
         //       default {
@@ -51,21 +51,21 @@
         //       }
         //     }
         //
-        //     @diagnostic(error, chromium_unreachable_code)
-        //     for (var i = 0; false; i++) @diagnostic(warning, chromium_unreachable_code) {
+        //     @diagnostic(error, chromium.unreachable_code)
+        //     for (var i = 0; false; i++) @diagnostic(warning, chromium.unreachable_code) {
         //       return;
         //     }
         //
-        //     @diagnostic(warning, chromium_unreachable_code)
-        //     loop @diagnostic(off, chromium_unreachable_code) {
+        //     @diagnostic(warning, chromium.unreachable_code)
+        //     loop @diagnostic(off, chromium.unreachable_code) {
         //       return;
-        //       continuing @diagnostic(info, chromium_unreachable_code) {
+        //       continuing @diagnostic(info, chromium.unreachable_code) {
         //         break if true;
         //       }
         //     }
         //
-        //     @diagnostic(error, chromium_unreachable_code)
-        //     while (false) @diagnostic(warning, chromium_unreachable_code) {
+        //     @diagnostic(error, chromium.unreachable_code)
+        //     while (false) @diagnostic(warning, chromium.unreachable_code) {
         //       return;
         //     }
         //   }
@@ -74,7 +74,7 @@
         // fn bar() {
         //   return;
         // }
-        auto rule = builtin::DiagnosticRule::kChromiumUnreachableCode;
+        auto rule = builtin::ChromiumDiagnosticRule::kUnreachableCode;
         auto func_severity = builtin::DiagnosticSeverity::kOff;
         auto block_severity = builtin::DiagnosticSeverity::kInfo;
         auto if_severity = builtin::DiagnosticSeverity::kError;
@@ -91,7 +91,7 @@
         auto while_severity = builtin::DiagnosticSeverity::kError;
         auto while_body_severity = builtin::DiagnosticSeverity::kWarning;
         auto attr = [&](auto severity) {
-            return utils::Vector{DiagnosticAttribute(severity, "chromium_unreachable_code")};
+            return utils::Vector{DiagnosticAttribute(severity, "chromium", "unreachable_code")};
         };
 
         auto* return_foo_if = Return();
@@ -123,7 +123,7 @@
                          attr(while_severity));
         auto* block_1 =
             Block(utils::Vector{if_foo, return_foo_block, swtch, fl, l, wl}, attr(block_severity));
-        auto* func_attr = DiagnosticAttribute(func_severity, "chromium_unreachable_code");
+        auto* func_attr = DiagnosticAttribute(func_severity, "chromium", "unreachable_code");
         auto* foo = Func("foo", {}, ty.void_(), utils::Vector{block_1}, utils::Vector{func_attr});
 
         auto* return_bar = Return();
@@ -173,7 +173,7 @@
 };
 
 TEST_F(DiagnosticSeverityTest, WithDirective) {
-    DiagnosticDirective(builtin::DiagnosticSeverity::kError, "chromium_unreachable_code");
+    DiagnosticDirective(builtin::DiagnosticSeverity::kError, "chromium", "unreachable_code");
     Run(builtin::DiagnosticSeverity::kError);
 }
 
diff --git a/src/tint/symbol.cc b/src/tint/symbol.cc
index 7e69b5d..ad84add 100644
--- a/src/tint/symbol.cc
+++ b/src/tint/symbol.cc
@@ -21,7 +21,9 @@
 Symbol::Symbol() = default;
 
 Symbol::Symbol(uint32_t val, tint::ProgramID pid, std::string_view name)
-    : val_(val), program_id_(pid), name_(name) {}
+    : val_(val), program_id_(pid), name_(name) {
+    DetermineBuiltinType();
+}
 
 Symbol::Symbol(const Symbol& o) = default;
 
@@ -60,4 +62,51 @@
     return std::string(name_);
 }
 
+void Symbol::DetermineBuiltinType() {
+    if (auto builtin_fn = builtin::ParseFunction(name_); builtin_fn != builtin::Function::kNone) {
+        builtin_type_ = BuiltinType::kFunction;
+        builtin_value_ = builtin_fn;
+        return;
+    }
+    if (auto builtin_ty = builtin::ParseBuiltin(name_);
+        builtin_ty != builtin::Builtin::kUndefined) {
+        builtin_type_ = BuiltinType::kBuiltin;
+        builtin_value_ = builtin_ty;
+        return;
+    }
+    if (auto builtin_val = builtin::ParseBuiltinValue(name_);
+        builtin_val != builtin::BuiltinValue::kUndefined) {
+        builtin_type_ = BuiltinType::kBuiltinValue;
+        builtin_value_ = builtin_val;
+        return;
+    }
+    if (auto addr = builtin::ParseAddressSpace(name_); addr != builtin::AddressSpace::kUndefined) {
+        builtin_type_ = BuiltinType::kAddressSpace;
+        builtin_value_ = addr;
+        return;
+    }
+    if (auto fmt = builtin::ParseTexelFormat(name_); fmt != builtin::TexelFormat::kUndefined) {
+        builtin_type_ = BuiltinType::kTexelFormat;
+        builtin_value_ = fmt;
+        return;
+    }
+    if (auto access = builtin::ParseAccess(name_); access != builtin::Access::kUndefined) {
+        builtin_type_ = BuiltinType::kAccess;
+        builtin_value_ = access;
+        return;
+    }
+    if (auto i_type = builtin::ParseInterpolationType(name_);
+        i_type != builtin::InterpolationType::kUndefined) {
+        builtin_type_ = BuiltinType::kInterpolationType;
+        builtin_value_ = i_type;
+        return;
+    }
+    if (auto i_smpl = builtin::ParseInterpolationSampling(name_);
+        i_smpl != builtin::InterpolationSampling::kUndefined) {
+        builtin_type_ = BuiltinType::kInterpolationSampling;
+        builtin_value_ = i_smpl;
+        return;
+    }
+}
+
 }  // namespace tint
diff --git a/src/tint/symbol.h b/src/tint/symbol.h
index 16d8409..ae29559 100644
--- a/src/tint/symbol.h
+++ b/src/tint/symbol.h
@@ -16,7 +16,16 @@
 #define SRC_TINT_SYMBOL_H_
 
 #include <string>
+#include <variant>
 
+#include "src/tint/builtin/access.h"
+#include "src/tint/builtin/address_space.h"
+#include "src/tint/builtin/builtin.h"
+#include "src/tint/builtin/builtin_value.h"
+#include "src/tint/builtin/function.h"
+#include "src/tint/builtin/interpolation_sampling.h"
+#include "src/tint/builtin/interpolation_type.h"
+#include "src/tint/builtin/texel_format.h"
 #include "src/tint/program_id.h"
 
 namespace tint {
@@ -24,6 +33,28 @@
 /// A symbol representing a string in the system
 class Symbol {
   public:
+    /// The type of builtin this symbol could represent, if any.
+    enum class BuiltinType {
+        /// No builtin matched
+        kNone = 0,
+        /// Builtin function
+        kFunction,
+        /// Builtin
+        kBuiltin,
+        /// Builtin value
+        kBuiltinValue,
+        /// Address space
+        kAddressSpace,
+        /// Texel format
+        kTexelFormat,
+        /// Access
+        kAccess,
+        /// Interpolation Type
+        kInterpolationType,
+        /// Interpolation Sampling
+        kInterpolationSampling,
+    };
+
     /// Constructor
     /// An invalid symbol
     Symbol();
@@ -87,10 +118,33 @@
     /// @returns the identifier of the Program that owns this symbol.
     tint::ProgramID ProgramID() const { return program_id_; }
 
+    /// @returns the builtin type
+    BuiltinType Type() const { return builtin_type_; }
+
+    /// @returns the builtin value
+    template <typename T>
+    T BuiltinValue() const {
+        return std::get<T>(builtin_value_);
+    }
+
   private:
+    void DetermineBuiltinType();
+
     uint32_t val_ = static_cast<uint32_t>(-1);
     tint::ProgramID program_id_;
     std::string_view name_;
+
+    BuiltinType builtin_type_ = BuiltinType::kNone;
+    std::variant<std::monostate,
+                 builtin::Function,
+                 builtin::Builtin,
+                 builtin::BuiltinValue,
+                 builtin::AddressSpace,
+                 builtin::TexelFormat,
+                 builtin::Access,
+                 builtin::InterpolationType,
+                 builtin::InterpolationSampling>
+        builtin_value_ = {};
 };
 
 /// @param sym the Symbol
diff --git a/src/tint/transform/renamer.cc b/src/tint/transform/renamer.cc
index bd74cf6..14b8c12 100644
--- a/src/tint/transform/renamer.cc
+++ b/src/tint/transform/renamer.cc
@@ -1289,10 +1289,16 @@
                 }
             },
             [&](const ast::DiagnosticAttribute* diagnostic) {
-                preserved_identifiers.Add(diagnostic->control.rule_name);
+                if (auto* category = diagnostic->control.rule_name->category) {
+                    preserved_identifiers.Add(category);
+                }
+                preserved_identifiers.Add(diagnostic->control.rule_name->name);
             },
             [&](const ast::DiagnosticDirective* diagnostic) {
-                preserved_identifiers.Add(diagnostic->control.rule_name);
+                if (auto* category = diagnostic->control.rule_name->category) {
+                    preserved_identifiers.Add(category);
+                }
+                preserved_identifiers.Add(diagnostic->control.rule_name->name);
             },
             [&](const ast::IdentifierExpression* expr) {
                 Switch(
diff --git a/src/tint/transform/renamer_test.cc b/src/tint/transform/renamer_test.cc
index fc34251..cd321fb 100644
--- a/src/tint/transform/renamer_test.cc
+++ b/src/tint/transform/renamer_test.cc
@@ -192,9 +192,9 @@
     EXPECT_THAT(data->remappings, ContainerEq(expected_remappings));
 }
 
-TEST_F(RenamerTest, PreserveDiagnosticControls) {
+TEST_F(RenamerTest, PreserveCoreDiagnosticRuleName) {
     auto* src = R"(
-diagnostic(off, unreachable_code);
+diagnostic(off, chromium.unreachable_code);
 
 @diagnostic(off, derivative_uniformity)
 @fragment
@@ -208,7 +208,7 @@
 )";
 
     auto* expect = R"(
-diagnostic(off, unreachable_code);
+diagnostic(off, chromium.unreachable_code);
 
 @diagnostic(off, derivative_uniformity) @fragment
 fn tint_symbol(@location(0) tint_symbol_1 : f32) -> @location(0) f32 {
diff --git a/src/tint/utils/hash.h b/src/tint/utils/hash.h
index 8c9dd25..a63a303 100644
--- a/src/tint/utils/hash.h
+++ b/src/tint/utils/hash.h
@@ -134,7 +134,15 @@
     }
 };
 
-/// Hasher specialization for std::tuple
+/// Hasher specialization for std::pair
+template <typename A, typename B>
+struct Hasher<std::pair<A, B>> {
+    /// @param tuple the tuple to hash
+    /// @returns a hash of the tuple
+    size_t operator()(const std::pair<A, B>& tuple) const { return std::apply(Hash<A, B>, tuple); }
+};
+
+/// Hasher specialization for std::variant
 template <typename... TYPES>
 struct Hasher<std::variant<TYPES...>> {
     /// @param variant the variant to hash
diff --git a/src/tint/utils/math.h b/src/tint/utils/math.h
index c10a2c9..311ec16 100644
--- a/src/tint/utils/math.h
+++ b/src/tint/utils/math.h
@@ -15,6 +15,8 @@
 #ifndef SRC_TINT_UTILS_MATH_H_
 #define SRC_TINT_UTILS_MATH_H_
 
+#include <stdint.h>
+
 #include <string>
 #include <type_traits>
 
diff --git a/src/tint/utils/string.cc b/src/tint/utils/string.cc
index 2f28a3e..67eaf2b 100644
--- a/src/tint/utils/string.cc
+++ b/src/tint/utils/string.cc
@@ -50,7 +50,8 @@
 
 void SuggestAlternatives(std::string_view got,
                          Slice<char const* const> strings,
-                         utils::StringStream& ss) {
+                         utils::StringStream& ss,
+                         std::string_view prefix /* = "" */) {
     // If the string typed was within kSuggestionDistance of one of the possible enum values,
     // suggest that. Don't bother with suggestions if the string was extremely long.
     constexpr size_t kSuggestionDistance = 5;
@@ -66,7 +67,7 @@
             }
         }
         if (candidate) {
-            ss << "Did you mean '" << candidate << "'?\n";
+            ss << "Did you mean '" << prefix << candidate << "'?\n";
         }
     }
 
@@ -76,7 +77,7 @@
         if (str != strings[0]) {
             ss << ", ";
         }
-        ss << "'" << str << "'";
+        ss << "'" << prefix << str << "'";
     }
 }
 
diff --git a/src/tint/utils/string.h b/src/tint/utils/string.h
index 5c7255d..897d1a1 100644
--- a/src/tint/utils/string.h
+++ b/src/tint/utils/string.h
@@ -72,9 +72,11 @@
 /// @param got the unrecognized string
 /// @param strings the list of possible values
 /// @param ss the stream to write the suggest and list of possible values to
+/// @param prefix the prefix to apply to the strings when printing (optional)
 void SuggestAlternatives(std::string_view got,
                          Slice<char const* const> strings,
-                         utils::StringStream& ss);
+                         utils::StringStream& ss,
+                         std::string_view prefix = "");
 
 }  // namespace tint::utils
 
diff --git a/src/tint/utils/unicode.cc b/src/tint/utils/unicode.cc
index 65a003a..eac220c 100644
--- a/src/tint/utils/unicode.cc
+++ b/src/tint/utils/unicode.cc
@@ -336,6 +336,10 @@
     if (len < 1) {
         return {};
     }
+    // Fast-path ASCII characters as they're always valid
+    if (ptr[0] <= 0x7f) {
+        return {CodePoint{ptr[0]}, 1};
+    }
 
     // Lookup table for the first byte of a UTF-8 sequence.
     // 0 indicates an invalid length.
diff --git a/src/tint/writer/syntax_tree/generator_impl.cc b/src/tint/writer/syntax_tree/generator_impl.cc
index be30289..08ca8c5 100644
--- a/src/tint/writer/syntax_tree/generator_impl.cc
+++ b/src/tint/writer/syntax_tree/generator_impl.cc
@@ -66,7 +66,7 @@
 
 void GeneratorImpl::EmitDiagnosticControl(const ast::DiagnosticControl& diagnostic) {
     line() << "DiagnosticControl [severity: " << diagnostic.severity
-           << ", rule: " << diagnostic.rule_name->symbol.Name() << "]";
+           << ", rule: " << diagnostic.rule_name->String() << "]";
 }
 
 void GeneratorImpl::EmitEnable(const ast::Enable* enable) {
diff --git a/src/tint/writer/wgsl/generator_impl.cc b/src/tint/writer/wgsl/generator_impl.cc
index 2a2f0e7..2703e8d 100644
--- a/src/tint/writer/wgsl/generator_impl.cc
+++ b/src/tint/writer/wgsl/generator_impl.cc
@@ -82,8 +82,7 @@
 
 void GeneratorImpl::EmitDiagnosticControl(utils::StringStream& out,
                                           const ast::DiagnosticControl& diagnostic) {
-    out << "diagnostic(" << diagnostic.severity << ", " << diagnostic.rule_name->symbol.Name()
-        << ")";
+    out << "diagnostic(" << diagnostic.severity << ", " << diagnostic.rule_name->String() << ")";
 }
 
 void GeneratorImpl::EmitEnable(const ast::Enable* enable) {
diff --git a/src/tint/writer/wgsl/generator_impl_diagnostic_test.cc b/src/tint/writer/wgsl/generator_impl_diagnostic_test.cc
index 2a2f4b6..2aeab09 100644
--- a/src/tint/writer/wgsl/generator_impl_diagnostic_test.cc
+++ b/src/tint/writer/wgsl/generator_impl_diagnostic_test.cc
@@ -22,25 +22,25 @@
 using WgslGeneratorImplTest = TestHelper;
 
 TEST_F(WgslGeneratorImplTest, Emit_DiagnosticDirective) {
-    DiagnosticDirective(builtin::DiagnosticSeverity::kError, "chromium_unreachable_code");
+    DiagnosticDirective(builtin::DiagnosticSeverity::kError, "chromium", "unreachable_code");
 
     GeneratorImpl& gen = Build();
     gen.Generate();
     EXPECT_THAT(gen.Diagnostics(), testing::IsEmpty());
-    EXPECT_EQ(gen.result(), R"(diagnostic(error, chromium_unreachable_code);
+    EXPECT_EQ(gen.result(), R"(diagnostic(error, chromium.unreachable_code);
 
 )");
 }
 
 TEST_F(WgslGeneratorImplTest, Emit_DiagnosticAttribute) {
     auto* attr =
-        DiagnosticAttribute(builtin::DiagnosticSeverity::kError, "chromium_unreachable_code");
+        DiagnosticAttribute(builtin::DiagnosticSeverity::kError, "chromium", "unreachable_code");
     Func("foo", {}, ty.void_(), {}, utils::Vector{attr});
 
     GeneratorImpl& gen = Build();
     gen.Generate();
     EXPECT_THAT(gen.Diagnostics(), testing::IsEmpty());
-    EXPECT_EQ(gen.result(), R"(@diagnostic(error, chromium_unreachable_code)
+    EXPECT_EQ(gen.result(), R"(@diagnostic(error, chromium.unreachable_code)
 fn foo() {
 }
 )");