struct FunctionalVariances<'tcx> {
tcx: TyCtxt<'tcx>,
variances: FxHashMap<DefId, Variance>,
ambient_variance: Variance,
generics: &'tcx Generics,
}
Expand description
Computes the variances of regions that appear in the type, but considering late-bound regions too, which don’t have their variance computed usually.
Like generalization, this is a unary operation implemented on top of the binary relation infrastructure, mostly because it’s much easier to have the relation track the variance for you, rather than having to do it yourself.
Fields§
§tcx: TyCtxt<'tcx>
§variances: FxHashMap<DefId, Variance>
§ambient_variance: Variance
§generics: &'tcx Generics
Trait Implementations§
source§impl<'tcx> TypeRelation<TyCtxt<'tcx>> for FunctionalVariances<'tcx>
impl<'tcx> TypeRelation<TyCtxt<'tcx>> for FunctionalVariances<'tcx>
fn cx(&self) -> TyCtxt<'tcx>
source§fn relate_with_variance<T: Relate<TyCtxt<'tcx>>>(
&mut self,
variance: Variance,
_: VarianceDiagInfo<TyCtxt<'tcx>>,
a: T,
b: T,
) -> RelateResult<'tcx, T>
fn relate_with_variance<T: Relate<TyCtxt<'tcx>>>( &mut self, variance: Variance, _: VarianceDiagInfo<TyCtxt<'tcx>>, a: T, b: T, ) -> RelateResult<'tcx, T>
Switch variance for the purpose of relating
a
and b
.fn tys(&mut self, a: Ty<'tcx>, b: Ty<'tcx>) -> RelateResult<'tcx, Ty<'tcx>>
fn regions( &mut self, a: Region<'tcx>, _: Region<'tcx>, ) -> RelateResult<'tcx, Region<'tcx>>
fn consts( &mut self, a: Const<'tcx>, b: Const<'tcx>, ) -> RelateResult<'tcx, Const<'tcx>>
fn binders<T>( &mut self, a: Binder<'tcx, T>, b: Binder<'tcx, T>, ) -> RelateResult<'tcx, Binder<'tcx, T>>
source§fn relate<T>(&mut self, a: T, b: T) -> Result<T, TypeError<I>>where
T: Relate<I>,
fn relate<T>(&mut self, a: T, b: T) -> Result<T, TypeError<I>>where
T: Relate<I>,
Generic relation routine suitable for most anything.
source§fn relate_item_args(
&mut self,
item_def_id: <I as Interner>::DefId,
a_arg: <I as Interner>::GenericArgs,
b_arg: <I as Interner>::GenericArgs,
) -> Result<<I as Interner>::GenericArgs, TypeError<I>>
fn relate_item_args( &mut self, item_def_id: <I as Interner>::DefId, a_arg: <I as Interner>::GenericArgs, b_arg: <I as Interner>::GenericArgs, ) -> Result<<I as Interner>::GenericArgs, TypeError<I>>
Relate the two args for the given item. The default
is to look up the variance for the item and proceed
accordingly.
Auto Trait Implementations§
impl<'tcx> Freeze for FunctionalVariances<'tcx>
impl<'tcx> !RefUnwindSafe for FunctionalVariances<'tcx>
impl<'tcx> !Send for FunctionalVariances<'tcx>
impl<'tcx> !Sync for FunctionalVariances<'tcx>
impl<'tcx> Unpin for FunctionalVariances<'tcx>
impl<'tcx> !UnwindSafe for FunctionalVariances<'tcx>
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
Mutably borrows from an owned value. Read more
source§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
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>
Creates a filterable data provider with the given name for debugging. Read more
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>
Converts
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>
Converts
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<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: 56 bytes