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;