[tint][ir][val] Reject functions with multi-in root blocks
Fixes: 377716453
Change-Id: I6f009c2e861847172f7176e8b4a9e8dd937108f7
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/214097
Commit-Queue: James Price <jrprice@google.com>
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: Ryan Harrison <rharrison@chromium.org>
Auto-Submit: Ryan Harrison <rharrison@chromium.org>
diff --git a/src/tint/lang/core/ir/validator.cc b/src/tint/lang/core/ir/validator.cc
index e467b07..6ee5008 100644
--- a/src/tint/lang/core/ir/validator.cc
+++ b/src/tint/lang/core/ir/validator.cc
@@ -1799,6 +1799,16 @@
scope_stack_.Push();
TINT_DEFER(scope_stack_.Pop());
+ if (!func->Block()) {
+ AddError(func) << "root block for function is undefined";
+ return;
+ }
+
+ if (func->Block()->Is<ir::MultiInBlock>()) {
+ AddError(func) << "root block for function cannot be a multi-in block";
+ return;
+ }
+
Hashset<const FunctionParam*, 4> param_set{};
for (auto* param : func->Params()) {
if (!param->Alive()) {
diff --git a/src/tint/lang/core/ir/validator_test.cc b/src/tint/lang/core/ir/validator_test.cc
index 01b25b8..5f030e1 100644
--- a/src/tint/lang/core/ir/validator_test.cc
+++ b/src/tint/lang/core/ir/validator_test.cc
@@ -290,6 +290,27 @@
)");
}
+TEST_F(IR_ValidatorTest, Function_MultinBlock) {
+ auto* f = b.Function("my_func", ty.void_());
+ f->SetBlock(b.MultiInBlock());
+ f->Block()->Append(b.Return(f));
+
+ auto res = ir::Validate(mod);
+ ASSERT_NE(res, Success);
+ EXPECT_EQ(res.Failure().reason.Str(),
+ R"(:1:1 error: root block for function cannot be a multi-in block
+%my_func = func():void {
+^^^^^^^^
+
+note: # Disassembly
+%my_func = func():void {
+ $B1: {
+ ret
+ }
+}
+)");
+}
+
TEST_F(IR_ValidatorTest, Function_DeadParameter) {
auto* f = b.Function("my_func", ty.void_());
auto* p = b.FunctionParam("my_param", ty.f32());