Enum rustc_middle::ty::ImplOverlapKind [−][src]
pub enum ImplOverlapKind {
Permitted {
marker: bool,
},
Issue33140,
}
Variants
These impls are always allowed to overlap.
Fields of Permitted
marker: bool
Whether or not the impl is permitted due to the trait being a #[marker]
trait
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
This method tests for self
and other
values to be equal, and is used
by ==
. Read more
This method tests for !=
.
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
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