Merged to 6.0 in r324579.

On Tue, Feb 6, 2018 at 11:39 PM, Volodymyr Sapsai via cfe-commits
<cfe-commits@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@lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to