summaryrefslogtreecommitdiffstats
path: root/clang/lib/Lex/LiteralSupport.cpp
diff options
context:
space:
mode:
authorAaron Ballman <aaron@aaronballman.com>2012-02-08 13:36:33 +0000
committerAaron Ballman <aaron@aaronballman.com>2012-02-08 13:36:33 +0000
commite1224a506766b1187dee1d4f5497c2af18afefe2 (patch)
tree0c5b4b3e35e8703c070f9b2bc3c26f41a1b170cb /clang/lib/Lex/LiteralSupport.cpp
parent5e4f0a4a31adedbf897f5af9c31d7df94e0217ff (diff)
downloadbcm5719-llvm-e1224a506766b1187dee1d4f5497c2af18afefe2.tar.gz
bcm5719-llvm-e1224a506766b1187dee1d4f5497c2af18afefe2.zip
Fixing hex floating literal support so that it handles 0x.2p2 properly.
llvm-svn: 150072
Diffstat (limited to 'clang/lib/Lex/LiteralSupport.cpp')
-rw-r--r--clang/lib/Lex/LiteralSupport.cpp17
1 files changed, 11 insertions, 6 deletions
diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp
index c178d216ca8..a3f97d9ecc9 100644
--- a/clang/lib/Lex/LiteralSupport.cpp
+++ b/clang/lib/Lex/LiteralSupport.cpp
@@ -546,22 +546,27 @@ void NumericLiteralParser::ParseNumberStartingWithZero(SourceLocation TokLoc) {
// Handle a hex number like 0x1234.
if ((*s == 'x' || *s == 'X') && (isxdigit(s[1]) || s[1] == '.')) {
s++;
- if (!isxdigit(*s)) {
- PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, s-ThisTokBegin), \
- diag::err_hexconstant_requires_digits);
- hadError = true;
- return;
- }
radix = 16;
DigitsBegin = s;
s = SkipHexDigits(s);
+ bool noSignificand = (s == DigitsBegin);
if (s == ThisTokEnd) {
// Done.
} else if (*s == '.') {
s++;
saw_period = true;
+ const char *floatDigitsBegin = s;
s = SkipHexDigits(s);
+ noSignificand &= (floatDigitsBegin == s);
+ }
+
+ if (noSignificand) {
+ PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, s-ThisTokBegin), \
+ diag::err_hexconstant_requires_digits);
+ hadError = true;
+ return;
}
+
// A binary exponent can appear with or with a '.'. If dotted, the
// binary exponent is required.
if (*s == 'p' || *s == 'P') {
OpenPOWER on IntegriCloud