[ir] Validate that Switch only has a single default Fixes a ClusterFuzz issue. Fixed: 450576722 Change-Id: I7958f4f15c094e037e46638a8944924a078944ef Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/266914 Commit-Queue: Antonio Maiorano <amaiorano@google.com> Auto-Submit: James Price <jrprice@google.com> Commit-Queue: James Price <jrprice@google.com> Reviewed-by: Antonio Maiorano <amaiorano@google.com>
diff --git a/src/tint/lang/core/ir/validator.cc b/src/tint/lang/core/ir/validator.cc index e875f44..ff799e0 100644 --- a/src/tint/lang/core/ir/validator.cc +++ b/src/tint/lang/core/ir/validator.cc
@@ -4252,6 +4252,9 @@ for (const auto& sel : cse.selectors) { if (sel.IsDefault()) { + if (found_default) { + AddError(s) << "multiple default selectors in switch"; + } found_default = true; } }
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 4063936..81e7c2a 100644 --- a/src/tint/lang/core/ir/validator_flow_control_test.cc +++ b/src/tint/lang/core/ir/validator_flow_control_test.cc
@@ -2233,6 +2233,23 @@ )")) << res.Failure(); } +TEST_F(IR_ValidatorTest, Switch_MultipleDefaultCases) { + auto* f = b.Function("f", ty.void_()); + b.Append(f->Block(), [&] { + auto* s = b.Switch(1_i); + auto* case1 = b.DefaultCase(s); + b.Append(case1, [&] { b.ExitSwitch(s); }); + auto* case2 = b.DefaultCase(s); + b.Append(case2, [&] { b.ExitSwitch(s); }); + b.Return(f); + }); + + auto res = ir::Validate(mod); + ASSERT_NE(res, Success); + EXPECT_THAT(res.Failure().reason, + testing::HasSubstr("error: switch: multiple default selectors in switch")); +} + TEST_F(IR_ValidatorTest, Switch_NoCondition) { auto* f = b.Function("my_func", ty.void_());