Skip to content

Commit 2a7c583

Browse files
authored
fix(parse): permit unbraced initializer after requires (#477)
* fix(parse): permit unbraced initializer after requires * test: add `test-results/gcc-13`
1 parent 34b2af3 commit 2a7c583

6 files changed

+33
-3
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
f: <T> () requires std::regular<T> = g(T());
2+
main: () = { }

regression-tests/test-results/gcc-13/pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp.execution

Whitespace-only changes.

regression-tests/test-results/gcc-13/pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp.output

Whitespace-only changes.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
2+
#define CPP2_USE_MODULES Yes
3+
4+
//=== Cpp2 type declarations ====================================================
5+
6+
7+
#include "cpp2util.h"
8+
9+
10+
11+
//=== Cpp2 type definitions and function declarations ===========================
12+
13+
#line 1 "pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp2"
14+
template<typename T> auto f() -> void;
15+
auto main() -> int;
16+
17+
18+
//=== Cpp2 function definitions =================================================
19+
20+
#line 1 "pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp2"
21+
template<typename T> auto f() -> void
22+
requires (std::regular<T>)
23+
#line 1 "pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp2"
24+
{ g(T()); }
25+
auto main() -> int {}
26+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
pure2-bugfix-for-requires-clause-unbraced-function-initializer.cpp2... ok (all Cpp2, passes safety checks)
2+

source/parse.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2259,7 +2259,7 @@ struct declaration_node
22592259
std::vector<std::unique_ptr<id_expression_node>> meta_functions;
22602260
std::unique_ptr<parameter_declaration_list_node> template_parameters;
22612261
source_position requires_pos = {};
2262-
std::unique_ptr<expression_node> requires_clause_expression;
2262+
std::unique_ptr<logical_or_expression_node> requires_clause_expression;
22632263

22642264
source_position equal_sign = {};
22652265
std::unique_ptr<statement_node> initializer;
@@ -6211,7 +6211,7 @@ class parser
62116211
//G meta-functions-list '@' id-expression
62126212
//G
62136213
//G requires-clause:
6214-
//G 'requires' expression
6214+
//G 'requires' logical-or-expression
62156215
//G
62166216
//G template-parameter-declaration-list
62176217
//G '<' parameter-declaration-seq '>'
@@ -6469,7 +6469,7 @@ class parser
64696469
if (curr() == "requires") {
64706470
n->requires_pos = curr().position();
64716471
next();
6472-
auto e = expression();
6472+
auto e = logical_or_expression();
64736473
if (!e) {
64746474
error("'requires' must be followed by an expression");
64756475
return {};

0 commit comments

Comments
 (0)