Skip to content

Commit d25197c

Browse files
authored
Rollup merge of #67269 - Centril:recover-lt-deref-pat, r=estebank
parser: recover on `&'lifetime mut? $pat`. r? @estebank
2 parents d2d5b83 + 45c1e38 commit d25197c

6 files changed

+55
-9
lines changed

src/librustc_parse/parser/pat.rs

+16-6
Original file line numberDiff line numberDiff line change
@@ -459,16 +459,26 @@ impl<'a> Parser<'a> {
459459
/// Parse `&pat` / `&mut pat`.
460460
fn parse_pat_deref(&mut self, expected: Expected) -> PResult<'a, PatKind> {
461461
self.expect_and()?;
462+
self.recover_lifetime_in_deref_pat();
462463
let mutbl = self.parse_mutability();
464+
let subpat = self.parse_pat_with_range_pat(false, expected)?;
465+
Ok(PatKind::Ref(subpat, mutbl))
466+
}
463467

468+
fn recover_lifetime_in_deref_pat(&mut self) {
464469
if let token::Lifetime(name) = self.token.kind {
465-
let mut err = self.fatal(&format!("unexpected lifetime `{}` in pattern", name));
466-
err.span_label(self.token.span, "unexpected lifetime");
467-
return Err(err);
468-
}
470+
self.bump(); // `'a`
469471

470-
let subpat = self.parse_pat_with_range_pat(false, expected)?;
471-
Ok(PatKind::Ref(subpat, mutbl))
472+
let span = self.prev_span;
473+
self.struct_span_err(span, &format!("unexpected lifetime `{}` in pattern", name))
474+
.span_suggestion(
475+
span,
476+
"remove the lifetime",
477+
String::new(),
478+
Applicability::MachineApplicable,
479+
)
480+
.emit();
481+
}
472482
}
473483

474484
/// Parse a tuple or parenthesis pattern.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
fn main() {
2+
let &'a x = &0; //~ ERROR unexpected lifetime `'a` in pattern
3+
let &'a mut y = &mut 0; //~ ERROR unexpected lifetime `'a` in pattern
4+
5+
let _recovery_witness: () = 0; //~ ERROR mismatched types
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
error: unexpected lifetime `'a` in pattern
2+
--> $DIR/lifetime-in-pattern-recover.rs:2:10
3+
|
4+
LL | let &'a x = &0;
5+
| ^^ help: remove the lifetime
6+
7+
error: unexpected lifetime `'a` in pattern
8+
--> $DIR/lifetime-in-pattern-recover.rs:3:10
9+
|
10+
LL | let &'a mut y = &mut 0;
11+
| ^^ help: remove the lifetime
12+
13+
error[E0308]: mismatched types
14+
--> $DIR/lifetime-in-pattern-recover.rs:5:33
15+
|
16+
LL | let _recovery_witness: () = 0;
17+
| -- ^ expected `()`, found integer
18+
| |
19+
| expected due to this
20+
21+
error: aborting due to 3 previous errors
22+
23+
For more information about this error, try `rustc --explain E0308`.

src/test/ui/parser/lifetime-in-pattern.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
fn test(&'a str) {
22
//~^ ERROR unexpected lifetime `'a` in pattern
3+
//~| ERROR expected one of `:`, `@`, or `|`, found `)`
34
}
45

56
fn main() {

src/test/ui/parser/lifetime-in-pattern.stderr

+8-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,13 @@ error: unexpected lifetime `'a` in pattern
22
--> $DIR/lifetime-in-pattern.rs:1:10
33
|
44
LL | fn test(&'a str) {
5-
| ^^ unexpected lifetime
5+
| ^^ help: remove the lifetime
66

7-
error: aborting due to previous error
7+
error: expected one of `:`, `@`, or `|`, found `)`
8+
--> $DIR/lifetime-in-pattern.rs:1:16
9+
|
10+
LL | fn test(&'a str) {
11+
| ^ expected one of `:`, `@`, or `|`
12+
13+
error: aborting due to 2 previous errors
814

src/test/ui/self/self-vs-path-ambiguity.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ error: unexpected lifetime `'a` in pattern
22
--> $DIR/self-vs-path-ambiguity.rs:9:11
33
|
44
LL | fn i(&'a self::S: &S) {}
5-
| ^^ unexpected lifetime
5+
| ^^ help: remove the lifetime
66

77
error: aborting due to previous error
88

0 commit comments

Comments
 (0)