Skip to content

Commit

Permalink
Rollup merge of rust-lang#115347 - y21:generic-bound-impl-trait-ty, r…
Browse files Browse the repository at this point in the history
…=compiler-errors

suggest removing `impl` in generic trait bound position

rustc already does this recovery in type param position (`<T: impl Trait>` -> `<T: Trait>`).
This PR also adds that suggestion in trait bound position (e.g. `where T: impl Trait` or `trait Trait { type Assoc: impl Trait; }`)
  • Loading branch information
matthiaskrgr authored Aug 30, 2023
2 parents 2128efd + 507f10b commit 58c6907
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 12 deletions.
38 changes: 26 additions & 12 deletions compiler/rustc_parse/src/parser/ty.rs
Original file line number Diff line number Diff line change
Expand Up @@ -891,18 +891,32 @@ impl<'a> Parser<'a> {
// that we do not use the try operator when parsing the type because
// if it fails then we get a parser error which we don't want (we're trying
// to recover from errors, not make more).
let path = if self.may_recover()
&& matches!(ty.kind, TyKind::Ptr(..) | TyKind::Ref(..))
&& let TyKind::Path(_, path) = &ty.peel_refs().kind {
// Just get the indirection part of the type.
let span = ty.span.until(path.span);

err.span_suggestion_verbose(
span,
"consider removing the indirection",
"",
Applicability::MaybeIncorrect,
);
let path = if self.may_recover() {
let (span, message, sugg, path, applicability) = match &ty.kind {
TyKind::Ptr(..) | TyKind::Ref(..) if let TyKind::Path(_, path) = &ty.peel_refs().kind => {
(
ty.span.until(path.span),
"consider removing the indirection",
"",
path,
Applicability::MaybeIncorrect
)
}
TyKind::ImplTrait(_, bounds)
if let [GenericBound::Trait(tr, ..), ..] = bounds.as_slice() =>
{
(
ty.span.until(tr.span),
"use the trait bounds directly",
"",
&tr.trait_ref.path,
Applicability::MachineApplicable
)
}
_ => return Err(err)
};

err.span_suggestion_verbose(span, message, sugg, applicability);

path.clone()
} else {
Expand Down
14 changes: 14 additions & 0 deletions tests/ui/associated-type-bounds/suggest-removing-impl.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
trait Tr {
type Assoc: impl Sized;
//~^ ERROR expected a trait, found type
//~| HELP use the trait bounds directly

fn fn_with_generics<T>()
where
T: impl Sized
//~^ ERROR expected a trait, found type
//~| HELP use the trait bounds directly
{}
}

fn main() {}
26 changes: 26 additions & 0 deletions tests/ui/associated-type-bounds/suggest-removing-impl.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
error: expected a trait, found type
--> $DIR/suggest-removing-impl.rs:2:17
|
LL | type Assoc: impl Sized;
| ^^^^^^^^^^
|
help: use the trait bounds directly
|
LL - type Assoc: impl Sized;
LL + type Assoc: Sized;
|

error: expected a trait, found type
--> $DIR/suggest-removing-impl.rs:8:12
|
LL | T: impl Sized
| ^^^^^^^^^^
|
help: use the trait bounds directly
|
LL - T: impl Sized
LL + T: Sized
|

error: aborting due to 2 previous errors

0 comments on commit 58c6907

Please sign in to comment.