]> granicus.if.org Git - clang/commitdiff
Fix a bug reported by Kelly Wilson, where we incorrectly
authorChris Lattner <sabre@nondot.org>
Mon, 30 Jun 2008 06:44:49 +0000 (06:44 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 30 Jun 2008 06:44:49 +0000 (06:44 +0000)
rejected FP immediates like 08.123

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

lib/Lex/LiteralSupport.cpp
test/Lexer/number.c

index 5041a29419850f6efefb84198f25799f53128de1..6c91e0e82d0c00a7ce3d9187dbf47f063ae62da0 100644 (file)
@@ -376,6 +376,7 @@ void NumericLiteralParser::ParseNumberStartingWithZero(SourceLocation TokLoc) {
   // Handle simple binary numbers 0b01010
   if (*s == 'b' || *s == 'B') {
     // 0b101010 is a GCC extension.
+    PP.Diag(TokLoc, diag::ext_binary_literal);
     ++s;
     radix = 2;
     DigitsBegin = s;
@@ -385,10 +386,8 @@ void NumericLiteralParser::ParseNumberStartingWithZero(SourceLocation TokLoc) {
     } else if (isxdigit(*s)) {
       Diag(PP.AdvanceToTokenCharacter(TokLoc, s-ThisTokBegin),
            diag::err_invalid_binary_digit, std::string(s, s+1));
-      return;
     }
-    // Otherwise suffixes will be diagnosed by the caller.
-    PP.Diag(TokLoc, diag::ext_binary_literal);
+    // Other suffixes will be diagnosed by the caller.
     return;
   }
   
@@ -401,6 +400,18 @@ void NumericLiteralParser::ParseNumberStartingWithZero(SourceLocation TokLoc) {
   if (s == ThisTokEnd)
     return; // Done, simple octal number like 01234
   
+  // If we have some other non-octal digit that *is* a decimal digit, see if
+  // this is part of a floating point number like 094.123 or 09e1.
+  if (isdigit(*s)) {
+    const char *EndDecimal = SkipDigits(s);
+    if (EndDecimal[0] == '.' || EndDecimal[0] == 'e' || EndDecimal[0] == 'E') {
+      s = EndDecimal;
+      radix = 10;
+    }
+  }
+  
+  // If we have a hex digit other than 'e' (which denotes a FP exponent) then
+  // the code is using an incorrect base.
   if (isxdigit(*s) && *s != 'e' && *s != 'E') {
     Diag(PP.AdvanceToTokenCharacter(TokLoc, s-ThisTokBegin),
          diag::err_invalid_octal_digit, std::string(s, s+1));
@@ -411,7 +422,7 @@ void NumericLiteralParser::ParseNumberStartingWithZero(SourceLocation TokLoc) {
     s++;
     radix = 10;
     saw_period = true;
-    s = SkipDigits(s);
+    s = SkipDigits(s); // Skip suffix.
   }
   if (*s == 'e' || *s == 'E') { // exponent
     const char *Exponent = s;
index 4e12cc7edce33f7511089a51f2e74c57306e3b6e..e48816e405307d71cd12239fedf7ece5cc0ef4d4 100644 (file)
@@ -2,3 +2,5 @@
 
 float X = 1.17549435e-38F;
 
+float Y = 08.123456;
+