diagnostics: Box<dyn Trait>
suggestion with multiple matching impl
The two altered expectation messages both seem like improvements: - `coerce-expect-unsized-ascribed.stderr` says you can go `Box<char> -> Box<dyn Debug>`, which you can. - `upcast_soundness_bug.stderr` used to say that you could go `Box<dyn Trait<u8, u8>> -> Box<dyn Trait>`, which you can't, because the type parameters are missing in the destination and the only ones that work aren't what's needed.
This commit is contained in:
parent
1b587a6e76
commit
20c833c632
@ -313,11 +313,9 @@ fn foo(&self, x: T) -> T { x }
|
|||||||
(ty::Dynamic(t, _, ty::DynKind::Dyn), _)
|
(ty::Dynamic(t, _, ty::DynKind::Dyn), _)
|
||||||
if let Some(def_id) = t.principal_def_id() =>
|
if let Some(def_id) = t.principal_def_id() =>
|
||||||
{
|
{
|
||||||
let mut impl_def_ids = vec![];
|
let has_non_blanket_impl =
|
||||||
tcx.for_each_relevant_impl(def_id, values.found, |did| {
|
tcx.non_blanket_impls_for_ty(def_id, values.found).next().is_some();
|
||||||
impl_def_ids.push(did)
|
if has_non_blanket_impl {
|
||||||
});
|
|
||||||
if let [_] = &impl_def_ids[..] {
|
|
||||||
let trait_name = tcx.item_name(def_id);
|
let trait_name = tcx.item_name(def_id);
|
||||||
diag.help(format!(
|
diag.help(format!(
|
||||||
"`{}` implements `{trait_name}` so you could box the found value \
|
"`{}` implements `{trait_name}` so you could box the found value \
|
||||||
@ -330,11 +328,9 @@ fn foo(&self, x: T) -> T { x }
|
|||||||
(_, ty::Dynamic(t, _, ty::DynKind::Dyn))
|
(_, ty::Dynamic(t, _, ty::DynKind::Dyn))
|
||||||
if let Some(def_id) = t.principal_def_id() =>
|
if let Some(def_id) = t.principal_def_id() =>
|
||||||
{
|
{
|
||||||
let mut impl_def_ids = vec![];
|
let has_non_blanket_impl =
|
||||||
tcx.for_each_relevant_impl(def_id, values.expected, |did| {
|
tcx.non_blanket_impls_for_ty(def_id, values.expected).next().is_some();
|
||||||
impl_def_ids.push(did)
|
if has_non_blanket_impl {
|
||||||
});
|
|
||||||
if let [_] = &impl_def_ids[..] {
|
|
||||||
let trait_name = tcx.item_name(def_id);
|
let trait_name = tcx.item_name(def_id);
|
||||||
diag.help(format!(
|
diag.help(format!(
|
||||||
"`{}` implements `{trait_name}` so you could change the expected \
|
"`{}` implements `{trait_name}` so you could change the expected \
|
||||||
@ -346,11 +342,9 @@ fn foo(&self, x: T) -> T { x }
|
|||||||
(ty::Dynamic(t, _, ty::DynKind::DynStar), _)
|
(ty::Dynamic(t, _, ty::DynKind::DynStar), _)
|
||||||
if let Some(def_id) = t.principal_def_id() =>
|
if let Some(def_id) = t.principal_def_id() =>
|
||||||
{
|
{
|
||||||
let mut impl_def_ids = vec![];
|
let has_non_blanket_impl =
|
||||||
tcx.for_each_relevant_impl(def_id, values.found, |did| {
|
tcx.non_blanket_impls_for_ty(def_id, values.found).next().is_some();
|
||||||
impl_def_ids.push(did)
|
if has_non_blanket_impl {
|
||||||
});
|
|
||||||
if let [_] = &impl_def_ids[..] {
|
|
||||||
let trait_name = tcx.item_name(def_id);
|
let trait_name = tcx.item_name(def_id);
|
||||||
diag.help(format!(
|
diag.help(format!(
|
||||||
"`{}` implements `{trait_name}`, `#[feature(dyn_star)]` is likely \
|
"`{}` implements `{trait_name}`, `#[feature(dyn_star)]` is likely \
|
||||||
|
@ -42,6 +42,7 @@ LL | let _ = type_ascribe!(Box::new( if true { false } else { true }), Box<d
|
|||||||
|
|
|
|
||||||
= note: expected struct `Box<dyn Debug>`
|
= note: expected struct `Box<dyn Debug>`
|
||||||
found struct `Box<bool>`
|
found struct `Box<bool>`
|
||||||
|
= help: `bool` implements `Debug` so you could box the found value and coerce it to the trait object `Box<dyn Debug>`, you will have to change the expected type as well
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/coerce-expect-unsized-ascribed.rs:16:27
|
--> $DIR/coerce-expect-unsized-ascribed.rs:16:27
|
||||||
@ -51,6 +52,7 @@ LL | let _ = type_ascribe!(Box::new( match true { true => 'a', false => 'b'
|
|||||||
|
|
|
|
||||||
= note: expected struct `Box<dyn Debug>`
|
= note: expected struct `Box<dyn Debug>`
|
||||||
found struct `Box<char>`
|
found struct `Box<char>`
|
||||||
|
= help: `char` implements `Debug` so you could box the found value and coerce it to the trait object `Box<dyn Debug>`, you will have to change the expected type as well
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/coerce-expect-unsized-ascribed.rs:18:27
|
--> $DIR/coerce-expect-unsized-ascribed.rs:18:27
|
||||||
@ -96,6 +98,7 @@ LL | let _ = type_ascribe!(&if true { false } else { true }, &dyn Debug);
|
|||||||
|
|
|
|
||||||
= note: expected reference `&dyn Debug`
|
= note: expected reference `&dyn Debug`
|
||||||
found reference `&bool`
|
found reference `&bool`
|
||||||
|
= help: `bool` implements `Debug` so you could box the found value and coerce it to the trait object `Box<dyn Debug>`, you will have to change the expected type as well
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/coerce-expect-unsized-ascribed.rs:24:27
|
--> $DIR/coerce-expect-unsized-ascribed.rs:24:27
|
||||||
@ -105,6 +108,7 @@ LL | let _ = type_ascribe!(&match true { true => 'a', false => 'b' }, &dyn D
|
|||||||
|
|
|
|
||||||
= note: expected reference `&dyn Debug`
|
= note: expected reference `&dyn Debug`
|
||||||
found reference `&char`
|
found reference `&char`
|
||||||
|
= help: `char` implements `Debug` so you could box the found value and coerce it to the trait object `Box<dyn Debug>`, you will have to change the expected type as well
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/coerce-expect-unsized-ascribed.rs:26:27
|
--> $DIR/coerce-expect-unsized-ascribed.rs:26:27
|
||||||
|
@ -6,7 +6,6 @@ LL | let p = p as *const dyn Trait<u8, u16>; // <- this is bad!
|
|||||||
|
|
|
|
||||||
= note: expected trait object `dyn Trait<u8, u8>`
|
= note: expected trait object `dyn Trait<u8, u8>`
|
||||||
found trait object `dyn Trait<u8, u16>`
|
found trait object `dyn Trait<u8, u16>`
|
||||||
= help: `dyn Trait<u8, u16>` implements `Trait` so you could box the found value and coerce it to the trait object `Box<dyn Trait>`, you will have to change the expected type as well
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user