hubert.reinterpretcast added a comment.

I would like to see a test:

  __float128 qf();
  long double ldf();
  
  long double ld{qf()}; // error: narrowing
  __float128 q{ldf()}; // passes


================
Comment at: include/clang/Basic/TargetInfo.h:384
@@ +383,3 @@
+  unsigned getFloat128Width() const { return 128; }
+  unsigned getFloat128Align() const { return 128; }
+  const llvm::fltSemantics &getFloat128Format() const {
----------------
This should probably not be hard-coded. On s390x-ibm-linux-gnu, the IEEE 
128-bit binary format type has 8 byte alignment (not 16).

================
Comment at: lib/CodeGen/CGDebugInfo.cpp:539
@@ -538,2 +538,3 @@
   case BuiltinType::LongDouble:
+  case BuiltinType::Float128:
   case BuiltinType::Double:
----------------
Is a PPCDoubleDouble "long double" and "__float128" distinguishable on PPC 
given this DWARF treatment?

================
Comment at: lib/Lex/LiteralSupport.cpp:604
@@ -596,3 +603,3 @@
       if (isLong || isLongLong) break;  // Cannot be repeated.
-      if (isFloat) break;               // LF invalid.
+      if (isFloat || isFloat128) break; // LF, QL invalid.
 
----------------
minor: should the comment have FL instead of LF?

================
Comment at: lib/Sema/SemaOverload.cpp:1921-1922
@@ -1920,4 +1920,4 @@
       // C99 6.3.1.5p1:
       //   When a float is promoted to double or long double, or a
       //   double is promoted to long double [...].
       if (!getLangOpts().CPlusPlus &&
----------------
In C99 6.3.1.5p1:
> [...] its value is unchanged.

Allowing `long double` to promote to `__float128` violates that on at least one 
target platform.
For example, PPCDoubleDouble can represent (2^512) - 1 exactly.



Repository:
  rL LLVM

http://reviews.llvm.org/D15120



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to