From: Jakub Jelinek Date: Fri, 12 Feb 2021 08:55:46 +0000 (+0100) Subject: c++: Fix endless errors on invalid requirement seq [PR97742] X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=cf059e1c099ed45c97f740c030dcb8e146ac7d4a;p=gcc.git c++: Fix endless errors on invalid requirement seq [PR97742] 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. 2021-02-12 Jakub Jelinek PR c++/97742 * parser.c (cp_parser_requirement_seq): Stop iterating after reaching CPP_EOF. * g++.dg/cpp2a/concepts-requires24.C: New test. --- diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index d68dcb7d74f..70775792161 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -28807,7 +28807,9 @@ cp_parser_requirement_seq (cp_parser *parser) 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) diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-requires24.C b/gcc/testsuite/g++.dg/cpp2a/concepts-requires24.C new file mode 100644 index 00000000000..597528b49f8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-requires24.C @@ -0,0 +1,4 @@ +// PR c++/97742 +// { dg-do compile { target c++20 } } + +template