From: Aaron Ballman Date: Tue, 7 Feb 2012 13:46:03 +0000 (+0000) Subject: Hex literals without a significand no longer crash the lexer. Fixes bug 7910 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b534a9ed04b343534e5f277b81d1170de3204164;p=clang Hex literals without a significand no longer crash the lexer. Fixes bug 7910 Patch by Eitan Adler git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@149984 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticLexKinds.td b/include/clang/Basic/DiagnosticLexKinds.td index fde522c573..8de3fb3dc9 100644 --- a/include/clang/Basic/DiagnosticLexKinds.td +++ b/include/clang/Basic/DiagnosticLexKinds.td @@ -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< diff --git a/lib/Lex/LiteralSupport.cpp b/lib/Lex/LiteralSupport.cpp index 74c396ca96..c178d216ca 100644 --- a/lib/Lex/LiteralSupport.cpp +++ b/lib/Lex/LiteralSupport.cpp @@ -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); diff --git a/test/Lexer/hexfloat.cpp b/test/Lexer/hexfloat.cpp index 23daa49ad2..ad4e50a551 100644 --- a/test/Lexer/hexfloat.cpp +++ b/test/Lexer/hexfloat.cpp @@ -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}}