Skip to content

Commit 1554ce3

Browse files
committed
fix(parse): do not begin terse function expression with requires
1 parent bbd104e commit 1554ce3

File tree

3 files changed

+18
-1
lines changed

3 files changed

+18
-1
lines changed

regression-tests/pure2-requires-clauses.cpp2

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ f: <T: type, U: type>
1717

1818
v: <T> const T requires std::same_as<T, i32> = 0;
1919

20+
g: <T> () requires true = { }
21+
g: () (requires { _ = 0; });
22+
2023
main: () = {
2124
x: X<int,int> = ();
2225
std::cout << f<int,int>(2,5);

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ CPP2_REQUIRES_ (std::same_as<T,cpp2::i32>)
4242
#line 18 "pure2-requires-clauses.cpp2"
4343
extern T const v;
4444

45+
template<typename T> auto g() -> void
46+
CPP2_REQUIRES (true)
47+
#line 20 "pure2-requires-clauses.cpp2"
48+
;
49+
[[nodiscard]] auto g() -> auto;
50+
4551
auto main() -> int;
4652

4753

@@ -66,6 +72,12 @@ requires (std::same_as<T,cpp2::i32>)
6672
#line 18 "pure2-requires-clauses.cpp2"
6773
T const v {0};
6874

75+
template<typename T> auto g() -> void
76+
requires (true)
77+
#line 20 "pure2-requires-clauses.cpp2"
78+
{}
79+
[[nodiscard]] auto g() -> auto { return requires {0;
80+
}; }
6981
auto main() -> int{
7082
X<int,int> x {};
7183
std::cout << f<int,int>(2, 5);

source/parse.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7816,7 +7816,9 @@ class parser
78167816
if (curr().type() != lexeme::Arrow)
78177817
{
78187818
auto start_pos = pos;
7819-
auto at_an_expression_statement = expression_statement(true) != nullptr;
7819+
auto at_an_expression_statement =
7820+
curr() != "requires"
7821+
&& expression_statement(true) != nullptr;
78207822
pos = start_pos; // backtrack no matter what, we're just peeking here
78217823

78227824
if (at_an_expression_statement) {

0 commit comments

Comments
 (0)