Skip to content

Commit 01d8ec0

Browse files
luca-barbieriYour Name
authored andcommitted
Parse correctly fn f<T>() where T: Fn() -> u8 + Send {}
We used to parse it as T: Fn() -> (u8 + Send), which is different from the rustc behavior of T: (Fn() -> u8) + Send
1 parent 48f1385 commit 01d8ec0

File tree

3 files changed

+63
-1
lines changed

3 files changed

+63
-1
lines changed

crates/ra_parser/src/grammar.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ fn opt_fn_ret_type(p: &mut Parser) -> bool {
245245
if p.at(T![->]) {
246246
let m = p.start();
247247
p.bump(T![->]);
248-
types::type_(p);
248+
types::type_no_bounds(p);
249249
m.complete(p, RET_TYPE);
250250
true
251251
} else {
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
fn f<T>() where T: Fn() -> u8 + Send {}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
SOURCE_FILE@[0; 40)
2+
FN_DEF@[0; 39)
3+
FN_KW@[0; 2) "fn"
4+
WHITESPACE@[2; 3) " "
5+
NAME@[3; 4)
6+
IDENT@[3; 4) "f"
7+
TYPE_PARAM_LIST@[4; 7)
8+
L_ANGLE@[4; 5) "<"
9+
TYPE_PARAM@[5; 6)
10+
NAME@[5; 6)
11+
IDENT@[5; 6) "T"
12+
R_ANGLE@[6; 7) ">"
13+
PARAM_LIST@[7; 9)
14+
L_PAREN@[7; 8) "("
15+
R_PAREN@[8; 9) ")"
16+
WHITESPACE@[9; 10) " "
17+
WHERE_CLAUSE@[10; 36)
18+
WHERE_KW@[10; 15) "where"
19+
WHITESPACE@[15; 16) " "
20+
WHERE_PRED@[16; 36)
21+
PATH_TYPE@[16; 17)
22+
PATH@[16; 17)
23+
PATH_SEGMENT@[16; 17)
24+
NAME_REF@[16; 17)
25+
IDENT@[16; 17) "T"
26+
COLON@[17; 18) ":"
27+
WHITESPACE@[18; 19) " "
28+
TYPE_BOUND_LIST@[19; 36)
29+
TYPE_BOUND@[19; 29)
30+
PATH_TYPE@[19; 29)
31+
PATH@[19; 29)
32+
PATH_SEGMENT@[19; 29)
33+
NAME_REF@[19; 21)
34+
IDENT@[19; 21) "Fn"
35+
PARAM_LIST@[21; 23)
36+
L_PAREN@[21; 22) "("
37+
R_PAREN@[22; 23) ")"
38+
WHITESPACE@[23; 24) " "
39+
RET_TYPE@[24; 29)
40+
THIN_ARROW@[24; 26) "->"
41+
WHITESPACE@[26; 27) " "
42+
PATH_TYPE@[27; 29)
43+
PATH@[27; 29)
44+
PATH_SEGMENT@[27; 29)
45+
NAME_REF@[27; 29)
46+
IDENT@[27; 29) "u8"
47+
WHITESPACE@[29; 30) " "
48+
PLUS@[30; 31) "+"
49+
WHITESPACE@[31; 32) " "
50+
TYPE_BOUND@[32; 36)
51+
PATH_TYPE@[32; 36)
52+
PATH@[32; 36)
53+
PATH_SEGMENT@[32; 36)
54+
NAME_REF@[32; 36)
55+
IDENT@[32; 36) "Send"
56+
WHITESPACE@[36; 37) " "
57+
BLOCK_EXPR@[37; 39)
58+
BLOCK@[37; 39)
59+
L_CURLY@[37; 38) "{"
60+
R_CURLY@[38; 39) "}"
61+
WHITESPACE@[39; 40) "\n"

0 commit comments

Comments
 (0)