Browse Source

Fix float literal type conversions. (#531)

Young Kim 8 years ago
parent
commit
efbd4ae3a7
2 changed files with 40 additions and 1 deletions
  1. 8 1
      tools/clang/lib/Sema/SemaHLSL.cpp
  2. 32 0
      tools/clang/test/HLSL/literals.hlsl

+ 8 - 1
tools/clang/lib/Sema/SemaHLSL.cpp

@@ -8462,6 +8462,7 @@ static
 bool IsValueInBasicRange(ArBasicKind basicKind, const APValue& value)
 {
   if (IS_BASIC_FLOAT(basicKind)) {
+
     double val;
     if (value.isInt()) {
       val = value.getInt().getLimitedValue();
@@ -8470,7 +8471,13 @@ bool IsValueInBasicRange(ArBasicKind basicKind, const APValue& value)
       if (!floatValue.isFinite()) {
         return false;
       }
-      val = value.getFloat().convertToDouble();
+      llvm::APFloat valueFloat = value.getFloat();
+      if (&valueFloat.getSemantics() == &llvm::APFloat::IEEEsingle) {
+        val = value.getFloat().convertToFloat();
+      }
+      else {
+        val = value.getFloat().convertToDouble();
+      }
     } else {
       return false;
     }

+ 32 - 0
tools/clang/test/HLSL/literals.hlsl

@@ -15,6 +15,8 @@
 #define VERIFY_TYPES(typ, exp) _Static_assert(std::is_same<typ, __decltype(exp)>::value, #typ " == __decltype(" #exp ") failed")
 #endif
 
+#define VERIFY_TYPE_CONVERSION(typ, exp) {typ _tmp_var_ = exp;}
+
 float overload1(float v) { return (float)100; }             /* expected-note {{candidate function}} expected-note {{candidate function}} expected-note {{candidate function}} expected-note {{candidate function}} expected-note {{candidate function}} expected-note {{candidate function}} expected-note {{candidate function}} expected-note {{candidate function}} fxc-pass {{}} */
 int overload1(int v) { return (int)200; }                   /* expected-note {{candidate function}} expected-note {{candidate function}} expected-note {{candidate function}} expected-note {{candidate function}} expected-note {{candidate function}} expected-note {{candidate function}} expected-note {{candidate function}} expected-note {{candidate function}} fxc-pass {{}} */
 uint overload1(uint v) { return (uint)300; }                /* expected-note {{candidate function}} expected-note {{candidate function}} expected-note {{candidate function}} expected-note {{candidate function}}  expected-note {{candidate function}}  expected-note {{candidate function}}  expected-note {{candidate function}}  expected-note {{candidate function}}  fxc-pass {{}} */
@@ -142,5 +144,35 @@ float test() {
   // literal combination results in literal that doesn't override the min-precision type.
   VERIFY_TYPES(min16float4x4, m16f4x4 * (0.5 + 1));
 
+  // Ensure Conversion works.
+  VERIFY_TYPE_CONVERSION(min10float, 1.5f);  /* expected-warning {{min10float is promoted to min16float}} */
+  VERIFY_TYPE_CONVERSION(min10float, 0.25l); /* expected-warning {{min10float is promoted to min16float}} */
+
+  VERIFY_TYPE_CONVERSION(min16float, 1.5f);
+  VERIFY_TYPE_CONVERSION(min16float, 2.5l);
+
+  VERIFY_TYPE_CONVERSION(float, 1.5h);
+  VERIFY_TYPE_CONVERSION(float, 1.6l);
+
+  VERIFY_TYPE_CONVERSION(double, 1.65h);
+  VERIFY_TYPE_CONVERSION(double, 0.25f);
+
+  VERIFY_TYPE_CONVERSION(int, 1L);
+  VERIFY_TYPE_CONVERSION(int, 1U);
+  VERIFY_TYPE_CONVERSION(int, 1UL);
+  VERIFY_TYPE_CONVERSION(int, 1LL);
+
+  VERIFY_TYPE_CONVERSION(uint, 1L);
+  VERIFY_TYPE_CONVERSION(uint, 1UL);
+  VERIFY_TYPE_CONVERSION(uint, 1LL);
+
+  VERIFY_TYPE_CONVERSION(min12int, 1L);  /* expected-warning {{min12int is promoted to min16int}} */
+  VERIFY_TYPE_CONVERSION(min12int, 1UL); /* expected-warning {{min12int is promoted to min16int}} */
+  VERIFY_TYPE_CONVERSION(min12int, 1LL); /* expected-warning {{min12int is promoted to min16int}} */
+
+  VERIFY_TYPE_CONVERSION(min16int, 1L);
+  VERIFY_TYPE_CONVERSION(min16int, 1UL);
+  VERIFY_TYPE_CONVERSION(min16int, 1LL);
+
   return 0.0f;
 }