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> {
|
) -> PResult<'a, ItemInfo> {
|
||||||
let impl_span = self.token.span;
|
let impl_span = self.token.span;
|
||||||
let mut err = self.expected_ident_found();
|
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 {
|
match impl_info.1 {
|
||||||
// only try to recover if this is implementing a trait for a type
|
|
||||||
ItemKind::Impl(box ImplKind {
|
ItemKind::Impl(box ImplKind {
|
||||||
of_trait: Some(ref trai), ref mut constness, ..
|
of_trait: Some(ref trai), ref mut constness, ..
|
||||||
}) => {
|
}) => {
|
||||||
|
@ -1030,6 +1039,7 @@ impl<'a> Parser<'a> {
|
||||||
ItemKind::Impl { .. } => return Err(err),
|
ItemKind::Impl { .. } => return Err(err),
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(impl_info)
|
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…
Add table
Add a link
Reference in a new issue