Skip to content

Commit 29cb5d4

Browse files
Merge pull request #20417 from npmccallum/syntax
parser: fix parsing of trait bound polarity and for-binders
2 parents 31db5b5 + 943b42f commit 29cb5d4

File tree

6 files changed

+73
-19
lines changed

6 files changed

+73
-19
lines changed

crates/parser/src/grammar/generic_params.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -182,12 +182,6 @@ fn type_bound(p: &mut Parser<'_>) -> bool {
182182
);
183183
m.complete(p, USE_BOUND_GENERIC_ARGS);
184184
}
185-
T![?] if p.nth_at(1, T![for]) => {
186-
// test question_for_type_trait_bound
187-
// fn f<T>() where T: ?for<> Sized {}
188-
p.bump_any();
189-
types::for_type(p, false)
190-
}
191185
_ => {
192186
if path_type_bound(p).is_err() {
193187
m.abandon(p);
@@ -219,8 +213,13 @@ fn path_type_bound(p: &mut Parser<'_>) -> Result<(), ()> {
219213
// test async_trait_bound
220214
// fn async_foo(_: impl async Fn(&i32)) {}
221215
p.eat(T![async]);
216+
// test question_for_type_trait_bound
217+
// fn f<T>() where T: for<> ?Sized {}
222218
p.eat(T![?]);
223219

220+
// test_err invalid_question_for_type_trait_bound
221+
// fn f<T>() where T: ?for<> Sized {}
222+
224223
if paths::is_use_path_start(p) {
225224
types::path_type_bounds(p, false);
226225
// test_err type_bounds_macro_call_recovery

crates/parser/test_data/generated/runner.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -796,6 +796,12 @@ mod err {
796796
#[test]
797797
fn impl_type() { run_and_expect_errors("test_data/parser/inline/err/impl_type.rs"); }
798798
#[test]
799+
fn invalid_question_for_type_trait_bound() {
800+
run_and_expect_errors(
801+
"test_data/parser/inline/err/invalid_question_for_type_trait_bound.rs",
802+
);
803+
}
804+
#[test]
799805
fn let_else_right_curly_brace() {
800806
run_and_expect_errors("test_data/parser/inline/err/let_else_right_curly_brace.rs");
801807
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
SOURCE_FILE
2+
FN
3+
FN_KW "fn"
4+
WHITESPACE " "
5+
NAME
6+
IDENT "f"
7+
GENERIC_PARAM_LIST
8+
L_ANGLE "<"
9+
TYPE_PARAM
10+
NAME
11+
IDENT "T"
12+
R_ANGLE ">"
13+
PARAM_LIST
14+
L_PAREN "("
15+
R_PAREN ")"
16+
WHITESPACE " "
17+
WHERE_CLAUSE
18+
WHERE_KW "where"
19+
WHITESPACE " "
20+
WHERE_PRED
21+
PATH_TYPE
22+
PATH
23+
PATH_SEGMENT
24+
NAME_REF
25+
IDENT "T"
26+
COLON ":"
27+
WHITESPACE " "
28+
TYPE_BOUND_LIST
29+
QUESTION "?"
30+
WHERE_PRED
31+
FOR_BINDER
32+
FOR_KW "for"
33+
GENERIC_PARAM_LIST
34+
L_ANGLE "<"
35+
R_ANGLE ">"
36+
WHITESPACE " "
37+
PATH_TYPE
38+
PATH
39+
PATH_SEGMENT
40+
NAME_REF
41+
IDENT "Sized"
42+
WHITESPACE " "
43+
BLOCK_EXPR
44+
STMT_LIST
45+
L_CURLY "{"
46+
R_CURLY "}"
47+
WHITESPACE "\n"
48+
error 20: expected comma
49+
error 31: expected colon
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
fn f<T>() where T: ?for<> Sized {}

crates/parser/test_data/parser/inline/ok/question_for_type_trait_bound.rast

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,18 @@ SOURCE_FILE
2727
WHITESPACE " "
2828
TYPE_BOUND_LIST
2929
TYPE_BOUND
30+
FOR_BINDER
31+
FOR_KW "for"
32+
GENERIC_PARAM_LIST
33+
L_ANGLE "<"
34+
R_ANGLE ">"
35+
WHITESPACE " "
3036
QUESTION "?"
31-
FOR_TYPE
32-
FOR_BINDER
33-
FOR_KW "for"
34-
GENERIC_PARAM_LIST
35-
L_ANGLE "<"
36-
R_ANGLE ">"
37-
WHITESPACE " "
38-
PATH_TYPE
39-
PATH
40-
PATH_SEGMENT
41-
NAME_REF
42-
IDENT "Sized"
37+
PATH_TYPE
38+
PATH
39+
PATH_SEGMENT
40+
NAME_REF
41+
IDENT "Sized"
4342
WHITESPACE " "
4443
BLOCK_EXPR
4544
STMT_LIST
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
fn f<T>() where T: ?for<> Sized {}
1+
fn f<T>() where T: for<> ?Sized {}

0 commit comments

Comments
 (0)