[wgsl-reader] Disallow explicit storage classes on handle types
Downstream users have all caught up to the change.
Remove the "uniform_constant" token from the WGSL parser.
Fixed: tint:332
Change-Id: I046f93d5e6c26b89d419763e73b1ca583250570f
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/45462
Auto-Submit: James Price <jrprice@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
diff --git a/fuzzers/dictionary.txt b/fuzzers/dictionary.txt
index baccbb8..d139434 100644
--- a/fuzzers/dictionary.txt
+++ b/fuzzers/dictionary.txt
@@ -101,7 +101,6 @@
"type"
"u32"
"uniform"
-"uniform_constant"
"var"
"vec2"
"vec3"
diff --git a/src/reader/wgsl/lexer.cc b/src/reader/wgsl/lexer.cc
index 76cc3e9..4ce36f0 100644
--- a/src/reader/wgsl/lexer.cc
+++ b/src/reader/wgsl/lexer.cc
@@ -673,8 +673,6 @@
return {Token::Type::kU32, source, "u32"};
if (str == "uniform")
return {Token::Type::kUniform, source, "uniform"};
- if (str == "uniform_constant")
- return {Token::Type::kUniformConstant, source, "uniform_constant"};
if (str == "var")
return {Token::Type::kVar, source, "var"};
if (str == "vec2")
diff --git a/src/reader/wgsl/lexer_test.cc b/src/reader/wgsl/lexer_test.cc
index 5d01df1..1d80b29 100644
--- a/src/reader/wgsl/lexer_test.cc
+++ b/src/reader/wgsl/lexer_test.cc
@@ -518,7 +518,6 @@
TokenData{"type", Token::Type::kType},
TokenData{"u32", Token::Type::kU32},
TokenData{"uniform", Token::Type::kUniform},
- TokenData{"uniform_constant", Token::Type::kUniformConstant},
TokenData{"var", Token::Type::kVar},
TokenData{"vec2", Token::Type::kVec2},
TokenData{"vec3", Token::Type::kVec3},
diff --git a/src/reader/wgsl/parser_impl.cc b/src/reader/wgsl/parser_impl.cc
index 6010c47..53036cb 100644
--- a/src/reader/wgsl/parser_impl.cc
+++ b/src/reader/wgsl/parser_impl.cc
@@ -459,7 +459,12 @@
if (decl->type->UnwrapAll()->is_handle()) {
// handle types implicitly have the `UniformConstant` storage class.
- // TODO(jrprice): Produce an error if an explicit storage class is provided.
+ if (explicit_sc.matched) {
+ return add_error(
+ explicit_sc.source,
+ decl->type->UnwrapAll()->FriendlyName(builder_.Symbols()) +
+ " variables must not have a storage class");
+ }
sc = ast::StorageClass::kUniformConstant;
}
@@ -1049,7 +1054,6 @@
// | OUTPUT
// | UNIFORM
// | WORKGROUP
-// | UNIFORM_CONSTANT
// | STORAGE
// | IMAGE
// | PRIVATE
@@ -1070,9 +1074,6 @@
if (match(Token::Type::kWorkgroup))
return {ast::StorageClass::kWorkgroup, source};
- if (match(Token::Type::kUniformConstant))
- return {ast::StorageClass::kUniformConstant, source};
-
if (match(Token::Type::kStorage))
return {ast::StorageClass::kStorage, source};
diff --git a/src/reader/wgsl/parser_impl_error_msg_test.cc b/src/reader/wgsl/parser_impl_error_msg_test.cc
index 00cd58f..4dd4871 100644
--- a/src/reader/wgsl/parser_impl_error_msg_test.cc
+++ b/src/reader/wgsl/parser_impl_error_msg_test.cc
@@ -1110,8 +1110,7 @@
" ^\n");
}
-TEST_F(ParserImplErrorTest, DISABLED_GlobalDeclSamplerExplicitStorageClass) {
- // TODO(jrprice): Enable this once downstream users have caught up.
+TEST_F(ParserImplErrorTest, GlobalDeclSamplerExplicitStorageClass) {
EXPECT(
"var<uniform> x : sampler;",
"test.wgsl:1:5 error: sampler variables must not have a storage class\n"
@@ -1119,13 +1118,12 @@
" ^^^^^^^\n");
}
-TEST_F(ParserImplErrorTest, DISABLED_GlobalDeclTextureExplicitStorageClass) {
- // TODO(jrprice): Enable this once downstream users have caught up.
- EXPECT(
- "var<uniform> x : [[access(read)]] texture_1d<f32>;",
- "test.wgsl:1:5 error: texture variables must not have a storage class\n"
- "var<uniform> x : [[access(read)]] texture_1d<f32>;\n"
- " ^^^^^^^\n");
+TEST_F(ParserImplErrorTest, GlobalDeclTextureExplicitStorageClass) {
+ EXPECT("var<uniform> x : [[access(read)]] texture_1d<f32>;",
+ "test.wgsl:1:5 error: texture_1d<f32> variables must not have a "
+ "storage class\n"
+ "var<uniform> x : [[access(read)]] texture_1d<f32>;\n"
+ " ^^^^^^^\n");
}
TEST_F(ParserImplErrorTest, IfStmtMissingLParen) {
diff --git a/src/reader/wgsl/parser_impl_storage_class_test.cc b/src/reader/wgsl/parser_impl_storage_class_test.cc
index 13fce4a..2f5ad3a 100644
--- a/src/reader/wgsl/parser_impl_storage_class_test.cc
+++ b/src/reader/wgsl/parser_impl_storage_class_test.cc
@@ -50,8 +50,6 @@
StorageClassData{"out", ast::StorageClass::kOutput},
StorageClassData{"uniform", ast::StorageClass::kUniform},
StorageClassData{"workgroup", ast::StorageClass::kWorkgroup},
- StorageClassData{"uniform_constant",
- ast::StorageClass::kUniformConstant},
StorageClassData{"storage", ast::StorageClass::kStorage},
StorageClassData{"storage_buffer", ast::StorageClass::kStorage},
StorageClassData{"image", ast::StorageClass::kImage},
diff --git a/src/reader/wgsl/parser_impl_variable_storage_decoration_test.cc b/src/reader/wgsl/parser_impl_variable_storage_decoration_test.cc
index a015b33..889f631 100644
--- a/src/reader/wgsl/parser_impl_variable_storage_decoration_test.cc
+++ b/src/reader/wgsl/parser_impl_variable_storage_decoration_test.cc
@@ -52,8 +52,6 @@
VariableStorageData{"out", ast::StorageClass::kOutput},
VariableStorageData{"uniform", ast::StorageClass::kUniform},
VariableStorageData{"workgroup", ast::StorageClass::kWorkgroup},
- VariableStorageData{"uniform_constant",
- ast::StorageClass::kUniformConstant},
VariableStorageData{"storage", ast::StorageClass::kStorage},
VariableStorageData{"storage_buffer", ast::StorageClass::kStorage},
VariableStorageData{"image", ast::StorageClass::kImage},
diff --git a/src/reader/wgsl/token.cc b/src/reader/wgsl/token.cc
index 9f8b28d..cf28d6e 100644
--- a/src/reader/wgsl/token.cc
+++ b/src/reader/wgsl/token.cc
@@ -297,8 +297,6 @@
return "u32";
case Token::Type::kUniform:
return "uniform";
- case Token::Type::kUniformConstant:
- return "uniform_constant";
case Token::Type::kVar:
return "var";
case Token::Type::kVec2:
diff --git a/src/reader/wgsl/token.h b/src/reader/wgsl/token.h
index 13e582e..e7de5da 100644
--- a/src/reader/wgsl/token.h
+++ b/src/reader/wgsl/token.h
@@ -305,8 +305,6 @@
kU32,
/// A 'uniform'
kUniform,
- /// A 'uniform_constant'
- kUniformConstant,
/// A 'var'
kVar,
/// A 'vec2'
@@ -664,8 +662,6 @@
bool IsU32() const { return type_ == Type::kU32; }
/// @returns true if token is a 'uniform'
bool IsUniform() const { return type_ == Type::kUniform; }
- /// @returns true if token is a 'uniform_constant'
- bool IsUniformConstant() const { return type_ == Type::kUniformConstant; }
/// @returns true if token is a 'var'
bool IsVar() const { return type_ == Type::kVar; }
/// @returns true if token is a 'vec2'