Explorar o código

Skip decl which don't have init when ScanConstInitList. (#155)

Xiang Li %!s(int64=8) %!d(string=hai) anos
pai
achega
d712e7e651

+ 2 - 0
tools/clang/lib/CodeGen/CGHLSLMS.cpp

@@ -4416,6 +4416,8 @@ static bool ScanConstInitList(CodeGenModule &CGM, InitListExpr *E,
         return false;
     } else if (DeclRefExpr *ref = dyn_cast<DeclRefExpr>(init)) {
       if (VarDecl *D = dyn_cast<VarDecl>(ref->getDecl())) {
+        if (!D->hasInit())
+          return false;
         if (Constant *initVal = CGM.EmitConstantInit(*D)) {
           FlatConstToList(initVal, EltValList);
         } else {

+ 9 - 0
tools/clang/test/CodeGenHLSL/cbuf_init_static.hlsl

@@ -0,0 +1,9 @@
+// RUN: %dxc -E main -T ps_6_0 %s
+
+float4 a;
+
+static float4 m = {a};
+
+float4 main() : SV_Target {
+    return m;
+}

+ 5 - 0
tools/clang/unittests/HLSL/CompilerTest.cpp

@@ -318,6 +318,7 @@ public:
   TEST_METHOD(CodeGenCast4)
   TEST_METHOD(CodeGenCast5)
   TEST_METHOD(CodeGenCast6)
+  TEST_METHOD(CodeGenCbuf_init_static)
   TEST_METHOD(CodeGenCbuffer_unused)
   TEST_METHOD(CodeGenCbuffer1_50)
   TEST_METHOD(CodeGenCbuffer1_51)
@@ -1997,6 +1998,10 @@ TEST_F(CompilerTest, CodeGenCast6) {
   CodeGenTestCheck(L"..\\CodeGenHLSL\\cast6.hlsl");
 }
 
+TEST_F(CompilerTest, CodeGenCbuf_init_static) {
+  CodeGenTest(L"..\\CodeGenHLSL\\cbuf_init_static.hlsl");
+}
+
 TEST_F(CompilerTest, CodeGenCbuffer_unused) {
   CodeGenTest(L"..\\CodeGenHLSL\\cbuffer_unused.hlsl");
 }