Make case selectors an integer value
Change-Id: I819983701ed6cca4eba1a05b4edc5fdff10fa88d
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/22542
Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/reader/wgsl/parser_impl.cc b/src/reader/wgsl/parser_impl.cc
index 038e397..89edc77 100644
--- a/src/reader/wgsl/parser_impl.cc
+++ b/src/reader/wgsl/parser_impl.cc
@@ -1856,13 +1856,19 @@
ast::CaseSelectorList selectors;
for (;;) {
+ auto t = peek();
auto cond = const_literal();
if (has_error())
return {};
if (cond == nullptr)
break;
+ if (!cond->IsInt()) {
+ set_error(t, "invalid case selector must be an integer value");
+ return {};
+ }
- selectors.push_back(std::move(cond));
+ std::unique_ptr<ast::IntLiteral> selector(cond.release()->AsInt());
+ selectors.push_back(std::move(selector));
}
return selectors;
diff --git a/src/reader/wgsl/parser_impl_switch_body_test.cc b/src/reader/wgsl/parser_impl_switch_body_test.cc
index c9458fd..3a68dd5 100644
--- a/src/reader/wgsl/parser_impl_switch_body_test.cc
+++ b/src/reader/wgsl/parser_impl_switch_body_test.cc
@@ -41,6 +41,14 @@
EXPECT_EQ(p->error(), "1:6: unable to parse case selectors");
}
+TEST_F(ParserImplTest, SwitchBody_Case_InvalidSelector_bool) {
+ auto* p = parser("case true: { a = 4; }");
+ auto e = p->switch_body();
+ ASSERT_TRUE(p->has_error());
+ ASSERT_EQ(e, nullptr);
+ EXPECT_EQ(p->error(), "1:6: invalid case selector must be an integer value");
+}
+
TEST_F(ParserImplTest, SwitchBody_Case_MissingConstLiteral) {
auto* p = parser("case: { a = 4; }");
auto e = p->switch_body();