diff options
| author | Aaron Ballman <aaron@aaronballman.com> | 2012-02-08 13:36:33 +0000 |
|---|---|---|
| committer | Aaron Ballman <aaron@aaronballman.com> | 2012-02-08 13:36:33 +0000 |
| commit | e1224a506766b1187dee1d4f5497c2af18afefe2 (patch) | |
| tree | 0c5b4b3e35e8703c070f9b2bc3c26f41a1b170cb /clang | |
| parent | 5e4f0a4a31adedbf897f5af9c31d7df94e0217ff (diff) | |
| download | bcm5719-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')
| -rw-r--r-- | clang/lib/Lex/LiteralSupport.cpp | 17 | ||||
| -rw-r--r-- | clang/test/Lexer/hexfloat.cpp | 4 |
2 files changed, 14 insertions, 7 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') { diff --git a/clang/test/Lexer/hexfloat.cpp b/clang/test/Lexer/hexfloat.cpp index ad4e50a551c..656693399fa 100644 --- a/clang/test/Lexer/hexfloat.cpp +++ b/clang/test/Lexer/hexfloat.cpp @@ -2,4 +2,6 @@ // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify -pedantic %s float f = 0x1p+1; // expected-warning{{hexadecimal floating constants are a C99 feature}} double e = 0x.p0; //expected-error{{hexadecimal floating constants require a significand}} - +double d = 0x.2p2; // expected-warning{{hexadecimal floating constants are a C99 feature}} +float g = 0x1.2p2; // expected-warning{{hexadecimal floating constants are a C99 feature}} +double h = 0x1.p2; // expected-warning{{hexadecimal floating constants are a C99 feature}} |

