[ir] Validate that struct member type cannot be void
Fixes a fuzzer crash.
Fixed: 441827881
Change-Id: I7e36d5d39c8aab2a50fa31d6cf5aba99c0c7838a
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/260136
Commit-Queue: James Price <jrprice@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/core/ir/validator.cc b/src/tint/lang/core/ir/validator.cc
index 2bf4d92..5554898 100644
--- a/src/tint/lang/core/ir/validator.cc
+++ b/src/tint/lang/core/ir/validator.cc
@@ -1910,6 +1910,10 @@
<< member->Type()->Size();
return false;
}
+ if (member->Type()->Is<core::type::Void>()) {
+ diag() << "struct member " << member->Index() << " cannot have void type";
+ return false;
+ }
}
return true;
},
diff --git a/src/tint/lang/core/ir/validator_type_test.cc b/src/tint/lang/core/ir/validator_type_test.cc
index fe4b4bd..17aa8f2 100644
--- a/src/tint/lang/core/ir/validator_type_test.cc
+++ b/src/tint/lang/core/ir/validator_type_test.cc
@@ -253,6 +253,23 @@
)")) << res.Failure();
}
+TEST_F(IR_ValidatorTest, StructMember_Void) {
+ auto* str_ty =
+ ty.Struct(mod.symbols.New("MyStruct"), {
+ {mod.symbols.New("v"), ty.void_(), {}},
+ });
+ auto* v = b.Var(ty.ptr(private_, str_ty));
+ mod.root_block->Append(v);
+
+ auto res = ir::Validate(mod);
+ ASSERT_NE(res, Success);
+ EXPECT_THAT(res.Failure().reason,
+ testing::HasSubstr(R"(:6:3 error: var: struct member 0 cannot have void type
+ %1:ptr<private, MyStruct, read_write> = var undef
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+)")) << res.Failure();
+}
+
TEST_F(IR_ValidatorTest, FunctionParam_InvalidAddressSpaceForHandleType) {
auto* type = ty.ptr(AddressSpace::kFunction, ty.sampler());
auto* fn = b.Function("my_func", ty.void_());