resolver: Fix ICE when using a builtin as a type

Bug: chromium:1308209
Change-Id: I779d7fcb4a32640663077cb2176875f6081098a0
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/84260
Reviewed-by: James Price <jrprice@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
diff --git a/src/tint/resolver/resolver.cc b/src/tint/resolver/resolver.cc
index 5c7e36a..bb05c9d 100644
--- a/src/tint/resolver/resolver.cc
+++ b/src/tint/resolver/resolver.cc
@@ -275,6 +275,14 @@
               return nullptr;
             },
             [&](Default) {
+              if (auto* tn = ty->As<ast::TypeName>()) {
+                if (IsBuiltin(tn->name)) {
+                  auto name = builder_->Symbols().NameFor(tn->name);
+                  AddError("cannot use builtin '" + name + "' as type",
+                           ty->source);
+                  return nullptr;
+                }
+              }
               TINT_UNREACHABLE(Resolver, diagnostics_)
                   << "Unhandled resolved type '"
                   << (resolved ? resolved->TypeInfo().name : "<null>")
diff --git a/src/tint/resolver/type_validation_test.cc b/src/tint/resolver/type_validation_test.cc
index 179f064..64f0658 100644
--- a/src/tint/resolver/type_validation_test.cc
+++ b/src/tint/resolver/type_validation_test.cc
@@ -705,6 +705,14 @@
 note: 'f' declared here)");
 }
 
+TEST_F(ResolverTypeValidationTest, BuiltinAsType) {
+  // var<private> v : max;
+  Global("v", ty.type_name("max"), ast::StorageClass::kPrivate);
+
+  EXPECT_FALSE(r()->Resolve());
+  EXPECT_EQ(r()->error(), "error: cannot use builtin 'max' as type");
+}
+
 namespace GetCanonicalTests {
 struct Params {
   builder::ast_type_func_ptr create_ast_type;