spirv-reader: reject empty structure types

SPIR-V supports them but WGSL does not.

Fixed: chromium:1230976
Change-Id: I27dbbf4a0f584bcff7355bf513bbd2b924dc349b
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/62922
Auto-Submit: David Neto <dneto@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: James Price <jrprice@google.com>
diff --git a/src/reader/spirv/parser_impl.cc b/src/reader/spirv/parser_impl.cc
index 43886bd..bec3e4a 100644
--- a/src/reader/spirv/parser_impl.cc
+++ b/src/reader/spirv/parser_impl.cc
@@ -1089,6 +1089,11 @@
   // Compute members
   ast::StructMemberList ast_members;
   const auto members = struct_ty->element_types();
+  if (members.empty()) {
+    Fail() << "WGSL does not support empty structures. can't convert type: "
+           << def_use_mgr_->GetDef(type_id)->PrettyPrint();
+    return nullptr;
+  }
   TypeList ast_member_types;
   unsigned num_non_writable_members = 0;
   for (uint32_t member_index = 0; member_index < members.size();
diff --git a/src/reader/spirv/parser_impl_convert_type_test.cc b/src/reader/spirv/parser_impl_convert_type_test.cc
index acf2048..6757647 100644
--- a/src/reader/spirv/parser_impl_convert_type_test.cc
+++ b/src/reader/spirv/parser_impl_convert_type_test.cc
@@ -568,6 +568,19 @@
               Eq("invalid array type ID 10: multiple ArrayStride decorations"));
 }
 
+TEST_F(SpvParserTest, ConvertType_StructEmpty) {
+  auto p = parser(test::Assemble(Preamble() + R"(
+    %10 = OpTypeStruct
+  )" + MainBody()));
+  EXPECT_TRUE(p->BuildInternalModule());
+
+  auto* type = p->ConvertType(10);
+  EXPECT_EQ(type, nullptr);
+  EXPECT_EQ(p->error(),
+            "WGSL does not support empty structures. can't convert type: %10 = "
+            "OpTypeStruct");
+}
+
 TEST_F(SpvParserTest, ConvertType_StructTwoMembers) {
   auto p = parser(test::Assemble(Preamble() + R"(
     %uint = OpTypeInt 32 0