]> granicus.if.org Git - clang/commitdiff
In c89 mode accept hex fp constants as an extension:
authorChris Lattner <sabre@nondot.org>
Fri, 25 Jul 2008 18:18:34 +0000 (18:18 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 25 Jul 2008 18:18:34 +0000 (18:18 +0000)
t2.c:1:17: warning: hexadecimal floating constants are a C99 feature
long double d = 0x0.0000003ffffffff00000p-16357L;
                ^

instead of emitting a weird error message that doesn't make sense:

t2.c:1:41: error: hexadecimal floating constants require an exponent
long double d = 0x0.0000003ffffffff00000p-16357L;
                                        ^

rdar://6096838

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54035 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticKinds.def
lib/Lex/LiteralSupport.cpp

index e0218918c872b865b5fab6e6e2b6629386872e47..e0023e3667b3f58437de9d28a40f44851ff30aa0 100644 (file)
@@ -877,6 +877,8 @@ DIAG(err_invalid_decimal_digit, ERROR,
      "invalid digit '%0' in decimal constant")
 DIAG(err_hexconstant_requires_exponent, ERROR,
      "hexadecimal floating constants require an exponent")
+DIAG(ext_hexconstant_invalid, EXTENSION,
+     "hexadecimal floating constants are a C99 feature")
 DIAG(err_typecheck_subscript_value, ERROR,
      "subscripted value is neither array nor pointer")
 DIAG(err_typecheck_subscript, ERROR,
index 6c91e0e82d0c00a7ce3d9187dbf47f063ae62da0..fc90b4b00efb7151a78e92cb67105c09542dadba 100644 (file)
@@ -354,18 +354,21 @@ void NumericLiteralParser::ParseNumberStartingWithZero(SourceLocation TokLoc) {
     }
     // A binary exponent can appear with or with a '.'. If dotted, the
     // binary exponent is required. 
-    if ((*s == 'p' || *s == 'P') && PP.getLangOptions().HexFloats) {
+    if (*s == 'p' || *s == 'P') {
       const char *Exponent = s;
       s++;
       saw_exponent = true;
       if (*s == '+' || *s == '-')  s++; // sign
       const char *first_non_digit = SkipDigits(s);
-      if (first_non_digit != s) {
-        s = first_non_digit;
-      } else {
+      if (first_non_digit == s) {
         Diag(PP.AdvanceToTokenCharacter(TokLoc, Exponent-ThisTokBegin),
              diag::err_exponent_has_no_digits);
+        return;
       }
+      s = first_non_digit;
+      
+      if (!PP.getLangOptions().HexFloats)
+        Diag(TokLoc, diag::ext_hexconstant_invalid);
     } else if (saw_period) {
       Diag(PP.AdvanceToTokenCharacter(TokLoc, s-ThisTokBegin),
            diag::err_hexconstant_requires_exponent);