r324419 - [Lex] Fix handling numerical literals ending with ' and signed exponent.
Hans Wennborg via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 8 00:19:43 PST 2018
Merged to 6.0 in r324579.
On Tue, Feb 6, 2018 at 11:39 PM, Volodymyr Sapsai via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
> Author: vsapsai
> Date: Tue Feb 6 14:39:25 2018
> New Revision: 324419
>
> URL: http://llvm.org/viewvc/llvm-project?rev=324419&view=rev
> Log:
> [Lex] Fix handling numerical literals ending with ' and signed exponent.
>
> For input `0'e+1` lexer tokenized as numeric constant only `0'e`. Later
> NumericLiteralParser skipped 0 and ' as digits and parsed `e+1` as valid
> exponent going past the end of the token. Because it didn't mark numeric
> literal as having an error, it continued parsing and tried to expandUCNs
> with StringRef of length -2.
>
> The fix is not to parse exponent when we reached the end of token.
>
> Discovered by OSS-Fuzz:
> https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=4588
>
> rdar://problem/36076719
>
> Reviewers: rsmith, t.p.northover
>
> Reviewed By: rsmith
>
> Subscribers: cfe-commits, jkorous-apple
>
> Differential Revision: https://reviews.llvm.org/D41834
>
> Modified:
> cfe/trunk/lib/Lex/LiteralSupport.cpp
> cfe/trunk/test/Lexer/cxx1y_digit_separators.cpp
>
> Modified: cfe/trunk/lib/Lex/LiteralSupport.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/LiteralSupport.cpp?rev=324419&r1=324418&r2=324419&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Lex/LiteralSupport.cpp (original)
> +++ cfe/trunk/lib/Lex/LiteralSupport.cpp Tue Feb 6 14:39:25 2018
> @@ -738,15 +738,17 @@ void NumericLiteralParser::ParseDecimalO
> s++;
> radix = 10;
> saw_exponent = true;
> - if (*s == '+' || *s == '-') s++; // sign
> + if (s != ThisTokEnd && (*s == '+' || *s == '-')) s++; // sign
> const char *first_non_digit = SkipDigits(s);
> if (containsDigits(s, first_non_digit)) {
> checkSeparator(TokLoc, s, CSK_BeforeDigits);
> s = first_non_digit;
> } else {
> - PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, Exponent-ThisTokBegin),
> - diag::err_exponent_has_no_digits);
> - hadError = true;
> + if (!hadError) {
> + PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, Exponent-ThisTokBegin),
> + diag::err_exponent_has_no_digits);
> + hadError = true;
> + }
> return;
> }
> }
> @@ -787,10 +789,12 @@ void NumericLiteralParser::checkSeparato
> } else if (Pos == ThisTokEnd)
> return;
>
> - if (isDigitSeparator(*Pos))
> + if (isDigitSeparator(*Pos)) {
> PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, Pos - ThisTokBegin),
> diag::err_digit_separator_not_between_digits)
> << IsAfterDigits;
> + hadError = true;
> + }
> }
>
> /// ParseNumberStartingWithZero - This method is called when the first character
> @@ -840,12 +844,14 @@ void NumericLiteralParser::ParseNumberSt
> const char *Exponent = s;
> s++;
> saw_exponent = true;
> - if (*s == '+' || *s == '-') s++; // sign
> + if (s != ThisTokEnd && (*s == '+' || *s == '-')) s++; // sign
> const char *first_non_digit = SkipDigits(s);
> if (!containsDigits(s, first_non_digit)) {
> - PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, Exponent-ThisTokBegin),
> - diag::err_exponent_has_no_digits);
> - hadError = true;
> + if (!hadError) {
> + PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, Exponent-ThisTokBegin),
> + diag::err_exponent_has_no_digits);
> + hadError = true;
> + }
> return;
> }
> checkSeparator(TokLoc, s, CSK_BeforeDigits);
>
> Modified: cfe/trunk/test/Lexer/cxx1y_digit_separators.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/cxx1y_digit_separators.cpp?rev=324419&r1=324418&r2=324419&view=diff
> ==============================================================================
> --- cfe/trunk/test/Lexer/cxx1y_digit_separators.cpp (original)
> +++ cfe/trunk/test/Lexer/cxx1y_digit_separators.cpp Tue Feb 6 14:39:25 2018
> @@ -51,6 +51,8 @@ namespace floating {
> float u = 0x.'p1f; // expected-error {{hexadecimal floating literal requires a significand}}
> float v = 0e'f; // expected-error {{exponent has no digits}}
> float w = 0x0p'f; // expected-error {{exponent has no digits}}
> + float x = 0'e+1; // expected-error {{digit separator cannot appear at end of digit sequence}}
> + float y = 0x0'p+1; // expected-error {{digit separator cannot appear at end of digit sequence}}
> }
>
> #line 123'456
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list