Browse Source

Bug fixes for dxil-2017-06 (#406)

* Fix dxc crash on invalid brace-enclosed initializer (#404)

* Ignore shared keyword on cbuffer/tbuffer (#389)

Ignoring shared keyword for now.
Young Kim 8 years ago
parent
commit
0a59b980ac

+ 1 - 1
tools/clang/include/clang/Basic/DiagnosticParseKinds.td

@@ -1017,7 +1017,7 @@ def warn_hlsl_effect_sampler_state : Warning <
   "effect sampler_state assignment ignored - effect syntax is deprecated">,
   "effect sampler_state assignment ignored - effect syntax is deprecated">,
   InGroup< HLSLEffectsSyntax >;
   InGroup< HLSLEffectsSyntax >;
 def warn_hlsl_effect_state_block : Warning <
 def warn_hlsl_effect_state_block : Warning <
-  "effect state block ignored - effect syntax is deprecated">,
+  "effect state block ignored - effect syntax is deprecated. To use braces as an initializer use them with equal signs.">,
   InGroup< HLSLEffectsSyntax >;
   InGroup< HLSLEffectsSyntax >;
 def warn_hlsl_effect_technique : Warning <
 def warn_hlsl_effect_technique : Warning <
   "effect technique ignored - effect syntax is deprecated">,
   "effect technique ignored - effect syntax is deprecated">,

+ 4 - 1
tools/clang/lib/Parse/ParseDecl.cpp

@@ -2661,8 +2661,11 @@ Decl *Parser::ParseDeclarationAfterDeclaratorAndAttributes(
     Diag(Tok.getLocation(), diag::warn_hlsl_effect_state_block);
     Diag(Tok.getLocation(), diag::warn_hlsl_effect_state_block);
     ConsumeBrace();
     ConsumeBrace();
     SkipUntil(tok::r_brace); // skip until '}'
     SkipUntil(tok::r_brace); // skip until '}'
+    // Braces could have been used to initialize an array.
+    // In this case we require users to use braces with the equal sign.
+    // Otherwise, the array will be treated as an uninitialized declaration.
+    Actions.ActOnUninitializedDecl(ThisDecl, TypeContainsAuto);
     // HLSL Change Ends
     // HLSL Change Ends
-
   } else {
   } else {
     Actions.ActOnUninitializedDecl(ThisDecl, TypeContainsAuto);
     Actions.ActOnUninitializedDecl(ThisDecl, TypeContainsAuto);
   }
   }

+ 6 - 1
tools/clang/lib/Parse/Parser.cpp

@@ -758,6 +758,11 @@ Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs,
                                               : Sema::PCC_Namespace);
                                               : Sema::PCC_Namespace);
     cutOffParsing();
     cutOffParsing();
     return DeclGroupPtrTy();
     return DeclGroupPtrTy();
+  // HLSL Change Starts: Ignore shared keyword for now
+  case tok::kw_shared:
+      ConsumeToken();
+      return ParseExternalDeclaration(attrs);
+  // HLSL Change Ends
   // HLSL Change Starts: Start parsing declaration of cbuffer and tbuffers
   // HLSL Change Starts: Start parsing declaration of cbuffer and tbuffers
   case tok::kw_cbuffer:
   case tok::kw_cbuffer:
   case tok::kw_tbuffer:
   case tok::kw_tbuffer:
@@ -829,7 +834,7 @@ Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs,
     if (getLangOpts().HLSL) goto dont_know; // HLSL Change - skip unsupported processing
     if (getLangOpts().HLSL) goto dont_know; // HLSL Change - skip unsupported processing
     ParseMicrosoftIfExistsExternalDeclaration();
     ParseMicrosoftIfExistsExternalDeclaration();
     return DeclGroupPtrTy();
     return DeclGroupPtrTy();
-      
+
   default:
   default:
   dont_know:
   dont_know:
     // We can't tell whether this is a function-definition or declaration yet.
     // We can't tell whether this is a function-definition or declaration yet.

+ 3 - 1
tools/clang/test/HLSL/effects-syntax.hlsl

