Coherence Issue 57893

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 beclever here in the absence of associated types? Virtually all affected traits have no associated types, if not all.

Regressions starting with A

  • axiom-0.1.0: log
    • pattern: Bridge, not actually applicable
    • impl<T: ?Sized + Any + Serialize ..> ActorMessage for T link

Regressions starting with B

Regressions starting with C

  • clone-into-box-0.1.0: log
    • pattern: Bridge, not actually applicable, would be ok
    • impl<T: ?Sized> FnClone for T where T: Fn() -> String + CloneIntoBox {}

Regressions starting with D

  • dicom-parser-0.1.0: log
    • the trait util::ReadSeek cannot be made into an object
    • pub trait ReadSeek: Read + Seek {}
    • impl<T: ?Sized> ReadSeek for T where T: Read + Seek {}
    • interesting special case no methods, no default required? Have to ponder this one!
    • pattern: Alias
  • downcast-0.10.0: log
    • this appears to be roughly the same as Any in stdlib?
    • impl<T: ?Sized> Any for T where T: StdAny
    • pattern: Implicit specialization

Regressions starting with E

  • erased-serde-0.1.3: log
  • erased-serde-0.3.3: log
  • erased-serde-0.3.9: log
    • the trait ser::Serialize cannot be made into an object
    • impl<T: ?Sized> Serialize for T where T: serde::Serialize, (source)
    • in this particular case, 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?
    • pattern: Bridge, not actually applicable
  • euphrates-0.1.0: log
    • the trait systems::sms::inbox::InboxGetDebugger cannot be made into an object (source)
    • impl<T> InboxGetDebugger for T where T: ?Sized + Z80Inbox + GetDebugger, {} (source)
    • pattern: Alias
    • the trait hardware::sms_vdp::vdp_interface::SmsVdpInterface cannot be made into an object (source)
    • impl<T: ?Sized> SmsVdpInterface for T where T: SmsVdpInternal (source)
    • pattern: Bridge

Regressions starting with G

Regressions starting with L

  • lang_extension-1.0.0: log
  • lang_extension-1.0.1: log
    • the trait any::value::Value cannot be made into an object (source)
    • impl<T: ?Sized + ValueConstraint> Value for T (source)
    • pattern: Implicit specialization, not actualy applicable, internally relies on Any
      • i.e., if invoked for dyn Any, the downcast would fail
    • the trait any::key::Key cannot be made into an object (source)
    • impl<T: ?Sized + KeyConstraint> Key for T (source)
    • as above, I don't know if there's a problem here if we just used this impl for dyn Key + KeyConstraint, it'd be ok
      • perhaps the key determinant is whether dyn Key (on its own) meets the impl requirements?
    • pattern: Bridge, not actually applicable

Regressions starting with M

  • mockiato-0.9.5: log
    • the trait fmt::debug::MaybeDebug cannot be made into an object (source)
    • this impl<T> MaybeDebug for T where T: ?Sized has default (source)
      • this would probably "just work" with the intended design
      • pattern: Implicit specialization, but has default
    • and not impl<T> MaybeDebug for T where T: fmt::Debug + ?Sized (source)
      • this would cause errors, but falls (I think) into that other category of "conversion impls" that I hope we can make work
      • pattern: Bridge, not actually applicable
  • msiz_rustc-ap-rustc_errors-3.0.0: log
    • msiz_rustc_ap_rustc_data_structures::sync::Send cannot be made into an object (source)
    • impl<T: ?Sized> Send for T {} (source)
      • pattern: alias (well, sort of)
    • the trait msiz_rustc_ap_rustc_data_structures::sync::Sync cannot be made into an object (source)
    • impl<T: ?Sized> Sync for T {} (source)
      • pattern: alias (well, sort of)

Regressions starting with R

  • referent-0.1.1: log
    • the trait Foo cannot be made into an object
    • impl<T: ?Sized> Foo for T {}
  • rhai#daadb4c: log
  • rhai-0.9.1: log
    • the trait any::Any cannot be made into an object (source)
    • impl<T> Any for T where T: Clone + StdAny + ?Sized (source)
  • rustc-ap-rustc_errors-610.0.0: log
    • the trait rustc_ap_rustc_data_structures::sync::Send cannot be made into an object (source)
    • impl<T: ?Sized> Send for T {} (source)
    • pattern: dummy
    • the trait rustc_ap_rustc_data_structures::sync::Sync cannot be made into an object (source)
    • impl<T: ?Sized> Sync for T {} (source)
    • pattern: dummy

Regressions starting with S

Regressions starting with T

Select a repo