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