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>, "");