Skip to content

Commit f6188ca

Browse files
committed
Fix parsing lambdas with return type
We should eat only a single block, and not whatever larger expression may start with a block. closes #3721
1 parent 785eb32 commit f6188ca

File tree

4 files changed

+75
-21
lines changed

4 files changed

+75
-21
lines changed

crates/ra_parser/src/grammar/expressions/atom.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -230,14 +230,20 @@ fn lambda_expr(p: &mut Parser) -> CompletedMarker {
230230
p.eat(T![async]);
231231
p.eat(T![move]);
232232
params::param_list_closure(p);
233-
if opt_fn_ret_type(p) && !p.at(T!['{']) {
234-
p.error("expected `{`");
235-
}
236-
237-
if p.at_ts(EXPR_FIRST) {
238-
expr(p);
233+
if opt_fn_ret_type(p) {
234+
if p.at(T!['{']) {
235+
// test lambda_ret_block
236+
// fn main() { || -> i32 { 92 }(); }
237+
block_expr(p, None);
238+
} else {
239+
p.error("expected `{`");
240+
}
239241
} else {
240-
p.error("expected expression");
242+
if p.at_ts(EXPR_FIRST) {
243+
expr(p);
244+
} else {
245+
p.error("expected expression");
246+
}
241247
}
242248
m.complete(p, LAMBDA_EXPR)
243249
}

crates/ra_syntax/test_data/parser/err/0010_unsafe_lambda_block.txt

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ SOURCE_FILE@[0; 42)
1212
BLOCK@[10; 41)
1313
L_CURLY@[10; 11) "{"
1414
WHITESPACE@[11; 16) "\n "
15-
EXPR_STMT@[16; 39)
16-
LAMBDA_EXPR@[16; 38)
15+
EXPR_STMT@[16; 24)
16+
LAMBDA_EXPR@[16; 24)
1717
PARAM_LIST@[16; 18)
1818
PIPE@[16; 17) "|"
1919
PIPE@[17; 18) "|"
@@ -24,20 +24,22 @@ SOURCE_FILE@[0; 42)
2424
TUPLE_TYPE@[22; 24)
2525
L_PAREN@[22; 23) "("
2626
R_PAREN@[23; 24) ")"
27-
WHITESPACE@[24; 25) " "
28-
BLOCK_EXPR@[25; 38)
29-
UNSAFE_KW@[25; 31) "unsafe"
30-
WHITESPACE@[31; 32) " "
31-
BLOCK@[32; 38)
32-
L_CURLY@[32; 33) "{"
33-
WHITESPACE@[33; 34) " "
34-
TUPLE_EXPR@[34; 36)
35-
L_PAREN@[34; 35) "("
36-
R_PAREN@[35; 36) ")"
37-
WHITESPACE@[36; 37) " "
38-
R_CURLY@[37; 38) "}"
27+
WHITESPACE@[24; 25) " "
28+
EXPR_STMT@[25; 39)
29+
BLOCK_EXPR@[25; 38)
30+
UNSAFE_KW@[25; 31) "unsafe"
31+
WHITESPACE@[31; 32) " "
32+
BLOCK@[32; 38)
33+
L_CURLY@[32; 33) "{"
34+
WHITESPACE@[33; 34) " "
35+
TUPLE_EXPR@[34; 36)
36+
L_PAREN@[34; 35) "("
37+
R_PAREN@[35; 36) ")"
38+
WHITESPACE@[36; 37) " "
39+
R_CURLY@[37; 38) "}"
3940
SEMI@[38; 39) ";"
4041
WHITESPACE@[39; 40) "\n"
4142
R_CURLY@[40; 41) "}"
4243
WHITESPACE@[41; 42) "\n"
4344
error [24; 24): expected `{`
45+
error [24; 24): expected SEMI
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
fn main() { || -> i32 { 92 }(); }
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
SOURCE_FILE@[0; 34)
2+
FN_DEF@[0; 33)
3+
FN_KW@[0; 2) "fn"
4+
WHITESPACE@[2; 3) " "
5+
NAME@[3; 7)
6+
IDENT@[3; 7) "main"
7+
PARAM_LIST@[7; 9)
8+
L_PAREN@[7; 8) "("
9+
R_PAREN@[8; 9) ")"
10+
WHITESPACE@[9; 10) " "
11+
BLOCK_EXPR@[10; 33)
12+
BLOCK@[10; 33)
13+
L_CURLY@[10; 11) "{"
14+
WHITESPACE@[11; 12) " "
15+
EXPR_STMT@[12; 31)
16+
CALL_EXPR@[12; 30)
17+
LAMBDA_EXPR@[12; 28)
18+
PARAM_LIST@[12; 14)
19+
PIPE@[12; 13) "|"
20+
PIPE@[13; 14) "|"
21+
WHITESPACE@[14; 15) " "
22+
RET_TYPE@[15; 21)
23+
THIN_ARROW@[15; 17) "->"
24+
WHITESPACE@[17; 18) " "
25+
PATH_TYPE@[18; 21)
26+
PATH@[18; 21)
27+
PATH_SEGMENT@[18; 21)
28+
NAME_REF@[18; 21)
29+
IDENT@[18; 21) "i32"
30+
WHITESPACE@[21; 22) " "
31+
BLOCK_EXPR@[22; 28)
32+
BLOCK@[22; 28)
33+
L_CURLY@[22; 23) "{"
34+
WHITESPACE@[23; 24) " "
35+
LITERAL@[24; 26)
36+
INT_NUMBER@[24; 26) "92"
37+
WHITESPACE@[26; 27) " "
38+
R_CURLY@[27; 28) "}"
39+
ARG_LIST@[28; 30)
40+
L_PAREN@[28; 29) "("
41+
R_PAREN@[29; 30) ")"
42+
SEMI@[30; 31) ";"
43+
WHITESPACE@[31; 32) " "
44+
R_CURLY@[32; 33) "}"
45+
WHITESPACE@[33; 34) "\n"

0 commit comments

Comments
 (0)