This hackmd is tracking regressions from PR #66037, which is a proposed fix for #57893. For each affected crate, we are scraping the logs to extract the "overlapping impl". In some cases, the impl comes from an upstream crate, but in other cases it's local.
One question: This unsoundness ultimately relies on associated types. I wonder if there is some room to be…clever here in the absence of associated types? Virtually all affected traits have no associated types, if not all.
A
impl<T: ?Sized + Any + Serialize ..> ActorMessage for T
linkB
C
impl<T: ?Sized> FnClone for T where T: Fn() -> String + CloneIntoBox {}
D
util::ReadSeek
cannot be made into an objectpub trait ReadSeek: Read + Seek {}
impl<T: ?Sized> ReadSeek for T where T: Read + Seek {}
Any
in stdlib?impl<T: ?Sized> Any for T where T: StdAny
E
ser::Serialize
cannot be made into an objectimpl<T: ?Sized> Serialize for T where T: serde::Serialize,
(source)serde::Serialize
is not object safe, but it feels like we can't rely on that; what if we broadened the set of object safe traits in the future?systems::sms::inbox::InboxGetDebugger
cannot be made into an object (source)impl<T> InboxGetDebugger for T where T: ?Sized + Z80Inbox + GetDebugger, {}
(source)hardware::sms_vdp::vdp_interface::SmsVdpInterface
cannot be made into an object (source)impl<T: ?Sized> SmsVdpInterface for T where T: SmsVdpInternal
(source)G
value::ToValue
cannot be made into an object (source)impl<T: ?Sized + SetValue> ToValue for T
(source)T = dyn ToValue
is not a problem, as dyn ToValue: SetValue
does not apply
T = (dyn ToValue + SetValue)
SetValue
, so SetValue::set_value
would still dynamically dispatchbase::types::Walker
cannot be made into an object (source)impl<'a, F: ?Sized> Walker<'a, ArcKind> for F where F: FnMut(&ArcKind)
(source)impl<'a, I, T, F> Walker<'a, T> for F where F: ?Sized + FnMut(&'a T), T: Deref<Target = Type<I, T>> + 'a, I: 'a
(source)L
any::value::Value
cannot be made into an object (source)impl<T: ?Sized + ValueConstraint> Value for T
(source)Any
dyn Any
, the downcast would failany::key::Key
cannot be made into an object (source)impl<T: ?Sized + KeyConstraint> Key for T
(source)dyn Key + KeyConstraint
, it'd be ok
dyn Key
(on its own) meets the impl requirements?M
fmt::debug::MaybeDebug
cannot be made into an object (source)impl<T> MaybeDebug for T where T: ?Sized
has default
(source)
impl<T> MaybeDebug for T where T: fmt::Debug + ?Sized
(source)
msiz_rustc_ap_rustc_data_structures::sync::Send
cannot be made into an object (source)impl<T: ?Sized> Send for T {}
(source)
msiz_rustc_ap_rustc_data_structures::sync::Sync
cannot be made into an object (source)impl<T: ?Sized> Sync for T {}
(source)
R
Foo
cannot be made into an objectimpl<T: ?Sized> Foo for T {}
S
MapErrFn
cannot be made into an object (source)impl<T, EI, EO> MapErrFn<EI, EO> for T where T: 'static + Sync + Send + ?Sized + UnwindSafe + RefUnwindSafe + Fn(EI) -> EO {}
(source)SendSyncRefUnwindSafeKV
cannot be made into an object (source)impl<T> SendSyncRefUnwindSafeKV for T where T: KV + Send + Sync + RefUnwindSafe + ?Sized {}
(source)SendSyncRefUnwindSafeDrain
cannot be made into an object (source)impl<T> SendSyncRefUnwindSafeDrain for T where T: Drain + Send + Sync + RefUnwindSafe + ?Sized, { }
(source)stwen77.interpreter.6f29cecd76e3d05ffac6be9e9ef6e26b78af63cc: log
T
geometry::BoundableGeom
cannot be made into an object (source)impl<T: ?Sized> BoundableGeom for T where T: Geometry + Boundable {}
(source)geometry::SampleableGeom
cannot be made into an object (source)impl<T: ?Sized> SampleableGeom for T where T: Geometry + Boundable + Sampleable {}
(source)