Permit the "if" literal suffix with Microsoft extensions enabled.
authorPeter Collingbourne <peter@pcc.me.uk>
Thu, 29 May 2014 23:10:15 +0000 (23:10 +0000)
committerPeter Collingbourne <peter@pcc.me.uk>
Thu, 29 May 2014 23:10:15 +0000 (23:10 +0000)
Differential Revision: http://reviews.llvm.org/D3963

llvm-svn: 209859

clang/lib/Lex/LiteralSupport.cpp
clang/test/Lexer/ms-extensions.c

index 8550198..0103450 100644 (file)
@@ -606,16 +606,18 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling,
     case 'i':
     case 'I':
       if (PP.getLangOpts().MicrosoftExt) {
-        if (isFPConstant || isLong || isLongLong) break;
+        if (isLong || isLongLong) break;
 
         // Allow i8, i16, i32, i64, and i128.
         if (s + 1 != ThisTokEnd) {
           switch (s[1]) {
             case '8':
+              if (isFPConstant) break;
               s += 2; // i8 suffix
               isMicrosoftInteger = true;
               break;
             case '1':
+              if (isFPConstant) break;
               if (s + 2 == ThisTokEnd) break;
               if (s[2] == '6') {
                 s += 3; // i16 suffix
@@ -630,6 +632,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling,
               }
               break;
             case '3':
+              if (isFPConstant) break;
               if (s + 2 == ThisTokEnd) break;
               if (s[2] == '2') {
                 s += 3; // i32 suffix
@@ -638,6 +641,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling,
               }
               break;
             case '6':
+              if (isFPConstant) break;
               if (s + 2 == ThisTokEnd) break;
               if (s[2] == '4') {
                 s += 3; // i64 suffix
@@ -648,7 +652,8 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling,
             default:
               break;
           }
-          break;
+          if (isMicrosoftInteger)
+            break;
         }
       }
       // "i", "if", and "il" are user-defined suffixes in C++1y.
index 377d2d5..4d006e4 100644 (file)
@@ -13,6 +13,10 @@ __int64 w = 0x43ui64;
 __int64 z = 9Li64;  // expected-error {{invalid suffix}}
 __int64 q = 10lli64;  // expected-error {{invalid suffix}}
 
+__complex double c1 = 1i;
+__complex double c2 = 1.0i;
+__complex float c3 = 1.0if;
+
 // radar 7562363
 #define ULLONG_MAX 0xffffffffffffffffui64
 #define UINT 0xffffffffui32