ソースを参照

[SPIR-V] Forward replacement expression for SubstNonTypeTemplateParmExpr. (#5020)

Laura Hermanns 2 年 前
コミット
15a44e0d41

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

@@ -1129,6 +1129,9 @@ SpirvInstruction *SpirvEmitter::doExpr(const Expr *expr,
       result = curThis;
   } else if (const auto *unaryExpr = dyn_cast<UnaryExprOrTypeTraitExpr>(expr)) {
     result = doUnaryExprOrTypeTraitExpr(unaryExpr);
+  } else if (const auto *tmplParamExpr =
+                 dyn_cast<SubstNonTypeTemplateParmExpr>(expr)) {
+    result = doExpr(tmplParamExpr->getReplacement());
   } else {
     emitError("expression class '%0' unimplemented", expr->getExprLoc())
         << expr->getStmtClassName() << expr->getSourceRange();

+ 13 - 0
tools/clang/test/CodeGenSPIRV/fn.template.arg.substitute.hlsl

@@ -0,0 +1,13 @@
+// RUN: %dxc -T ps_6_0 -E main -HV 2021
+
+template <bool B1>
+bool fnTemplate(bool B2) {
+  return !B1 && B2;
+}
+
+// CHECK:  %10 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+// CHECK:  %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+// CHECK: %main = OpFunction %void None %17
+float4 main(int val : A) : SV_Target {
+  return fnTemplate<false>(val != 0) ? (float4)1 : (float4)0;
+}