]> granicus.if.org Git - clang/commitdiff
cleanup parsing of MS integer suffixes a little. this fixes PR5616
authorNuno Lopes <nunoplopes@sapo.pt>
Sat, 28 Nov 2009 13:37:52 +0000 (13:37 +0000)
committerNuno Lopes <nunoplopes@sapo.pt>
Sat, 28 Nov 2009 13:37:52 +0000 (13:37 +0000)
btw, I believe that isMicrosoftInteger can go away; it's not read anywhere

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

lib/Lex/LiteralSupport.cpp
test/Lexer/constants-ms.c [new file with mode: 0644]

index 42dd75e59b94d94da1d6d21260e8e3fd2a4fb054..ab669422b277f3036c7175f15f625a48754d56a8 100644 (file)
@@ -375,46 +375,34 @@ NumericLiteralParser(const char *begin, const char *end,
       continue;  // Success.
     case 'i':
       if (PP.getLangOptions().Microsoft) {
+        if (isFPConstant || isUnsigned || isLong || isLongLong) break;
+
         // Allow i8, i16, i32, i64, and i128.
         if (s + 1 != ThisTokEnd) {
           switch (s[1]) {
             case '8':
               s += 2; // i8 suffix
               isMicrosoftInteger = true;
-              continue;
+              break;
             case '1':
-              s += 2;
-              if (s == ThisTokEnd) break;
-              if (*s == '6') s++; // i16 suffix
-              else if (*s == '2') {
-                if (++s == ThisTokEnd) break;
-                if (*s == '8') s++; // i128 suffix
+              if (s + 2 == ThisTokEnd) break;
+              if (s[2] == '6') s += 3; // i16 suffix
+              else if (s[2] == '2') {
+                if (s + 3 == ThisTokEnd) break;
+                if (s[3] == '8') s += 4; // i128 suffix
               }
               isMicrosoftInteger = true;
-              continue;
+              break;
             case '3':
-              s += 2;
-              if (s == ThisTokEnd) break;
-              if (*s == '2') s++; // i32 suffix
+              if (s + 2 == ThisTokEnd) break;
+              if (s[2] == '2') s += 3; // i32 suffix
               isMicrosoftInteger = true;
-              continue;
+              break;
             case '6':
-              s += 2;
-              if (s == ThisTokEnd) break;
-              if (*s == '4') s++; // i64 suffix
+              if (s + 2 == ThisTokEnd) break;
+              if (s[2] == '4') s += 3; // i64 suffix
               isMicrosoftInteger = true;
-              continue;
-            case 'f':      // FP Suffix for "float"
-            case 'F':
-              if (!isFPConstant) break;  // Error for integer constant.
-              if (isFloat || isLong) break; // FF, LF invalid.
-              isFloat = true;
-              if (isImaginary) break;   // Cannot be repeated.
-              PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, s-begin),
-                      diag::ext_imaginary_constant);
-              isImaginary = true;
-              s++;
-              continue;  // Success.
+              break;
             default:
               break;
           }
diff --git a/test/Lexer/constants-ms.c b/test/Lexer/constants-ms.c
new file mode 100644 (file)
index 0000000..8176ec3
--- /dev/null
@@ -0,0 +1,12 @@
+// RUN: clang-cc -fsyntax-only -verify -fms-extensions %s
+
+__int8 x1  = 3i8;
+__int16 x2 = 4i16;
+__int32 x3 = 5i32;
+__int64 x5 = 0x42i64;
+__int64 x4 = 70000000i128;
+
+__int64 y = 0x42i64u;  // expected-error {{invalid suffix}}
+__int64 w = 0x43ui64;  // expected-error {{invalid suffix}}
+__int64 z = 9Li64;  // expected-error {{invalid suffix}}
+__int64 q = 10lli64;  // expected-error {{invalid suffix}}