[ir] Validate switch case has selectors.
Add IR validation that a switch case statement selector list is not
empty.
Fixed: 452981138
Change-Id: Icd36e969acbabd32bb9ca91fb0fbb0c9246cd33e
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/267794
Auto-Submit: dan sinclair <dsinclair@chromium.org>
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Commit-Queue: James Price <jrprice@google.com>
diff --git a/src/tint/lang/core/ir/validator.cc b/src/tint/lang/core/ir/validator.cc
index 2ae0c67..7f63e9b5 100644
--- a/src/tint/lang/core/ir/validator.cc
+++ b/src/tint/lang/core/ir/validator.cc
@@ -4255,8 +4255,11 @@
AddError(s) << "case block must be a block";
}
- QueueBlock(cse.block);
+ if (cse.selectors.IsEmpty()) {
+ AddError(s) << "case does not have any selectors";
+ }
+ QueueBlock(cse.block);
for (const auto& sel : cse.selectors) {
if (sel.IsDefault()) {
if (found_default) {
diff --git a/src/tint/lang/core/ir/validator_flow_control_test.cc b/src/tint/lang/core/ir/validator_flow_control_test.cc
index 81e7c2a..20760bd 100644
--- a/src/tint/lang/core/ir/validator_flow_control_test.cc
+++ b/src/tint/lang/core/ir/validator_flow_control_test.cc
@@ -2306,6 +2306,33 @@
)")) << res.Failure();
}
+TEST_F(IR_ValidatorTest, Switch_CaseNoSelectors) {
+ auto* f = b.Function("my_func", ty.void_());
+
+ b.Append(f->Block(), [&] {
+ auto* s = b.Switch(1_i);
+ b.Append(b.DefaultCase(s), [&] { b.ExitSwitch(s); });
+
+ s->Cases().Push({});
+
+ auto* blk = b.Block();
+ blk->SetParent(s);
+ b.Append(blk, [&] { b.ExitSwitch(s); });
+
+ s->Cases().Back().block = blk;
+
+ b.Return(f);
+ });
+
+ auto res = ir::Validate(mod);
+ ASSERT_NE(res, Success);
+ EXPECT_THAT(res.Failure().reason,
+ testing::HasSubstr(R"(:3:5 error: switch: case does not have any selectors
+ switch 1i [c: (default, $B2), c: (, $B3)] { # switch_1
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+)")) << res.Failure();
+}
+
TEST_F(IR_ValidatorTest, Loop_PtrResult) {
auto* f = b.Function("my_func", ty.void_());
b.Append(f->Block(), [&] {