Enum rustc_middle::ty::ImplOverlapKind
source · pub enum ImplOverlapKind {
Permitted {
marker: bool,
},
Issue33140,
}
Variants§
Permitted
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§
source§impl Debug for ImplOverlapKind
impl Debug for ImplOverlapKind
source§impl PartialEq for ImplOverlapKind
impl PartialEq for ImplOverlapKind
source§fn eq(&self, other: &ImplOverlapKind) -> bool
fn eq(&self, other: &ImplOverlapKind) -> bool
self
and other
values to be equal, and is used
by ==
.impl Eq for ImplOverlapKind
impl StructuralPartialEq for ImplOverlapKind
Auto Trait Implementations§
impl DynSend for ImplOverlapKind
impl DynSync for ImplOverlapKind
impl Freeze for ImplOverlapKind
impl RefUnwindSafe for ImplOverlapKind
impl Send for ImplOverlapKind
impl Sync for ImplOverlapKind
impl Unpin for ImplOverlapKind
impl UnwindSafe for ImplOverlapKind
Blanket Implementations§
§impl<T> AnyEq for T
impl<T> AnyEq for T
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.§impl<T> Filterable for T
impl<T> Filterable for T
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<P> IntoQueryParam<P> for P
impl<P> IntoQueryParam<P> for P
fn into_query_param(self) -> P
source§impl<T> MaybeResult<T> for T
impl<T> MaybeResult<T> for T
§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<'tcx, T> ToPredicate<'tcx, T> for T
impl<'tcx, T> ToPredicate<'tcx, T> for T
fn to_predicate(self, _tcx: TyCtxt<'tcx>) -> T
source§impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
default fn from_cycle_error( tcx: Tcx, cycle_error: &CycleError, _guar: ErrorGuaranteed ) -> T
source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<T> ErasedDestructor for Twhere
T: 'static,
impl<T> MaybeSendSync for T
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