diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 28f93328e9534..5b5ecc4147b67 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -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 `}`"); } diff --git a/src/test/ui/issue-49257.rs b/src/test/ui/issue-49257.rs index a319849223740..edb4037d109e5 100644 --- a/src/test/ui/issue-49257.rs +++ b/src/test/ui/issue-49257.rs @@ -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` } diff --git a/src/test/ui/issue-49257.stderr b/src/test/ui/issue-49257.stderr index fec990764bb14..6ca8d80fa2e09 100644 --- a/src/test/ui/issue-49257.stderr +++ b/src/test/ui/issue-49257.stderr @@ -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`.