Преглед изворни кода

Do not make basic type rvalue to lvalue. (#148)

Xiang Li пре 8 година
родитељ
комит
02832543e0

+ 3 - 1
tools/clang/lib/Sema/SemaCast.cpp

@@ -2104,12 +2104,14 @@ void CastOperation::CheckCXXCStyleCast(bool FunctionalStyle,
   }
 
   // HLSL Change Starts
-  // Check for HLSL vector or matrix shrinking.
+  // Check for HLSL vector/matrix/array/struct shrinking.
   if (ValueKind == VK_RValue && 
       !FunctionalStyle &&
       !isPlaceholder(BuiltinType::Overload) &&
       Self.getLangOpts().HLSL &&
       SrcExpr.get()->isLValue() &&
+      // Cannot use casts on basic type l-values
+      !SrcExpr.get()->getType().getCanonicalType()->isBuiltinType() &&
       hlsl::IsConversionToLessOrEqualElements(&Self, SrcExpr, DestType, true)) {
     ValueKind = VK_LValue;
   }

+ 14 - 0
tools/clang/test/CodeGenHLSL/float_cast.hlsl

@@ -0,0 +1,14 @@
+// RUN: %dxc -E main -T ps_6_0 %s | FileCheck %s
+
+// Result should be 63.
+// CHECK: float 6.300000e+01
+
+
+static const float x = 15;
+static const float ar[] = { 18, 23 };
+
+float main(float2 a : A) : SV_Target {
+  float lar[4];
+  (float[2])lar = ar;
+  return 3.0f * (float)x + lar[0];
+}

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

@@ -344,6 +344,7 @@ public:
   TEST_METHOD(CodeGenEval)
   TEST_METHOD(CodeGenEvalPos)
   TEST_METHOD(CodeGenExternRes)
+  TEST_METHOD(CodeGenFloatCast)
   TEST_METHOD(CodeGenFloatToBool)
   TEST_METHOD(CodeGenFirstbitHi)
   TEST_METHOD(CodeGenFirstbitLo)
@@ -2096,6 +2097,10 @@ TEST_F(CompilerTest, CodeGenExternRes) {
   CodeGenTestCheck(L"..\\CodeGenHLSL\\extern_res.hlsl");
 }
 
+TEST_F(CompilerTest, CodeGenFloatCast) {
+  CodeGenTestCheck(L"..\\CodeGenHLSL\\float_cast.hlsl");
+}
+
 TEST_F(CompilerTest, CodeGenFloatToBool) {
   CodeGenTestCheck(L"..\\CodeGenHLSL\\float_to_bool.hlsl");
 }