[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(), [&] {