]> granicus.if.org Git - clang/commitdiff
Hex literals without a significand no longer crash the lexer. Fixes bug 7910
authorAaron Ballman <aaron@aaronballman.com>
Tue, 7 Feb 2012 13:46:03 +0000 (13:46 +0000)
committerAaron Ballman <aaron@aaronballman.com>
Tue, 7 Feb 2012 13:46:03 +0000 (13:46 +0000)
Patch by Eitan Adler

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

include/clang/Basic/DiagnosticLexKinds.td
lib/Lex/LiteralSupport.cpp
test/Lexer/hexfloat.cpp

index fde522c573d48acbc9ada5e732314cfbc1f24087..8de3fb3dc95c1edd5d4a699ef0fd153791711f57 100644 (file)
@@ -113,6 +113,8 @@ def err_exponent_has_no_digits : Error<"exponent has no digits">;
 def ext_imaginary_constant : Extension<"imaginary constants are an extension">;
 def err_hexconstant_requires_exponent : Error<
   "hexadecimal floating constants require an exponent">;
+def err_hexconstant_requires_digits : Error<
+  "hexadecimal floating constants require a significand">;
 def ext_hexconstant_invalid : Extension<
   "hexadecimal floating constants are a C99 feature">;
 def ext_binary_literal : Extension<
index 74c396ca965f5ce6966591574d3fc2703af7f641..c178d216ca867272520305d6378a032778b0ebe8 100644 (file)
@@ -546,6 +546,12 @@ 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);
index 23daa49ad2109c55682c05fd4733e775c22fb11e..ad4e50a551ce99faefc86a3da4b2e59587a3e366 100644 (file)
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 -fsyntax-only -verify -pedantic %s
 // 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}}