On Thu, Feb 11, 2021 at 05:30:24PM +0100, Jakub Jelinek via Gcc-patches wrote:
> Hi!
> 
> As the testcase shows, if we reach CPP_EOF during parsing of requirement
> sequence, we end up with endless loop where we always report invalid
> requirement expression, don't consume any token (as we are at eof) and
> repeat.
> 
> This patch stops the loop when we reach CPP_EOF.
> 
> Ok for trunk if it passes bootstrap/regtest?

LGTM.

> 2021-02-11  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR c++/97742
>       * parser.c (cp_parser_requirement_seq): Stop iterating after reaching
>       CPP_EOF.
> 
>       * g++.dg/cpp2a/concepts-requires24.C: New test.
> 
> --- gcc/cp/parser.c.jj        2021-02-03 17:14:01.000000000 +0100
> +++ gcc/cp/parser.c   2021-02-11 14:44:05.877357556 +0100
> @@ -28816,7 +28816,9 @@ cp_parser_requirement_seq (cp_parser *pa
>        tree req = cp_parser_requirement (parser);
>        if (req != error_mark_node)
>       result = tree_cons (NULL_TREE, req, result);
> -    } while (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_BRACE));
> +    }
> +  while (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_BRACE)
> +      && cp_lexer_next_token_is_not (parser->lexer, CPP_EOF));
>  
>    /* If there are no valid requirements, this is not a valid expression. */
>    if (!result)
> --- gcc/testsuite/g++.dg/cpp2a/concepts-requires24.C.jj       2021-02-11 
> 14:40:28.548815748 +0100
> +++ gcc/testsuite/g++.dg/cpp2a/concepts-requires24.C  2021-02-11 
> 14:39:40.209362526 +0100
> @@ -0,0 +1,4 @@
> +// PR c++/97742
> +// { dg-do compile { target c++20 } }
> +
> +template <int = requires { true      // { dg-error "expected" }
> 
>       Jakub
> 

Marek

Reply via email to