Enum rustc_middle::ty::ImplOverlapKind
source · [−]pub enum ImplOverlapKind {
Permitted {
marker: bool,
},
Issue33140,
}
Variants
Permitted
Fields
marker: bool
Whether or not the impl is permitted due to the trait being a #[marker]
trait
These impls are always allowed to overlap.
Issue33140
These impls are allowed to overlap, but that raises an issue #33140 future-compatibility warning.
Some background: in Rust 1.0, the trait-object types Send + Sync
(today’s
dyn Send + Sync
) and Sync + Send
(now dyn Sync + Send
) were different.
The widely-used version 0.1.0 of the crate traitobject
had accidentally relied
that difference, making what reduces to the following set of impls:
trait Trait {}
impl Trait for dyn Send + Sync {}
impl Trait for dyn Sync + Send {}
Obviously, once we made these types be identical, that code causes a coherence
error and a fairly big headache for us. However, luckily for us, the trait
Trait
used in this case is basically a marker trait, and therefore having
overlapping impls for it is sound.
To handle this, we basically regard the trait as a marker trait, with an additional future-compatibility warning. To avoid accidentally “stabilizing” this feature, it has the following restrictions:
- The trait must indeed be a marker-like trait (i.e., no items), and must be positive impls.
- The trait-ref of both impls must be equal.
- The trait-ref of both impls must be a trait object type consisting only of marker traits.
- Neither of the impls can have any where-clauses.
Once traitobject
0.1.0 is no longer an active concern, this hack can be removed.
Trait Implementations
sourceimpl Debug for ImplOverlapKind
impl Debug for ImplOverlapKind
sourceimpl PartialEq<ImplOverlapKind> for ImplOverlapKind
impl PartialEq<ImplOverlapKind> for ImplOverlapKind
sourcefn eq(&self, other: &ImplOverlapKind) -> bool
fn eq(&self, other: &ImplOverlapKind) -> bool
impl Eq for ImplOverlapKind
impl StructuralEq for ImplOverlapKind
impl StructuralPartialEq for ImplOverlapKind
Auto Trait Implementations
impl RefUnwindSafe for ImplOverlapKind
impl Send for ImplOverlapKind
impl Sync for ImplOverlapKind
impl Unpin for ImplOverlapKind
impl UnwindSafe for ImplOverlapKind
Blanket Implementations
sourceimpl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
sourceimpl<T, R> InternIteratorElement<T, R> for T
impl<T, R> InternIteratorElement<T, R> for T
type Output = R
fn intern_with<I, F>(iter: I, f: F) -> <T as InternIteratorElement<T, R>>::Outputwhere
I: Iterator<Item = T>,
F: FnOnce(&[T]) -> R,
sourceimpl<T> MaybeResult<T> for T
impl<T> MaybeResult<T> for T
sourceimpl<CTX, T> Value<CTX> for Twhere
CTX: DepContext,
impl<CTX, T> Value<CTX> for Twhere
CTX: DepContext,
default fn from_cycle_error(tcx: CTX) -> T
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
Layout
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference’s “Type Layout” chapter for details on type layout guarantees.
Size: 1 byte
Size for each variant:
Permitted
: 1 byteIssue33140
: 0 bytes