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:
parent
0b7a598e12
commit
6eb1bd4c3e
3 changed files with 34 additions and 2 deletions
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue