Rollup merge of #68763 - JohnTitor:do-not-sugg-dup-bounds, r=estebank
Do not suggest duplicate bounds Fixes #68205 Fixes #68695 r? @estebank
This commit is contained in:
commit
2e1790dda1
5 changed files with 49 additions and 32 deletions
|
@ -853,26 +853,30 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
} else {
|
} else {
|
||||||
sp
|
sp
|
||||||
};
|
};
|
||||||
// FIXME: contrast `t.def_id` against `param.bounds` to not suggest
|
let trait_def_ids: FxHashSet<DefId> = param
|
||||||
// traits already there. That can happen when the cause is that
|
.bounds
|
||||||
// we're in a const scope or associated function used as a method.
|
.iter()
|
||||||
err.span_suggestions(
|
.filter_map(|bound| bound.trait_def_id())
|
||||||
sp,
|
.collect();
|
||||||
&message(format!(
|
if !candidates.iter().any(|t| trait_def_ids.contains(&t.def_id)) {
|
||||||
"restrict type parameter `{}` with",
|
err.span_suggestions(
|
||||||
param.name.ident(),
|
sp,
|
||||||
)),
|
&message(format!(
|
||||||
candidates.iter().map(|t| {
|
"restrict type parameter `{}` with",
|
||||||
format!(
|
|
||||||
"{}{} {}{}",
|
|
||||||
param.name.ident(),
|
param.name.ident(),
|
||||||
if impl_trait { " +" } else { ":" },
|
)),
|
||||||
self.tcx.def_path_str(t.def_id),
|
candidates.iter().map(|t| {
|
||||||
if has_bounds.is_some() { " + " } else { "" },
|
format!(
|
||||||
)
|
"{}{} {}{}",
|
||||||
}),
|
param.name.ident(),
|
||||||
Applicability::MaybeIncorrect,
|
if impl_trait { " +" } else { ":" },
|
||||||
);
|
self.tcx.def_path_str(t.def_id),
|
||||||
|
if has_bounds.is_some() { " + " } else { "" },
|
||||||
|
)
|
||||||
|
}),
|
||||||
|
Applicability::MaybeIncorrect,
|
||||||
|
);
|
||||||
|
}
|
||||||
suggested = true;
|
suggested = true;
|
||||||
}
|
}
|
||||||
Node::Item(hir::Item {
|
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`
|
| ^^^ 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: 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
|
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
|
--> $DIR/issue-7575.rs:70:7
|
||||||
|
|
|
|
||||||
LL | t.is_str()
|
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: 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`
|
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 {
|
LL | fn is_str() -> bool {
|
||||||
| ^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^
|
||||||
= help: items from traits can only be used if the type parameter is bounded by the trait
|
= 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
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue