Hi,

a simple issue, we weren't correctly implementing 7.5.7.4 on the terminating semicolon. Tested x86_64-linux.

Thanks, Paolo.

///////////////////

/cp
2018-10-03  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/71140
        * parser.c (cp_parser_compound_requirement): Require a terminating
        semicolon, per 7.5.7.4.

/testsuite
2018-10-03  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/71140
        * g++.dg/concepts/pr71140.C: New.
        * g++.dg/concepts/pr67595.C: Adjust.
Index: cp/parser.c
===================================================================
--- cp/parser.c (revision 264805)
+++ cp/parser.c (working copy)
@@ -26110,10 +26114,11 @@ cp_parser_compound_requirement (cp_parser *parser)
   return finish_compound_requirement (expr, type, noexcept_p);
 }
 
-/* Parse a nested requirement. This is the same as a requires clause.
+/* Parse a nested requirement. This is the same as a requires clause followed
+   by a semicolon.
 
    nested-requirement:
-     requires-clause */
+     requires-clause ';' */
 static tree
 cp_parser_nested_requirement (cp_parser *parser)
 {
@@ -26121,6 +26126,9 @@ cp_parser_nested_requirement (cp_parser *parser)
   tree req = cp_parser_requires_clause (parser);
   if (req == error_mark_node)
     return error_mark_node;
+
+  cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
+
   return finish_nested_requirement (req);
 }
 
Index: testsuite/g++.dg/concepts/pr67595.C
===================================================================
--- testsuite/g++.dg/concepts/pr67595.C (revision 264805)
+++ testsuite/g++.dg/concepts/pr67595.C (working copy)
@@ -2,7 +2,7 @@
 
 template <class X> concept bool allocatable = requires{{new X}->X * };
 template <class X> concept bool semiregular = allocatable<X>;
-template <class X> concept bool readable = requires{requires semiregular<X>};
+template <class X> concept bool readable = requires{requires semiregular<X>;};
 template <class> int weak_input_iterator = requires{{0}->readable};
 template <class X> bool input_iterator{weak_input_iterator<X>}; // { 
dg-warning "narrowing conversion" }
 template <class X> bool forward_iterator{input_iterator<X>};
Index: testsuite/g++.dg/concepts/pr71140.C
===================================================================
--- testsuite/g++.dg/concepts/pr71140.C (nonexistent)
+++ testsuite/g++.dg/concepts/pr71140.C (working copy)
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++14 } }
+// { dg-additional-options "-fconcepts" }
+
+template<typename T>
+concept bool C = requires(T t) {
+  requires true  // { dg-error "expected .\;. before .\}. token" }
+};
+static_assert(C<int>, "");

Reply via email to