[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());