diff options
author | Mike Stump <mrs@apple.com> | 2009-10-08 22:55:36 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-10-08 22:55:36 +0000 |
commit | b79fe2d28777652a4df4f49dc876cbec060ca90e (patch) | |
tree | 48fb1efac9220d5d66385a9c08c05bf5402d85cc /lib/Lex/LiteralSupport.cpp | |
parent | b656d8823571ad206cd756f58bac941d25765519 (diff) |
This fixes support for complex literals, reworked to avoid a goto, and
to add a flag noting the presence of a Microsoft extension suffix (i8,
i16, i32, i64). Patch by John Thompson.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83591 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Lex/LiteralSupport.cpp')
-rw-r--r-- | lib/Lex/LiteralSupport.cpp | 68 |
1 files changed, 44 insertions, 24 deletions
diff --git a/lib/Lex/LiteralSupport.cpp b/lib/Lex/LiteralSupport.cpp index 9f91e0450d..42dd75e59b 100644 --- a/lib/Lex/LiteralSupport.cpp +++ b/lib/Lex/LiteralSupport.cpp @@ -298,6 +298,7 @@ NumericLiteralParser(const char *begin, const char *end, isLongLong = false; isFloat = false; isImaginary = false; + isMicrosoftInteger = false; hadError = false; if (*s == '0') { // parse radix @@ -375,31 +376,50 @@ NumericLiteralParser(const char *begin, const char *end, case 'i': if (PP.getLangOptions().Microsoft) { // Allow i8, i16, i32, i64, and i128. - if (++s == ThisTokEnd) break; - switch (*s) { - case '8': - s++; // i8 suffix - break; - case '1': - if (++s == ThisTokEnd) break; - if (*s == '6') s++; // i16 suffix - else if (*s == '2') { - if (++s == ThisTokEnd) break; - if (*s == '8') s++; // i128 suffix - } - break; - case '3': - if (++s == ThisTokEnd) break; - if (*s == '2') s++; // i32 suffix - break; - case '6': - if (++s == ThisTokEnd) break; - if (*s == '4') s++; // i64 suffix - break; - default: - break; + if (s + 1 != ThisTokEnd) { + switch (s[1]) { + case '8': + s += 2; // i8 suffix + isMicrosoftInteger = true; + continue; + 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 + } + isMicrosoftInteger = true; + continue; + case '3': + s += 2; + if (s == ThisTokEnd) break; + if (*s == '2') s++; // i32 suffix + isMicrosoftInteger = true; + continue; + case '6': + s += 2; + if (s == ThisTokEnd) break; + if (*s == '4') s++; // 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. + default: + break; + } + break; } - break; } // fall through. case 'I': |