Mention implementations that satisfy the trait
This commit is contained in:
parent
b3fba5e18a
commit
3e25bcb020
@ -980,6 +980,7 @@ fn report_selection_error(
|
||||
trait_ref,
|
||||
obligation.cause.body_id,
|
||||
&mut err,
|
||||
true,
|
||||
) {
|
||||
// This is *almost* equivalent to
|
||||
// `obligation.cause.code().peel_derives()`, but it gives us the
|
||||
@ -1015,6 +1016,7 @@ fn report_selection_error(
|
||||
trait_ref,
|
||||
obligation.cause.body_id,
|
||||
&mut err,
|
||||
true,
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -1432,6 +1434,7 @@ fn report_similar_impl_candidates(
|
||||
trait_ref: ty::PolyTraitRef<'tcx>,
|
||||
body_id: hir::HirId,
|
||||
err: &mut Diagnostic,
|
||||
other: bool,
|
||||
) -> bool;
|
||||
|
||||
/// Gets the parent trait chain start
|
||||
@ -1887,7 +1890,9 @@ fn report_similar_impl_candidates(
|
||||
trait_ref: ty::PolyTraitRef<'tcx>,
|
||||
body_id: hir::HirId,
|
||||
err: &mut Diagnostic,
|
||||
other: bool,
|
||||
) -> bool {
|
||||
let other = if other { "other " } else { "" };
|
||||
let report = |mut candidates: Vec<TraitRef<'tcx>>, err: &mut Diagnostic| {
|
||||
candidates.sort();
|
||||
candidates.dedup();
|
||||
@ -1938,7 +1943,7 @@ fn report_similar_impl_candidates(
|
||||
candidates.dedup();
|
||||
let end = if candidates.len() <= 9 { candidates.len() } else { 8 };
|
||||
err.help(&format!(
|
||||
"the following other types implement trait `{}`:{}{}",
|
||||
"the following {other}types implement trait `{}`:{}{}",
|
||||
trait_ref.print_only_trait_path(),
|
||||
candidates[..end].join(""),
|
||||
if len > 9 { format!("\nand {} others", len - 8) } else { String::new() }
|
||||
@ -2179,7 +2184,7 @@ fn maybe_report_ambiguity(
|
||||
trait_ref.skip_binder().substs.types().any(|t| !t.is_ty_infer());
|
||||
// It doesn't make sense to talk about applicable impls if there are more
|
||||
// than a handful of them.
|
||||
if impls.len() > 1 && impls.len() < 5 && has_non_region_infer {
|
||||
if impls.len() > 1 && impls.len() < 10 && has_non_region_infer {
|
||||
self.annotate_source_of_ambiguity(&mut err, &impls, predicate);
|
||||
} else {
|
||||
if self.tainted_by_errors().is_some() {
|
||||
@ -2187,6 +2192,18 @@ fn maybe_report_ambiguity(
|
||||
return;
|
||||
}
|
||||
err.note(&format!("cannot satisfy `{}`", predicate));
|
||||
let impl_candidates = self.find_similar_impl_candidates(
|
||||
predicate.to_opt_poly_trait_pred().unwrap(),
|
||||
);
|
||||
if impl_candidates.len() < 10 {
|
||||
self.report_similar_impl_candidates(
|
||||
impl_candidates,
|
||||
trait_ref,
|
||||
body_id.map(|id| id.hir_id).unwrap_or(obligation.cause.body_id),
|
||||
&mut err,
|
||||
false,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
|
@ -5,6 +5,12 @@ LL | let y = Mask::<_, _>::splat(false);
|
||||
| ^ ------------------- type must be known at this point
|
||||
|
|
||||
= note: cannot satisfy `_: MaskElement`
|
||||
= help: the following types implement trait `MaskElement`:
|
||||
i16
|
||||
i32
|
||||
i64
|
||||
i8
|
||||
isize
|
||||
note: required by a bound in `Mask::<T, LANES>::splat`
|
||||
--> $SRC_DIR/core/src/../../portable-simd/crates/core_simd/src/masks.rs:LL:COL
|
||||
|
|
||||
|
@ -41,6 +41,7 @@ LL | IsLessOrEqual<I, 8>: True,
|
||||
| ^^^^
|
||||
|
|
||||
= note: cannot satisfy `IsLessOrEqual<I, 8>: True`
|
||||
= help: the trait `True` is implemented for `IsLessOrEqual<LHS, RHS>`
|
||||
|
||||
error[E0283]: type annotations needed: cannot satisfy `IsLessOrEqual<I, 8>: True`
|
||||
--> $DIR/issue-72787.rs:21:26
|
||||
@ -49,6 +50,7 @@ LL | IsLessOrEqual<I, 8>: True,
|
||||
| ^^^^
|
||||
|
|
||||
= note: cannot satisfy `IsLessOrEqual<I, 8>: True`
|
||||
= help: the trait `True` is implemented for `IsLessOrEqual<LHS, RHS>`
|
||||
|
||||
error: aborting due to 6 previous errors
|
||||
|
||||
|
@ -5,6 +5,7 @@ LL | &'a (): Foo,
|
||||
| ^^^
|
||||
|
|
||||
= note: cannot satisfy `&'a (): Foo`
|
||||
= help: the trait `Foo` is implemented for `&'a T`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -46,7 +46,15 @@ LL | let ips: Vec<_> = (0..100_000).map(|_| u32::from(0u32.into())).collect(
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= note: cannot satisfy `u32: From<_>`
|
||||
= note: multiple `impl`s satisfying `u32: From<_>` found in the following crates: `core`, `std`:
|
||||
- impl From<Ipv4Addr> for u32;
|
||||
- impl From<NonZeroU32> for u32;
|
||||
- impl From<bool> for u32;
|
||||
- impl From<char> for u32;
|
||||
- impl From<u16> for u32;
|
||||
- impl From<u8> for u32;
|
||||
- impl<T> From<!> for T;
|
||||
- impl<T> From<T> for T;
|
||||
help: try using a fully qualified path to specify the expected types
|
||||
|
|
||||
LL | let ips: Vec<_> = (0..100_000).map(|_| u32::from(<u32 as Into<T>>::into(0u32))).collect();
|
||||
|
@ -5,6 +5,9 @@ LL | T: FnMut(&'a ()),
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
||||
= note: cannot satisfy `T: FnMut<(&'a (),)>`
|
||||
= help: the following types implement trait `FnMut<Args>`:
|
||||
&F
|
||||
&mut F
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user