Rollup merge of - JohnTitor:do-not-sugg-dup-bounds, r=estebank

Do not suggest duplicate bounds

Fixes 
Fixes 

r? @estebank
This commit is contained in:
Mazdak Farrokhzad 2020-02-02 14:15:51 +01:00 committed by GitHub
commit 2e1790dda1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 49 additions and 32 deletions

@ -853,9 +853,12 @@ 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.
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!(
@ -873,6 +876,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
}),
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