mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-28 02:57:37 +00:00
Rollup merge of #81876 - osa1:issue81806, r=matthewjasper
parser: Fix panic in 'const impl' recovery The panic happens when in recovery parsing a full `impl` (`parse_item_impl`) fails and we drop the `DiagnosticBuilder` for the recovery suggestion and return the `parse_item_impl` error. We now raise the original error "expected identifier found `impl`" when parsing the `impl` fails. Note that the regression test is slightly simplified version of the original repro in #81806, to make the error output smaller and more resilient to unrelated changes in parser error messages. Fixes #81806
This commit is contained in:
commit
9ab05b4fe3
@ -1010,9 +1010,18 @@ impl<'a> Parser<'a> {
|
||||
) -> PResult<'a, ItemInfo> {
|
||||
let impl_span = self.token.span;
|
||||
let mut err = self.expected_ident_found();
|
||||
let mut impl_info = self.parse_item_impl(attrs, defaultness)?;
|
||||
|
||||
// Only try to recover if this is implementing a trait for a type
|
||||
let mut impl_info = match self.parse_item_impl(attrs, defaultness) {
|
||||
Ok(impl_info) => impl_info,
|
||||
Err(mut recovery_error) => {
|
||||
// Recovery failed, raise the "expected identifier" error
|
||||
recovery_error.cancel();
|
||||
return Err(err);
|
||||
}
|
||||
};
|
||||
|
||||
match impl_info.1 {
|
||||
// only try to recover if this is implementing a trait for a type
|
||||
ItemKind::Impl(box ImplKind {
|
||||
of_trait: Some(ref trai), ref mut constness, ..
|
||||
}) => {
|
||||
@ -1030,6 +1039,7 @@ impl<'a> Parser<'a> {
|
||||
ItemKind::Impl { .. } => return Err(err),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
|
||||
Ok(impl_info)
|
||||
}
|
||||
|
||||
|
5
src/test/ui/parser/issue-81806.rs
Normal file
5
src/test/ui/parser/issue-81806.rs
Normal file
@ -0,0 +1,5 @@
|
||||
trait T { const
|
||||
impl //~ ERROR: expected identifier, found keyword `impl`
|
||||
}
|
||||
|
||||
fn main() {}
|
17
src/test/ui/parser/issue-81806.stderr
Normal file
17
src/test/ui/parser/issue-81806.stderr
Normal file
@ -0,0 +1,17 @@
|
||||
error: expected identifier, found keyword `impl`
|
||||
--> $DIR/issue-81806.rs:2:1
|
||||
|
|
||||
LL | trait T { const
|
||||
| - while parsing this item list starting here
|
||||
LL | impl
|
||||
| ^^^^ expected identifier, found keyword
|
||||
LL | }
|
||||
| - the item list ends here
|
||||
|
|
||||
help: you can escape reserved keywords to use them as identifiers
|
||||
|
|
||||
LL | r#impl
|
||||
| ^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
Loading…
Reference in New Issue
Block a user