Skip to content

Commit e78b619

Browse files
authored
Rollup merge of #142362 - Veykril:push-rzmrsswqourz, r=oli-obk
Add expectation for `{` when parsing lone coroutine qualifiers Fixes #80931
2 parents e2846d6 + edc405d commit e78b619

File tree

6 files changed

+38
-32
lines changed

6 files changed

+38
-32
lines changed

compiler/rustc_parse/src/parser/expr.rs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1520,22 +1520,20 @@ impl<'a> Parser<'a> {
15201520
Ok(this.mk_expr(this.prev_token.span, ExprKind::Underscore))
15211521
} else if this.token_uninterpolated_span().at_least_rust_2018() {
15221522
// `Span::at_least_rust_2018()` is somewhat expensive; don't get it repeatedly.
1523+
let at_async = this.check_keyword(exp!(Async));
1524+
// check for `gen {}` and `gen move {}`
1525+
// or `async gen {}` and `async gen move {}`
1526+
// FIXME: (async) gen closures aren't yet parsed.
1527+
// FIXME(gen_blocks): Parse `gen async` and suggest swap
15231528
if this.token_uninterpolated_span().at_least_rust_2024()
1524-
// check for `gen {}` and `gen move {}`
1525-
// or `async gen {}` and `async gen move {}`
1526-
&& (this.is_gen_block(kw::Gen, 0)
1527-
|| (this.check_keyword(exp!(Async)) && this.is_gen_block(kw::Gen, 1)))
1529+
&& this.is_gen_block(kw::Gen, at_async as usize)
15281530
{
1529-
// FIXME: (async) gen closures aren't yet parsed.
15301531
this.parse_gen_block()
1531-
} else if this.check_keyword(exp!(Async)) {
1532-
// FIXME(gen_blocks): Parse `gen async` and suggest swap
1533-
if this.is_gen_block(kw::Async, 0) {
1534-
// Check for `async {` and `async move {`,
1535-
this.parse_gen_block()
1536-
} else {
1537-
this.parse_expr_closure()
1538-
}
1532+
// Check for `async {` and `async move {`,
1533+
} else if this.is_gen_block(kw::Async, 0) {
1534+
this.parse_gen_block()
1535+
} else if at_async {
1536+
this.parse_expr_closure()
15391537
} else if this.eat_keyword_noexpect(kw::Await) {
15401538
this.recover_incorrect_await_syntax(lo)
15411539
} else {
@@ -2407,6 +2405,14 @@ impl<'a> Parser<'a> {
24072405
None
24082406
};
24092407

2408+
if let ClosureBinder::NotPresent = binder
2409+
&& coroutine_kind.is_some()
2410+
{
2411+
// coroutine closures and generators can have the same qualifiers, so we might end up
2412+
// in here if there is a missing `|` but also no `{`. Adjust the expectations in that case.
2413+
self.expected_token_types.insert(TokenType::OpenBrace);
2414+
}
2415+
24102416
let capture_clause = self.parse_capture_clause()?;
24112417
let (fn_decl, fn_arg_span) = self.parse_fn_block_decl()?;
24122418
let decl_hi = self.prev_token.span;

tests/ui/editions/edition-keywords-2018-2015-parsing.stderr

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,22 +44,22 @@ note: while trying to match `r#async`
4444
LL | (r#async) => (1)
4545
| ^^^^^^^
4646

47-
error: macro expansion ends with an incomplete expression: expected one of `move`, `use`, `|`, or `||`
47+
error: macro expansion ends with an incomplete expression: expected one of `move`, `use`, `{`, `|`, or `||`
4848
--> $DIR/auxiliary/edition-kw-macro-2015.rs:27:23
4949
|
5050
LL | ($i: ident) => ($i)
51-
| ^ expected one of `move`, `use`, `|`, or `||`
51+
| ^ expected one of `move`, `use`, `{`, `|`, or `||`
5252
|
5353
::: $DIR/edition-keywords-2018-2015-parsing.rs:22:8
5454
|
5555
LL | if passes_ident!(async) == 1 {} // FIXME: Edition hygiene bug, async here is 2018 and reserved
5656
| -------------------- in this macro invocation
5757

58-
error: macro expansion ends with an incomplete expression: expected one of `move`, `use`, `|`, or `||`
58+
error: macro expansion ends with an incomplete expression: expected one of `move`, `use`, `{`, `|`, or `||`
5959
--> $DIR/edition-keywords-2018-2015-parsing.rs:24:24
6060
|
6161
LL | if passes_tt!(async) == 1 {}
62-
| ^ expected one of `move`, `use`, `|`, or `||`
62+
| ^ expected one of `move`, `use`, `{`, `|`, or `||`
6363

6464
error[E0308]: mismatched types
6565
--> $DIR/edition-keywords-2018-2015-parsing.rs:29:33

tests/ui/editions/edition-keywords-2018-2018-parsing.stderr

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,34 +44,34 @@ note: while trying to match `r#async`
4444
LL | (r#async) => (1)
4545
| ^^^^^^^
4646

47-
error: macro expansion ends with an incomplete expression: expected one of `move`, `use`, `|`, or `||`
47+
error: macro expansion ends with an incomplete expression: expected one of `move`, `use`, `{`, `|`, or `||`
4848
--> $DIR/auxiliary/edition-kw-macro-2018.rs:27:23
4949
|
5050
LL | ($i: ident) => ($i)
51-
| ^ expected one of `move`, `use`, `|`, or `||`
51+
| ^ expected one of `move`, `use`, `{`, `|`, or `||`
5252
|
5353
::: $DIR/edition-keywords-2018-2018-parsing.rs:29:8
5454
|
5555
LL | if passes_ident!(async) == 1 {} // FIXME: Edition hygiene bug, async here is 2018 and reserved
5656
| -------------------- in this macro invocation
5757

58-
error: macro expansion ends with an incomplete expression: expected one of `move`, `use`, `|`, or `||`
58+
error: macro expansion ends with an incomplete expression: expected one of `move`, `use`, `{`, `|`, or `||`
5959
--> $DIR/edition-keywords-2018-2018-parsing.rs:31:24
6060
|
6161
LL | if passes_tt!(async) == 1 {}
62-
| ^ expected one of `move`, `use`, `|`, or `||`
62+
| ^ expected one of `move`, `use`, `{`, `|`, or `||`
6363

64-
error: macro expansion ends with an incomplete expression: expected one of `move`, `use`, `|`, or `||`
64+
error: macro expansion ends with an incomplete expression: expected one of `move`, `use`, `{`, `|`, or `||`
6565
--> $DIR/edition-keywords-2018-2018-parsing.rs:14:23
6666
|
6767
LL | ($i: ident) => ($i)
68-
| ^ expected one of `move`, `use`, `|`, or `||`
68+
| ^ expected one of `move`, `use`, `{`, `|`, or `||`
6969

70-
error: macro expansion ends with an incomplete expression: expected one of `move`, `use`, `|`, or `||`
70+
error: macro expansion ends with an incomplete expression: expected one of `move`, `use`, `{`, `|`, or `||`
7171
--> $DIR/edition-keywords-2018-2018-parsing.rs:35:30
7272
|
7373
LL | if local_passes_tt!(async) == 1 {}
74-
| ^ expected one of `move`, `use`, `|`, or `||`
74+
| ^ expected one of `move`, `use`, `{`, `|`, or `||`
7575

7676
error[E0308]: mismatched types
7777
--> $DIR/edition-keywords-2018-2018-parsing.rs:40:33

tests/ui/parser/block-no-opening-brace.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ fn in_try() {
2727
let x = 0;
2828
}
2929

30-
// FIXME(#80931)
3130
fn in_async() {
3231
async
33-
let x = 0; //~ ERROR expected one of `move`, `use`, `|`, or `||`, found keyword `let`
32+
let x = 0;
33+
//~^ ERROR expected one of `move`, `use`, `{`, `|`, or `||`, found keyword `let`
3434
}
3535

3636
// FIXME(#78168)

tests/ui/parser/block-no-opening-brace.stderr

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,11 @@ error: expected expression, found reserved keyword `try`
4343
LL | try
4444
| ^^^ expected expression
4545

46-
error: expected one of `move`, `use`, `|`, or `||`, found keyword `let`
47-
--> $DIR/block-no-opening-brace.rs:33:9
46+
error: expected one of `move`, `use`, `{`, `|`, or `||`, found keyword `let`
47+
--> $DIR/block-no-opening-brace.rs:32:9
4848
|
4949
LL | async
50-
| - expected one of `move`, `use`, `|`, or `||`
50+
| - expected one of `move`, `use`, `{`, `|`, or `||`
5151
LL | let x = 0;
5252
| ^^^ unexpected token
5353

tests/ui/parser/misspelled-keywords/async-move.stderr

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
error: expected one of `move`, `use`, `|`, or `||`, found `Move`
1+
error: expected one of `move`, `use`, `{`, `|`, or `||`, found `Move`
22
--> $DIR/async-move.rs:4:11
33
|
44
LL | async Move {}
5-
| ^^^^ expected one of `move`, `use`, `|`, or `||`
5+
| ^^^^ expected one of `move`, `use`, `{`, `|`, or `||`
66
|
77
help: write keyword `move` in lowercase
88
|

0 commit comments

Comments
 (0)