]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: Fix endless errors on invalid requirement seq [PR97742]
authorJakub Jelinek <jakub@redhat.com>
Fri, 12 Feb 2021 08:55:46 +0000 (09:55 +0100)
committerJakub Jelinek <jakub@redhat.com>
Fri, 19 Mar 2021 23:27:48 +0000 (00:27 +0100)
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  <jakub@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.

(cherry picked from commit cf059e1c099ed45c97f740c030dcb8e146ac7d4a)

gcc/cp/parser.c
gcc/testsuite/g++.dg/cpp2a/concepts-requires24.C [new file with mode: 0644]

index ba75c4797e4d0c04ac943237e1bc0ac7306ab087..40af0de95e42fea9c9abe36469efe420bff81a79 100644 (file)
@@ -27895,7 +27895,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 (file)
index 0000000..597528b
--- /dev/null
@@ -0,0 +1,4 @@
+// PR c++/97742
+// { dg-do compile { target c++20 } }
+
+template <int = requires { true        // { dg-error "expected" }