pub enum ImplOverlapKind {
Permitted {
marker: bool,
},
FutureCompatOrderDepTraitObjects,
}
Variants§
Permitted
These impls are always allowed to overlap.
FutureCompatOrderDepTraitObjects
These impls are allowed to overlap, but that raises an issue #33140 future-compatibility warning (tracked in #56484).
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 on
that difference, doing 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
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§
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
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.Source§impl<T> Filterable for T
impl<T> Filterable for T
Source§fn filterable(
self,
filter_name: &'static str,
) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
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<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§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
Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
Source§impl<I, T> UpcastFrom<I, T> for T
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> 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 byteFutureCompatOrderDepTraitObjects
: 0 bytes