Skip to content

Commit

Permalink
Rollup merge of #81876 - osa1:issue81806, r=matthewjasper
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Dylan-DPC committed Feb 9, 2021
2 parents a63085d + 6eb1bd4 commit 9ab05b4
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 2 deletions.
14 changes: 12 additions & 2 deletions compiler/rustc_parse/src/parser/item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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, ..
}) => {
Expand All @@ -1030,6 +1039,7 @@ impl<'a> Parser<'a> {
ItemKind::Impl { .. } => return Err(err),
_ => unreachable!(),
}

Ok(impl_info)
}

Expand Down
5 changes: 5 additions & 0 deletions src/test/ui/parser/issue-81806.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
trait T { const
impl //~ ERROR: expected identifier, found keyword `impl`
}

fn main() {}
17 changes: 17 additions & 0 deletions src/test/ui/parser/issue-81806.stderr
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 9ab05b4

Please sign in to comment.