Skip to content

Commit

Permalink
Rollup merge of rust-lang#111449 - compiler-errors:recover-impl-gener…
Browse files Browse the repository at this point in the history
…ics-correctly, r=Nilstrieb

Recover `impl<T ?Sized>` correctly

Fixes rust-lang#111327

r? ``@Nilstrieb`` but you can re-roll

Alternatively, happy to close this if we're okay with just saying "sorry rust-lang#111327 is just a poor side-effect of parser ambiguity" 🤷
  • Loading branch information
Noratrieb authored May 16, 2023
2 parents 4197be9 + a5763ff commit 6b04acf
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 0 deletions.
5 changes: 5 additions & 0 deletions compiler/rustc_parse/src/parser/generics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -453,6 +453,8 @@ impl<'a> Parser<'a> {
// `<` (LIFETIME|IDENT) `:` - generic parameter with bounds
// `<` (LIFETIME|IDENT) `=` - generic parameter with a default
// `<` const - generic const parameter
// `<` IDENT `?` - RECOVERY for `impl<T ?Bound` missing a `:`, meant to
// avoid the `T?` to `Option<T>` recovery for types.
// The only truly ambiguous case is
// `<` IDENT `>` `::` IDENT ...
// we disambiguate it in favor of generics (`impl<T> ::absolute::Path<T> { ... }`)
Expand All @@ -463,6 +465,9 @@ impl<'a> Parser<'a> {
|| self.look_ahead(start + 1, |t| t.is_lifetime() || t.is_ident())
&& self.look_ahead(start + 2, |t| {
matches!(t.kind, token::Gt | token::Comma | token::Colon | token::Eq)
// Recovery-only branch -- this could be removed,
// since it only affects diagnostics currently.
|| matches!(t.kind, token::Question)
})
|| self.is_keyword_ahead(start + 1, &[kw::Const]))
}
Expand Down
6 changes: 6 additions & 0 deletions tests/ui/parser/impl-on-unsized-typo.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
trait Tr {}

impl<T ?Sized> Tr for T {}
//~^ ERROR expected one of `,`, `:`, `=`, or `>`, found `?`

fn main() {}
8 changes: 8 additions & 0 deletions tests/ui/parser/impl-on-unsized-typo.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
error: expected one of `,`, `:`, `=`, or `>`, found `?`
--> $DIR/impl-on-unsized-typo.rs:3:8
|
LL | impl<T ?Sized> Tr for T {}
| ^ expected one of `,`, `:`, `=`, or `>`

error: aborting due to previous error

0 comments on commit 6b04acf

Please sign in to comment.