Skip to content

Commit 3ed80b3

Browse files
committed
fix(parse): permit unbraced initializer after requires
1 parent 9584fcc commit 3ed80b3

4 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: () = { }
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
@@ -1988,7 +1988,7 @@ struct declaration_node
19881988
std::vector<std::unique_ptr<id_expression_node>> meta_functions;
19891989
std::unique_ptr<parameter_declaration_list_node> template_parameters;
19901990
source_position requires_pos = {};
1991-
std::unique_ptr<expression_node> requires_clause_expression;
1991+
std::unique_ptr<logical_or_expression_node> requires_clause_expression;
19921992

19931993
source_position equal_sign = {};
19941994
std::unique_ptr<statement_node> initializer;
@@ -5865,7 +5865,7 @@ class parser
58655865
//G meta-functions-list '@' id-expression
58665866
//G
58675867
//G requires-clause:
5868-
//G 'requires' expression
5868+
//G 'requires' logical-or-expression
58695869
//G
58705870
//G template-parameter-declaration-list
58715871
//G '<' parameter-declaration-seq '>'
@@ -6112,7 +6112,7 @@ class parser
61126112
if (curr() == "requires") {
61136113
n->requires_pos = curr().position();
61146114
next();
6115-
auto e = expression();
6115+
auto e = logical_or_expression();
61166116
if (!e) {
61176117
error("'requires' must be followed by an expression");
61186118
return {};

0 commit comments

Comments
 (0)