Prechádzať zdrojové kódy

Fix assert from LookupVectorMemberExprForHLSL calling Matrix function (#2899)

Tex Riddell 5 rokov pred
rodič
commit
e21874df91

+ 2 - 2
tools/clang/lib/Sema/SemaHLSL.cpp

@@ -10150,7 +10150,7 @@ ExprResult hlsl::LookupVectorMemberExprForHLSL(
   SourceLocation MemberLoc)
   SourceLocation MemberLoc)
 {
 {
   return HLSLExternalSource::FromSema(self)
   return HLSLExternalSource::FromSema(self)
-    ->LookupMatrixMemberExprForHLSL(BaseExpr, MemberName, IsArrow, OpLoc, MemberLoc);
+    ->LookupVectorMemberExprForHLSL(BaseExpr, MemberName, IsArrow, OpLoc, MemberLoc);
 }
 }
 
 
 ExprResult hlsl::LookupArrayMemberExprForHLSL(
 ExprResult hlsl::LookupArrayMemberExprForHLSL(
@@ -10162,7 +10162,7 @@ ExprResult hlsl::LookupArrayMemberExprForHLSL(
   SourceLocation MemberLoc)
   SourceLocation MemberLoc)
 {
 {
   return HLSLExternalSource::FromSema(self)
   return HLSLExternalSource::FromSema(self)
-    ->LookupMatrixMemberExprForHLSL(BaseExpr, MemberName, IsArrow, OpLoc, MemberLoc);
+    ->LookupArrayMemberExprForHLSL(BaseExpr, MemberName, IsArrow, OpLoc, MemberLoc);
 }
 }
 
 
 bool hlsl::LookupRecordMemberExprForHLSL(
 bool hlsl::LookupRecordMemberExprForHLSL(

+ 24 - 0
tools/clang/test/HLSLFileCheck/hlsl/operators/swizzle/swizzleInCorrectDelayedTyposInExpr.hlsl

@@ -0,0 +1,24 @@
+// RUN: %dxc -E main -T ps_6_0 %s | FileCheck %s
+
+// Test hlsl::LookupVectorMemberExprForHLSL codepath
+// This appears to only be called from a specific CorrectDelayedTyposInExpr code path.
+// It requires a number of conditions to get there.
+
+// CHECK: error: use of undeclared identifier 'some_var_2'; did you mean 'some_var_1'
+
+float3 some_fn(float4 a, float b) { return b; }
+float4 foo(int i) { return i; }
+float3 repro() {
+  // some_var_1 needs to be close to the undefined some_var_2,
+  // used in a dependent call expression,
+  // next to a swizzle on another call expression,
+  // so it can try to resolve the possible typos for suggested replacements.
+  // This eventually reaches the .xyz on foo(0),
+  // to resolve the vector member expression
+  // using hlsl::LookupVectorMemberExprForHLSL
+  float4 some_var_1;
+  return some_fn(some_var_2, foo(0).xyz);
+}
+float3 main(float4 input : IN) : OUT {
+  return repro();
+}