Skip to content

Commit

Permalink
Do not suggest duplicate bounds
Browse files Browse the repository at this point in the history
  • Loading branch information
JohnTitor committed Feb 2, 2020
1 parent bc4a339 commit 56ad8bc
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 32 deletions.
42 changes: 23 additions & 19 deletions src/librustc_typeck/check/method/suggest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
11 changes: 11 additions & 0 deletions src/test/ui/associated-item/associated-item-duplicate-bounds.rs
Original file line number Diff line number Diff line change
@@ -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() {}
Original file line number Diff line number Diff line change
@@ -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`.
4 changes: 0 additions & 4 deletions src/test/ui/issues/issue-39559.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
13 changes: 4 additions & 9 deletions src/test/ui/span/issue-7575.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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`
Expand All @@ -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

Expand Down

0 comments on commit 56ad8bc

Please sign in to comment.