diff --git a/tools/clang/lib/SPIRV/SpirvEmitter.cpp b/tools/clang/lib/SPIRV/SpirvEmitter.cpp index 0251e4eb5e..c14dc1e6d6 100644 --- a/tools/clang/lib/SPIRV/SpirvEmitter.cpp +++ b/tools/clang/lib/SPIRV/SpirvEmitter.cpp @@ -8861,6 +8861,11 @@ const Expr *SpirvEmitter::collectArrayStructIndices( } } else if (castExpr->getCastKind() == CK_UncheckedDerivedToBase || castExpr->getCastKind() == CK_HLSLDerivedToBase) { + // First the indices for the sub expression. + const Expr *base = + collectArrayStructIndices(castExpr->getSubExpr(), rawIndex, + rawIndices, indices, isMSOutAttribute); + llvm::SmallVector BaseIdx; getBaseClassIndices(castExpr, &BaseIdx); if (rawIndex) { @@ -8871,8 +8876,7 @@ const Expr *SpirvEmitter::collectArrayStructIndices( llvm::APInt(32, Idx))); } - return collectArrayStructIndices(castExpr->getSubExpr(), rawIndex, - rawIndices, indices, isMSOutAttribute); + return base; } return collectArrayStructIndices(castExpr->getSubExpr(), rawIndex, rawIndices, indices, isMSOutAttribute); diff --git a/tools/clang/test/CodeGenSPIRV/spirv-codegen-struct-inheritance.hlsl b/tools/clang/test/CodeGenSPIRV/spirv-codegen-struct-inheritance.hlsl new file mode 100644 index 0000000000..af18ad960e --- /dev/null +++ b/tools/clang/test/CodeGenSPIRV/spirv-codegen-struct-inheritance.hlsl @@ -0,0 +1,25 @@ +// RUN: %dxc -T cs_6_0 -E main -spirv %s | FileCheck %s + +struct X { int a1; }; +struct Y : X { int2 a2; }; +struct Z { + X xs[2]; + Y y; +}; + +cbuffer CBStructs : register(b0) { + Z z; +}; +RWStructuredBuffer Out : register(u1); + +[numthreads(1,1,1)] +void main() { +// CHECK: OpAccessChain +// CHECK-SAME: %_ptr_Uniform_int +// CHECK-SAME: %CBStructs +// CHECK-SAME: %int_0 +// CHECK-SAME: %int_1 +// CHECK-SAME: %int_0 +// CHECK-SAME: %int_0 + Out[0] = z.y.a1; +}