diff --git a/compiler/rustc_parse/src/parser/mod.rs b/compiler/rustc_parse/src/parser/mod.rs index 748a8e2bb490f..2fa25e40c6b2f 100644 --- a/compiler/rustc_parse/src/parser/mod.rs +++ b/compiler/rustc_parse/src/parser/mod.rs @@ -703,6 +703,8 @@ impl<'a> Parser<'a> { let mut recovered = false; let mut trailing = false; let mut v = vec![]; + let unclosed_delims = !self.unclosed_delims.is_empty(); + while !self.expect_any_with_type(kets, expect) { if let token::CloseDelim(..) | token::Eof = self.token.kind { break; @@ -723,7 +725,7 @@ impl<'a> Parser<'a> { // Attempt to keep parsing if it was a similar separator. if let Some(ref tokens) = t.similar_tokens() { - if tokens.contains(&self.token.kind) { + if tokens.contains(&self.token.kind) && !unclosed_delims { self.bump(); } } diff --git a/src/test/ui/parser/issue-63116.stderr b/src/test/ui/parser/issue-63116.stderr index e249a93df92a2..4766dfafea1c9 100644 --- a/src/test/ui/parser/issue-63116.stderr +++ b/src/test/ui/parser/issue-63116.stderr @@ -12,11 +12,11 @@ error: expected one of `!`, `(`, `)`, `+`, `,`, `::`, or `<`, found `;` LL | impl W `, `...`, `::`, `:`, `<`, `=`, `>`, `?`, `[`, `_`, `async`, `const`, `dyn`, `extern`, `fn`, `for`, `impl`, `unsafe`, lifetime, or path, found `;` - --> $DIR/issue-63116.rs:3:15 +error: mismatched closing delimiter: `]` + --> $DIR/issue-63116.rs:3:16 | LL | impl W $DIR/use-unclosed-brace.rs:26:51 + --> $DIR/use-unclosed-brace.rs:12:14 | LL | use foo::{bar, baz; | - unclosed delimiter ... -LL | - | ^ - -error: expected identifier, found keyword `use` - --> $DIR/use-unclosed-brace.rs:4:1 - | -LL | use std::fmt::Display; - | ^^^ expected identifier, found keyword +LL | fn main() {} + | ^ error: expected one of `,`, `::`, `as`, or `}`, found `;` - --> $DIR/use-unclosed-brace.rs:1:19 + --> $DIR/use-unclosed-brace.rs:4:19 | LL | use foo::{bar, baz; - | - ^ expected one of `,`, `::`, `as`, or `}` - | | + | - ^ + | | | + | | expected one of `,`, `::`, `as`, or `}` + | | help: `}` may belong here | unclosed delimiter - | -help: `}` may belong here - | -LL | use foo::{bar, baz}; - | ^ -help: missing `,` - | -LL | use foo::{bar, baz,; - | ^ - -error: expected one of `,`, `::`, `as`, or `}`, found `std` - --> $DIR/use-unclosed-brace.rs:4:5 - | -LL | use std::fmt::Display; - | -^^^ expected one of `,`, `::`, `as`, or `}` - | | - | help: missing `,` - -error: expected identifier, found keyword `mod` - --> $DIR/use-unclosed-brace.rs:9:1 - | -LL | mod bar { } - | ^^^ expected identifier, found keyword - -error: expected one of `,`, `::`, `as`, or `}`, found `;` - --> $DIR/use-unclosed-brace.rs:4:22 - | -LL | use std::fmt::Display; - | ^ - | | - | expected one of `,`, `::`, `as`, or `}` - | help: missing `,` - -error: expected one of `,`, `::`, `as`, or `}`, found `bar` - --> $DIR/use-unclosed-brace.rs:9:5 - | -LL | mod bar { } - | -^^^ expected one of `,`, `::`, `as`, or `}` - | | - | help: missing `,` - -error: expected one of `,`, `::`, `as`, or `}`, found `{` - --> $DIR/use-unclosed-brace.rs:9:9 - | -LL | mod bar { } - | -^ expected one of `,`, `::`, `as`, or `}` - | | - | help: missing `,` - -error: expected identifier, found keyword `mod` - --> $DIR/use-unclosed-brace.rs:14:1 - | -LL | mod baz { } - | ^^^ expected identifier, found keyword - -error: expected one of `,` or `}`, found keyword `mod` - --> $DIR/use-unclosed-brace.rs:14:1 - | -LL | mod bar { } - | - - | | - | expected one of `,` or `}` - | help: missing `,` -... -LL | mod baz { } - | ^^^ unexpected token - -error: expected one of `,`, `::`, `as`, or `}`, found `baz` - --> $DIR/use-unclosed-brace.rs:14:5 - | -LL | mod baz { } - | -^^^ expected one of `,`, `::`, `as`, or `}` - | | - | help: missing `,` - -error: expected one of `,`, `::`, `as`, or `}`, found `{` - --> $DIR/use-unclosed-brace.rs:14:9 - | -LL | mod baz { } - | -^ expected one of `,`, `::`, `as`, or `}` - | | - | help: missing `,` - -error: expected identifier, found keyword `fn` - --> $DIR/use-unclosed-brace.rs:20:1 - | -LL | fn main() {} - | ^^ expected identifier, found keyword - -error: expected one of `,` or `}`, found keyword `fn` - --> $DIR/use-unclosed-brace.rs:20:1 - | -LL | mod baz { } - | - - | | - | expected one of `,` or `}` - | help: missing `,` -... -LL | fn main() {} - | ^^ unexpected token - -error: expected one of `,`, `::`, `as`, or `}`, found `main` - --> $DIR/use-unclosed-brace.rs:20:4 - | -LL | fn main() {} - | -^^^^ expected one of `,`, `::`, `as`, or `}` - | | - | help: missing `,` -error: expected one of `,`, `::`, `as`, or `}`, found `(` - --> $DIR/use-unclosed-brace.rs:20:8 +error: expected item, found `}` + --> $DIR/use-unclosed-brace.rs:12:14 | LL | fn main() {} - | ^ expected one of `,`, `::`, `as`, or `}` + | ^ expected item -error: aborting due to 16 previous errors +error: aborting due to 3 previous errors