@@ -181,4 +181,6 @@ TechNique T5                                                /* expected-error {{
 int foobar4;
 int foobar4;
 /*verify-ast
 /*verify-ast
   VarDecl <col:1, col:5> col:5 foobar4 'int'
   VarDecl <col:1, col:5> col:5 foobar4 'int'
-*/
+*/
+int foobar5[] {1, 2, 3};                                        /* expected-error {{definition of variable with array type needs an explicit size or an initializer}} expected-warning {{effect state block ignored - effect syntax is deprecated. To use braces as an initializer use them with equal signs.}} fxc-error {{X3000: syntax error: unexpected integer constant}} */
+int foobar6[4] {1, 2, 3, 4};                                    /* expected-warning {{effect state block ignored - effect syntax is deprecated. To use braces as an initializer use them with equal signs.}} fxc-error {{X3000: syntax error: unexpected integer constant}} */

+ 22 - 0
tools/clang/test/HLSL/rewriter/correct_rewrites/shared.hlsl

@@ -0,0 +1,22 @@
+// Rewrite unchanged result:
+cbuffer cb0 {
+  const float X;
+}
+;
+tbuffer tb0 {
+  const float Y;
+}
+;
+Buffer<int> g_intBuffer;
+RWByteAddressBuffer g_byteBuffer;
+Texture1D<double> g_tex1d;
+Texture1DArray<int> g_tex1dArray;
+Texture2D<float> g_tex2d;
+Texture2DArray<float> g_tex2dArray;
+Texture2DMS<half> g_texture2dms;
+Texture2DMSArray<float> g_texture2dmsArray;
+float main() : SV_Target {
+  return -X + Y;
+}
+
+

+ 21 - 0
tools/clang/test/HLSL/rewriter/shared.hlsl

@@ -0,0 +1,21 @@
+shared cbuffer cb0 {
+    float X;
+};
+
+shared tbuffer tb0 {
+    float Y;
+};
+
+shared Buffer<int> g_intBuffer;
+shared RWByteAddressBuffer g_byteBuffer;
+
+shared Texture1D<double> g_tex1d;
+shared Texture1DArray<int> g_tex1dArray;
+shared Texture2D<float> g_tex2d;
+shared Texture2DArray<float> g_tex2dArray;
+shared Texture2DMS<half> g_texture2dms;
+shared Texture2DMSArray<float> g_texture2dmsArray;
+
+float main() : SV_Target {
+    return -X + Y;
+}

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

@@ -56,6 +56,7 @@ public:
   TEST_METHOD(RunMatrixSyntax);
   TEST_METHOD(RunMatrixSyntax);
   TEST_METHOD(RunPackReg);
   TEST_METHOD(RunPackReg);
   TEST_METHOD(RunScalarAssignments);
   TEST_METHOD(RunScalarAssignments);
+  TEST_METHOD(RunShared);
   TEST_METHOD(RunStructAssignments);
   TEST_METHOD(RunStructAssignments);
   TEST_METHOD(RunTemplateChecks);
   TEST_METHOD(RunTemplateChecks);
   TEST_METHOD(RunTypemodsSyntax);
   TEST_METHOD(RunTypemodsSyntax);
@@ -275,6 +276,10 @@ TEST_F(RewriterTest, RunScalarAssignments) {
     CheckVerifiesHLSL(L"rewriter\\scalar-assignments_noerr.hlsl", L"rewriter\\correct_rewrites\\scalar-assignments_gold.hlsl");
     CheckVerifiesHLSL(L"rewriter\\scalar-assignments_noerr.hlsl", L"rewriter\\correct_rewrites\\scalar-assignments_gold.hlsl");
 }
 }
 
 
+TEST_F(RewriterTest, RunShared) {
+    CheckVerifiesHLSL(L"rewriter\\shared.hlsl", L"rewriter\\correct_rewrites\\shared.hlsl");
+}
+
 TEST_F(RewriterTest, RunStructAssignments) {
 TEST_F(RewriterTest, RunStructAssignments) {
     CheckVerifiesHLSL(L"rewriter\\struct-assignments_noerr.hlsl", L"rewriter\\correct_rewrites\\struct-assignments_gold.hlsl");
     CheckVerifiesHLSL(L"rewriter\\struct-assignments_noerr.hlsl", L"rewriter\\correct_rewrites\\struct-assignments_gold.hlsl");
 }
 }