The rule change in the title matches GCC's current behavior, so no change
was needed.  But the paper also makes 'typename' optional in a
requirement-parameter-list, so this implements that.

Tested x86_64-pc-linux-gnu, applying to trunk.

gcc/cp/ChangeLog
2020-02-28  Jason Merrill  <ja...@redhat.com>

        Implement P2092R0, Disambiguating Nested-Requirements
        * parser.c (cp_parser_requirement_parameter_list): Pass
        CP_PARSER_FLAGS_TYPENAME_OPTIONAL.
---
 gcc/cp/parser.c                             | 4 ++--
 gcc/testsuite/g++.dg/cpp2a/concepts-p2092.C | 8 ++++++++
 2 files changed, 10 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts-p2092.C

diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index ca85d899427..24f71671469 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -27716,8 +27716,8 @@ cp_parser_requirement_parameter_list (cp_parser *parser)
   if (!parens.require_open (parser))
     return error_mark_node;
 
-  tree parms
-    = cp_parser_parameter_declaration_clause (parser, CP_PARSER_FLAGS_NONE);
+  tree parms = (cp_parser_parameter_declaration_clause
+               (parser, CP_PARSER_FLAGS_TYPENAME_OPTIONAL));
 
   if (!parens.require_close (parser))
     return error_mark_node;
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-p2092.C 
b/gcc/testsuite/g++.dg/cpp2a/concepts-p2092.C
new file mode 100644
index 00000000000..f293581a75a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-p2092.C
@@ -0,0 +1,8 @@
+// P2092R0
+// { dg-do compile { target concepts } }
+
+template <class T>
+concept Bar = requires (T::type t) { ++t; };
+
+template <class T>
+concept Foo = requires { requires { T(); }; }; // { dg-error "" }

base-commit: 586b016cd48f5a5f6f2ba9f179105fabaa3e85dd
-- 
2.18.1

Reply via email to