Accept ..
in incorrect position to avoid further errors
We currently give a specific message when encountering a `..` anywhere other than the end of a pattern. Modify the parser to accept it (while still emitting the error) so that we don't also trigger "missing fields in pattern" errors afterwards.
This commit is contained in:
parent
41affd03eb
commit
8f4a5429c2
3 changed files with 11 additions and 8 deletions
|
@ -3749,6 +3749,16 @@ impl<'a> Parser<'a> {
|
||||||
err.span_label(self.span,
|
err.span_label(self.span,
|
||||||
"`..` must be in the last position, \
|
"`..` must be in the last position, \
|
||||||
and cannot have a trailing comma");
|
and cannot have a trailing comma");
|
||||||
|
if self.look_ahead(1, |t| {
|
||||||
|
t == &token::CloseDelim(token::Brace) || t.is_ident()
|
||||||
|
}) {
|
||||||
|
// If the struct looks otherwise well formed, recover and continue.
|
||||||
|
// This way we avoid "pattern missing fields" errors afterwards.
|
||||||
|
err.emit();
|
||||||
|
self.bump();
|
||||||
|
etc = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
err.span_label(self.span, "expected `}`");
|
err.span_label(self.span, "expected `}`");
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,5 +18,4 @@ struct Point { x: u8, y: u8 }
|
||||||
fn main() {
|
fn main() {
|
||||||
let p = Point { x: 0, y: 0 };
|
let p = Point { x: 0, y: 0 };
|
||||||
let Point { .., y } = p; //~ ERROR expected `}`, found `,`
|
let Point { .., y } = p; //~ ERROR expected `}`, found `,`
|
||||||
//~| ERROR pattern does not mention fields `x`, `y`
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,12 +4,6 @@ error: expected `}`, found `,`
|
||||||
LL | let Point { .., y } = p; //~ ERROR expected `}`, found `,`
|
LL | let Point { .., y } = p; //~ ERROR expected `}`, found `,`
|
||||||
| ^ `..` must be in the last position, and cannot have a trailing comma
|
| ^ `..` must be in the last position, and cannot have a trailing comma
|
||||||
|
|
||||||
error[E0027]: pattern does not mention fields `x`, `y`
|
error: aborting due to previous error
|
||||||
--> $DIR/issue-49257.rs:20:9
|
|
||||||
|
|
|
||||||
LL | let Point { .., y } = p; //~ ERROR expected `}`, found `,`
|
|
||||||
| ^^^^^^^^^^^^^^^ missing fields `x`, `y`
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0027`.
|
For more information about this error, try `rustc --explain E0027`.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue