Skip to content

Commit

Permalink
Accept .. in incorrect position to avoid further errors
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
estebank committed Jun 5, 2018
1 parent 41affd0 commit 8f4a542
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 8 deletions.
10 changes: 10 additions & 0 deletions src/libsyntax/parse/parser.rs
Expand Up @@ -3749,6 +3749,16 @@ impl<'a> Parser<'a> {
err.span_label(self.span,
"`..` must be in the last position, \
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 {
err.span_label(self.span, "expected `}`");
}
Expand Down
1 change: 0 additions & 1 deletion src/test/ui/issue-49257.rs
Expand Up @@ -18,5 +18,4 @@ struct Point { x: u8, y: u8 }
fn main() {
let p = Point { x: 0, y: 0 };
let Point { .., y } = p; //~ ERROR expected `}`, found `,`
//~| ERROR pattern does not mention fields `x`, `y`
}
8 changes: 1 addition & 7 deletions src/test/ui/issue-49257.stderr
Expand Up @@ -4,12 +4,6 @@ error: expected `}`, found `,`
LL | let Point { .., y } = p; //~ ERROR expected `}`, found `,`
| ^ `..` must be in the last position, and cannot have a trailing comma

error[E0027]: pattern does not mention fields `x`, `y`
--> $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
error: aborting due to previous error

For more information about this error, try `rustc --explain E0027`.

0 comments on commit 8f4a542

Please sign in to comment.