suggest removing impl in generic trait bound position

This commit is contained in:
y21 2023-08-29 17:10:27 +02:00
parent 0b84f18b24
commit 507f10baee
3 changed files with 65 additions and 11 deletions

View file

@ -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,
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",
"",
Applicability::MaybeIncorrect,
);
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 {

View file

@ -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() {}

View file

@ -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