Skip to content

Commit 0f427e9

Browse files
filipsajdakhsutter
andauthored
fix(parse): requires clause on one-liner and add error when used on non-template (#528)
* Fix parsing error of requires clause Add handling of lack of empty line after oneliner. Add parsing error when requires is used on non-template * Update parse.h Restrict new check to types --------- Co-authored-by: Herb Sutter <[email protected]>
1 parent 5665255 commit 0f427e9

File tree

3 files changed

+15
-6
lines changed

3 files changed

+15
-6
lines changed

regression-tests/test-results/pure2-requires-clauses.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111
template<typename T, typename U>
1212

1313
requires( std::is_same_v<T,int>
14-
&& std::is_same_v<U,int> )
15-
class X;
14+
&& std::is_same_v<U,int> )class X;
1615

1716
//=== Cpp2 type definitions and function declarations ===========================
1817

@@ -21,8 +20,8 @@ class X;
2120
template<typename T, typename U>
2221

2322
requires( std::is_same_v<T,int>
24-
&& std::is_same_v<U,int> )
25-
class X {
23+
&& std::is_same_v<U,int> )class X
24+
{
2625
public: explicit X();
2726

2827
public: X(X const&) = delete; /* No 'that' constructor, suppress copy */

source/cppfront.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5148,7 +5148,7 @@ class cppfront
51485148
if (n.requires_clause_expression) {
51495149
printer.print_cpp2("requires( ", n.requires_pos);
51505150
emit(*n.requires_clause_expression);
5151-
printer.print_cpp2(" )\n\n", n.requires_pos);
5151+
printer.print_cpp2(" )\n", n.requires_pos);
51525152
}
51535153

51545154
printer.print_cpp2("class ", n.position());

source/parse.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6510,7 +6510,17 @@ class parser
65106510
}
65116511

65126512
// Next is optionally a requires clause
6513-
if (curr() == "requires") {
6513+
if (curr() == "requires")
6514+
{
6515+
if (
6516+
n->is_type()
6517+
&& !n->template_parameters
6518+
)
6519+
{
6520+
error("'requires' is only valid for a type with a template parameter list");
6521+
return {};
6522+
}
6523+
65146524
n->requires_pos = curr().position();
65156525
next();
65166526
auto e = logical_or_expression();

0 commit comments

Comments
 (0)