Do not suggest duplicate bounds
This commit is contained in:
parent
bc4a339064
commit
56ad8bcfe0
@ -853,26 +853,30 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
} else {
|
||||
sp
|
||||
};
|
||||
// FIXME: contrast `t.def_id` against `param.bounds` to not suggest
|
||||
// traits already there. That can happen when the cause is that
|
||||
// we're in a const scope or associated function used as a method.
|
||||
err.span_suggestions(
|
||||
sp,
|
||||
&message(format!(
|
||||
"restrict type parameter `{}` with",
|
||||
param.name.ident(),
|
||||
)),
|
||||
candidates.iter().map(|t| {
|
||||
format!(
|
||||
"{}{} {}{}",
|
||||
let trait_def_ids: FxHashSet<DefId> = param
|
||||
.bounds
|
||||
.iter()
|
||||
.filter_map(|bound| bound.trait_def_id())
|
||||
.collect();
|
||||
if !candidates.iter().any(|t| trait_def_ids.contains(&t.def_id)) {
|
||||
err.span_suggestions(
|
||||
sp,
|
||||
&message(format!(
|
||||
"restrict type parameter `{}` with",
|
||||
param.name.ident(),
|
||||
if impl_trait { " +" } else { ":" },
|
||||
self.tcx.def_path_str(t.def_id),
|
||||
if has_bounds.is_some() { " + " } else { "" },
|
||||
)
|
||||
}),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
)),
|
||||
candidates.iter().map(|t| {
|
||||
format!(
|
||||
"{}{} {}{}",
|
||||
param.name.ident(),
|
||||
if impl_trait { " +" } else { ":" },
|
||||
self.tcx.def_path_str(t.def_id),
|
||||
if has_bounds.is_some() { " + " } else { "" },
|
||||
)
|
||||
}),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
}
|
||||
suggested = true;
|
||||
}
|
||||
Node::Item(hir::Item {
|
||||
|
@ -0,0 +1,11 @@
|
||||
trait Adapter {
|
||||
const LINKS: usize;
|
||||
}
|
||||
|
||||
struct Foo<A: Adapter> {
|
||||
adapter: A,
|
||||
links: [u32; A::LINKS], // Shouldn't suggest bounds already there.
|
||||
//~^ ERROR: no associated item named `LINKS` found
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,11 @@
|
||||
error[E0599]: no associated item named `LINKS` found for type parameter `A` in the current scope
|
||||
--> $DIR/associated-item-duplicate-bounds.rs:7:21
|
||||
|
|
||||
LL | links: [u32; A::LINKS], // Shouldn't suggest bounds already there.
|
||||
| ^^^^^ associated item not found in `A`
|
||||
|
|
||||
= help: items from traits can only be used if the type parameter is bounded by the trait
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0599`.
|
@ -5,10 +5,6 @@ LL | entries: [T; D::dim()],
|
||||
| ^^^ function or associated item not found in `D`
|
||||
|
|
||||
= help: items from traits can only be used if the type parameter is bounded by the trait
|
||||
help: the following trait defines an item `dim`, perhaps you need to restrict type parameter `D` with it:
|
||||
|
|
||||
LL | pub struct Vector<T, D: Dim + Dim> {
|
||||
| ^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -61,7 +61,10 @@ error[E0599]: no method named `is_str` found for type parameter `T` in the curre
|
||||
--> $DIR/issue-7575.rs:70:7
|
||||
|
|
||||
LL | t.is_str()
|
||||
| ^^^^^^ this is an associated function, not a method
|
||||
| --^^^^^^--
|
||||
| | |
|
||||
| | this is an associated function, not a method
|
||||
| help: disambiguate the method call for the candidate: `ManyImplTrait::is_str(t)`
|
||||
|
|
||||
= note: found the following associated functions; to be used as methods, functions must have a `self` parameter
|
||||
note: the candidate is defined in the trait `ManyImplTrait`
|
||||
@ -70,14 +73,6 @@ note: the candidate is defined in the trait `ManyImplTrait`
|
||||
LL | fn is_str() -> bool {
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
= help: items from traits can only be used if the type parameter is bounded by the trait
|
||||
help: disambiguate the method call for the candidate
|
||||
|
|
||||
LL | ManyImplTrait::is_str(t)
|
||||
|
|
||||
help: the following trait defines an item `is_str`, perhaps you need to restrict type parameter `T` with it:
|
||||
|
|
||||
LL | fn param_bound<T: ManyImplTrait + ManyImplTrait>(t: T) -> bool {
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user