From: Nuno Lopes Date: Sat, 28 Nov 2009 13:37:52 +0000 (+0000) Subject: cleanup parsing of MS integer suffixes a little. this fixes PR5616 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6e8c7acb61b2c7f421d6e1aba8a7a84e96ab6981;p=clang cleanup parsing of MS integer suffixes a little. this fixes PR5616 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 --- diff --git a/lib/Lex/LiteralSupport.cpp b/lib/Lex/LiteralSupport.cpp index 42dd75e59b..ab669422b2 100644 --- a/lib/Lex/LiteralSupport.cpp +++ b/lib/Lex/LiteralSupport.cpp @@ -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 index 0000000000..8176ec3249 --- /dev/null +++ b/test/Lexer/constants-ms.c @@ -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}}