1use core::marker::PhantomData;
2
3pub type PhantomCovariantAlwaysSendSync<T> = PhantomData<PhantomCoFnWorkaround<T>>;
5#[doc(hidden)]
6pub struct PhantomCoFnWorkaround<T: ?Sized>{_a: fn() -> T}
7
8pub type PhantomCovariantNeverSendSync<T> = PhantomData<PhantomCoFnWorkaroundNonSync<T>>;
10#[doc(hidden)]
11pub struct PhantomCoFnWorkaroundNonSync<T: ?Sized>{_a: fn() -> T, _b: *const ()}
12
13pub type PhantomCovariantInheritSendSync<T> = PhantomData<PhantomCoFnWorkaroundInheritSync<T>>;
15#[doc(hidden)]
16pub struct PhantomCoFnWorkaroundInheritSync<T: ?Sized>{_a: fn() -> T, _b: T}
17
18pub type PhantomContravariantAlwaysSendSync<T> = PhantomData<PhantomContraFnWorkaround<T>>;
20#[doc(hidden)]
21pub struct PhantomContraFnWorkaround<T: ?Sized>{_a: fn(T)}
22
23pub type PhantomContravariantNeverSendSync<T> = PhantomData<PhantomContravariantNeverSendSyncWorkaround<T>>;
25#[doc(hidden)]
26pub struct PhantomContravariantNeverSendSyncWorkaround<T: ?Sized>{_a: fn(T), _b: *const ()}
27
28pub type PhantomContravariantInheritSendSync<T> = PhantomData<PhantomContravariantInheritSendSyncWorkaround<T>>;
30#[doc(hidden)]
31pub struct PhantomContravariantInheritSendSyncWorkaround<T: ?Sized>{_a: fn(T), _b: *const ()}
32unsafe impl<T: Send + ?Sized> Send for PhantomContravariantInheritSendSyncWorkaround<T> {}
34unsafe impl<T: Sync + ?Sized> Sync for PhantomContravariantInheritSendSyncWorkaround<T> {}
35
36pub type PhantomInvariantAlwaysSendSync<T> = PhantomData<PhantomInvariantAlwaysSendSyncWorkaround<T>>;
38#[doc(hidden)]
39pub struct PhantomInvariantAlwaysSendSyncWorkaround<T: ?Sized>{_a: fn(T) -> T}
40
41pub type PhantomInvariantNeverSendSync<T> = PhantomData<PhantomInvariantNeverSendSyncWorkaround<T>>;
43#[doc(hidden)]
44pub struct PhantomInvariantNeverSendSyncWorkaround<T: ?Sized>{_a: fn(T) -> T, _b: *const ()}
45
46pub type PhantomInvariantInheritSendSync<T> = PhantomData<PhantomInvariantInheritSendSyncWorkaround<T>>;
48#[doc(hidden)]
49pub struct PhantomInvariantInheritSendSyncWorkaround<T: ?Sized>{_a: fn(T) -> T, _b: T}