Function rustc_trait_selection::traits::coherence::impl_intersection_has_negative_obligation
source · fn impl_intersection_has_negative_obligation(
tcx: TyCtxt<'_>,
impl1_def_id: DefId,
impl2_def_id: DefId
) -> bool
Expand description
Check if both impls can be satisfied by a common type by considering whether any of first impl’s obligations is known not to hold via a negative predicate.
For example, given these two impls:
struct MyCustomBox<T: ?Sized>(Box<T>);
impl From<&str> for MyCustomBox<dyn Error>
(in my crate)
impl<E> From<E> for MyCustomBox<dyn Error> where E: Error
(in my crate)
After replacing the second impl’s header with inference vars, we get:
MyCustomBox<dyn Error>: From<&str>
MyCustomBox<dyn Error>: From<?E>
This gives us ?E = &str
. We then try to prove the first impl’s predicates
after negating, giving us &str: !Error
. This is a negative impl provided by
libstd, and therefore we can guarantee for certain that libstd will never add
a positive impl for &str: Error
(without it being a breaking change).