Explorar el Código

spirv: fix crash when no initializer can be made (#5127)

* spirv: fix crash when no initializer can be made

When an initializer can't be implemented, an error should be emitted.
Because we deref a pointer without checking for error, we simply crash,
preventing the diagnostic message to be shown.
(Fixing #5124 crash)

Signed-off-by: Nathan Gauër <[email protected]>
Nathan Gauër hace 2 años
padre
commit
d0c4285ddc

+ 4 - 0
tools/clang/lib/SPIRV/SpirvEmitter.cpp

@@ -5833,6 +5833,10 @@ SpirvInstruction *SpirvEmitter::doInitListExpr(const InitListExpr *expr,
   SourceRange range =
       (rangeOverride != SourceRange()) ? rangeOverride : expr->getSourceRange();
   auto *result = InitListHandler(astContext, *this).processInit(expr, range);
+  if (result == nullptr) {
+    return nullptr;
+  }
+
   result->setRValue();
   return result;
 }

+ 9 - 0
tools/clang/test/CodeGenSPIRV/type.rasterizer-ordered-texture-2d.unimplemented.hlsl

@@ -0,0 +1,9 @@
+// RUN: %dxc -T ps_6_6 -E main
+RasterizerOrderedTexture2D<uint> rot;
+
+static const struct {
+  // CHECK: error: initializer for type 'RasterizerOrderedTexture2D<unsigned int>' unimplemented
+	RasterizerOrderedTexture2D<uint> rot_field;
+} cstruct = {rot};
+
+void main() { }

+ 4 - 0
tools/clang/unittests/SPIRV/CodeGenSpirvTest.cpp

@@ -108,6 +108,10 @@ TEST_F(FileTest, BindlessConstantBufferArrayType) {
 TEST_F(FileTest, EnumType) { runFileTest("type.enum.hlsl"); }
 TEST_F(FileTest, TBufferType) { runFileTest("type.tbuffer.hlsl"); }
 TEST_F(FileTest, TextureBufferType) { runFileTest("type.texture-buffer.hlsl"); }
+TEST_F(FileTest, RasterizerOrderedTexture2DType) {
+  runFileTest("type.rasterizer-ordered-texture-2d.unimplemented.hlsl",
+              Expect::Failure);
+}
 TEST_F(FileTest, StructuredBufferType) {
   runFileTest("type.structured-buffer.hlsl");
 }