[spirv-reader][ir] Guard against unhandled decorations for types.

In the type creation, assert that we've handled all of the provided
decorations. Currently they're just skipped, so it's hard to tell if
we're missing support. None of the decorations are handled yet, just an
assertion that we don't see any we haven't handled.

Bug: 391485267
Change-Id: I2fb152bc8a85319ea61c513ae1f853dcfb78474c
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/247694
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/spirv/reader/parser/atomics_test.cc b/src/tint/lang/spirv/reader/parser/atomics_test.cc
index 28f51de..4f5dd32 100644
--- a/src/tint/lang/spirv/reader/parser/atomics_test.cc
+++ b/src/tint/lang/spirv/reader/parser/atomics_test.cc
@@ -117,7 +117,8 @@
     EXPECT_DEATH_IF_SUPPORTED({ auto _ = Run(src); }, "internal compiler error");
 }
 
-TEST_F(SpirvParserDeathTest, AtomicSMin_u32) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParserDeathTest, DISABLED_AtomicSMin_u32) {
     auto src = R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -155,7 +156,8 @@
     EXPECT_DEATH_IF_SUPPORTED({ auto _ = Run(src); }, "internal compiler error");
 }
 
-TEST_F(SpirvParserDeathTest, AtomicSMax_u32) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParserDeathTest, DISABLED_AtomicSMax_u32) {
     auto src = R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -193,7 +195,8 @@
     EXPECT_DEATH_IF_SUPPORTED({ auto _ = Run(src); }, "internal compiler error");
 }
 
-TEST_F(SpirvParserDeathTest, AtomicUMin_i32) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParserDeathTest, DISABLED_AtomicUMin_i32) {
     auto src = R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -852,7 +855,8 @@
 )");
 }
 
-TEST_F(SpirvParser_AtomicsTest, AtomicAdd) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParser_AtomicsTest, DISABLED_AtomicAdd) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -925,7 +929,8 @@
 )");
 }
 
-TEST_F(SpirvParser_AtomicsTest, AtomicSub) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParser_AtomicsTest, DISABLED_AtomicSub) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -998,7 +1003,8 @@
 )");
 }
 
-TEST_F(SpirvParser_AtomicsTest, AtomicAnd) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParser_AtomicsTest, DISABLED_AtomicAnd) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -1071,7 +1077,8 @@
 )");
 }
 
-TEST_F(SpirvParser_AtomicsTest, AtomicOr) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParser_AtomicsTest, DISABLED_AtomicOr) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -1144,7 +1151,8 @@
 )");
 }
 
-TEST_F(SpirvParser_AtomicsTest, AtomicXor) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParser_AtomicsTest, DISABLED_AtomicXor) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -1217,7 +1225,8 @@
 )");
 }
 
-TEST_F(SpirvParser_AtomicsTest, AtomicMax) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParser_AtomicsTest, DISABLED_AtomicMax) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -1290,7 +1299,8 @@
 )");
 }
 
-TEST_F(SpirvParser_AtomicsTest, AtomicMin) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParser_AtomicsTest, DISABLED_AtomicMin) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -1363,7 +1373,8 @@
 )");
 }
 
-TEST_F(SpirvParser_AtomicsTest, AtomicExchange) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParser_AtomicsTest, DISABLED_AtomicExchange) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -1436,7 +1447,8 @@
 )");
 }
 
-TEST_F(SpirvParser_AtomicsTest, AtomicCompareExchange) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParser_AtomicsTest, DISABLED_AtomicCompareExchange) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -1509,7 +1521,8 @@
 )");
 }
 
-TEST_F(SpirvParser_AtomicsTest, AtomicLoad) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParser_AtomicsTest, DISABLED_AtomicLoad) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -1582,7 +1595,8 @@
 )");
 }
 
-TEST_F(SpirvParser_AtomicsTest, AtomicStore) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParser_AtomicsTest, DISABLED_AtomicStore) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -1655,7 +1669,8 @@
 )");
 }
 
-TEST_F(SpirvParser_AtomicsTest, AtomicDecrement) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParser_AtomicsTest, DISABLED_AtomicDecrement) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -1728,7 +1743,8 @@
 )");
 }
 
-TEST_F(SpirvParser_AtomicsTest, AtomicIncrement) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParser_AtomicsTest, DISABLED_AtomicIncrement) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -2234,7 +2250,8 @@
 )");
 }
 
-TEST_F(SpirvParser_AtomicsTest, ReplaceAssignsAndDecls_StructOfArray) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParser_AtomicsTest, DISABLED_ReplaceAssignsAndDecls_StructOfArray) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -2309,7 +2326,8 @@
 )");
 }
 
-TEST_F(SpirvParser_AtomicsTest, ReplaceAssignsAndDecls_Let) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParser_AtomicsTest, DISABLED_ReplaceAssignsAndDecls_Let) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
diff --git a/src/tint/lang/spirv/reader/parser/function_test.cc b/src/tint/lang/spirv/reader/parser/function_test.cc
index 41622bc..c2175f8 100644
--- a/src/tint/lang/spirv/reader/parser/function_test.cc
+++ b/src/tint/lang/spirv/reader/parser/function_test.cc
@@ -226,7 +226,8 @@
 )");
 }
 
-TEST_F(SpirvParserTest, VertexShader_PositionUnused_Struct) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParserTest, DISABLED_VertexShader_PositionUnused_Struct) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -263,7 +264,8 @@
 )");
 }
 
-TEST_F(SpirvParserTest, VertexShader_PositionUsed_Struct) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParserTest, DISABLED_VertexShader_PositionUsed_Struct) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpMemoryModel Logical GLSL450
diff --git a/src/tint/lang/spirv/reader/parser/memory_test.cc b/src/tint/lang/spirv/reader/parser/memory_test.cc
index 2c4fa2c..c8e0d05 100644
--- a/src/tint/lang/spirv/reader/parser/memory_test.cc
+++ b/src/tint/lang/spirv/reader/parser/memory_test.cc
@@ -30,7 +30,8 @@
 namespace tint::spirv::reader {
 namespace {
 
-TEST_F(SpirvParserTest, ArrayLength_FromVar) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParserTest, DISABLED_ArrayLength_FromVar) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -80,7 +81,8 @@
 )");
 }
 
-TEST_F(SpirvParserTest, ArrayLength_FromCopyObject) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParserTest, DISABLED_ArrayLength_FromCopyObject) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -132,7 +134,8 @@
 )");
 }
 
-TEST_F(SpirvParserTest, ArrayLength_FromAccessChain) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParserTest, DISABLED_ArrayLength_FromAccessChain) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -396,7 +399,8 @@
 )");
 }
 
-TEST_F(SpirvParserTest, Store_RuntimeArrayElement) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParserTest, DISABLED_Store_RuntimeArrayElement) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -1383,7 +1387,8 @@
 )");
 }
 
-TEST_F(SpirvParserTest, StorageBufferAccessMode) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParserTest, DISABLED_StorageBufferAccessMode) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
diff --git a/src/tint/lang/spirv/reader/parser/parser.cc b/src/tint/lang/spirv/reader/parser/parser.cc
index d7f4828..5aeaee9 100644
--- a/src/tint/lang/spirv/reader/parser/parser.cc
+++ b/src/tint/lang/spirv/reader/parser/parser.cc
@@ -477,6 +477,19 @@
             }
         }
 
+        // TODO(crbug.com/1907): Handle decorations that affect the type
+        for (auto& deco : type->decorations()) {
+            switch (spv::Decoration(deco[0])) {
+                case spv::Decoration::SpecId: {
+                    // TODO(dsinclair): Trick clang, remove when actual decorations added
+                    break;
+                }
+                default: {
+                    TINT_UNIMPLEMENTED() << " unhandled type decoration " << deco[0];
+                }
+            }
+        }
+
         return types_.GetOrAdd(TypeKey{type, key_mode}, [&]() -> const core::type::Type* {
             switch (type->kind()) {
                 case spvtools::opt::analysis::Type::kVoid: {
@@ -651,8 +664,6 @@
         const uint64_t count_val = count_const->GetZeroExtendedValue();
         TINT_ASSERT(count_val <= UINT32_MAX);
 
-        // TODO(crbug.com/1907): Handle decorations that affect the array layout.
-
         return ty_.array(Type(arr_ty->element_type()), static_cast<uint32_t>(count_val));
     }
 
diff --git a/src/tint/lang/spirv/reader/parser/var_test.cc b/src/tint/lang/spirv/reader/parser/var_test.cc
index 9a87cd7..546eb14 100644
--- a/src/tint/lang/spirv/reader/parser/var_test.cc
+++ b/src/tint/lang/spirv/reader/parser/var_test.cc
@@ -142,7 +142,8 @@
 )");
 }
 
-TEST_F(SpirvParserTest, StorageVar_ReadOnly) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParserTest, DISABLED_StorageVar_ReadOnly) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -182,7 +183,8 @@
 )");
 }
 
-TEST_F(SpirvParserTest, StorageVar_ReadWrite) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParserTest, DISABLED_StorageVar_ReadWrite) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -221,7 +223,8 @@
 )");
 }
 
-TEST_F(SpirvParserTest, StorageVar_ReadOnly_And_ReadWrite) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParserTest, DISABLED_StorageVar_ReadOnly_And_ReadWrite) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
@@ -265,7 +268,8 @@
 )");
 }
 
-TEST_F(SpirvParserTest, UniformVar) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParserTest, DISABLED_UniformVar) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -1273,7 +1277,8 @@
 )");
 }
 
-TEST_F(SpirvParserTest, Var_OpSpecConstantComposite_struct_Mixed) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvParserTest, DISABLED_Var_OpSpecConstantComposite_struct_Mixed) {
     EXPECT_IR(R"(
                OpCapability Shader
                OpExtension "SPV_KHR_storage_buffer_storage_class"
diff --git a/src/tint/lang/spirv/reader/reader_test.cc b/src/tint/lang/spirv/reader/reader_test.cc
index 28cf6d6..5b297f2 100644
--- a/src/tint/lang/spirv/reader/reader_test.cc
+++ b/src/tint/lang/spirv/reader/reader_test.cc
@@ -264,7 +264,8 @@
 )");
 }
 
-TEST_F(SpirvReaderTest, ClipDistances) {
+// TODO(dsinclair): Requires `ArrayStride` decoration support
+TEST_F(SpirvReaderTest, DISABLED_ClipDistances) {
     auto got = Run(R"(
                OpCapability Shader
                OpCapability ClipDistance
@@ -362,7 +363,8 @@
 )");
 }
 
-TEST_F(SpirvReaderTest, ClipDistances_gl_PerVertex) {
+// TODO(dsinclair): Requires `Block` decoration support
+TEST_F(SpirvReaderTest, DISABLED_ClipDistances_gl_PerVertex) {
     auto got = Run(R"(
                OpCapability Shader
                OpCapability ClipDistance