[−][src]Struct rustc_infer::infer::nll_relate::TypeRelating

pub struct TypeRelating<'me, 'tcx, D> where
    D: TypeRelatingDelegate<'tcx>, 
{ infcx: &'me InferCtxt<'me, 'tcx>, delegate: D, ambient_variance: Variance, a_scopes: Vec<BoundRegionScope<'tcx>>, b_scopes: Vec<BoundRegionScope<'tcx>>, }

Fields

infcx: &'me InferCtxt<'me, 'tcx>delegate: D

Callback to use when we deduce an outlives relationship

ambient_variance: Variance

How are we relating a and b?

a_scopes: Vec<BoundRegionScope<'tcx>>

When we pass through a set of binders (e.g., when looking into a fn type), we push a new bound region scope onto here. This will contain the instantiated region for each region in those binders. When we then encounter a ReLateBound(d, br), we can use the De Bruijn index d to find the right scope, and then bound region name br to find the specific instantiation from within that scope. See replace_bound_region.

This field stores the instantiations for late-bound regions in the a type.

b_scopes: Vec<BoundRegionScope<'tcx>>

Same as a_scopes, but for the b type.

Implementations

impl<'me, 'tcx, D> TypeRelating<'me, 'tcx, D> where
    D: TypeRelatingDelegate<'tcx>, 
[src]

pub fn new(
    infcx: &'me InferCtxt<'me, 'tcx>,
    delegate: D,
    ambient_variance: Variance
) -> Self
[src]

pub(in infer::nll_relate) fn ambient_covariance(
    &self
) -> bool
[src]

pub(in infer::nll_relate) fn ambient_contravariance(
    &self
) -> bool
[src]

pub(in infer::nll_relate) fn create_scope(
    &mut self,
    value: Binder<impl Relate<'tcx>>,
    universally_quantified: UniversallyQuantified
) -> BoundRegionScope<'tcx>
[src]

pub(in infer::nll_relate) fn lookup_bound_region(
    debruijn: DebruijnIndex,
    br: &BoundRegion,
    first_free_index: DebruijnIndex,
    scopes: &[BoundRegionScope<'tcx>]
) -> Region<'tcx>
[src]

When we encounter binders during the type traversal, we record the value to substitute for each of the things contained in that binder. (This will be either a universal placeholder or an existential inference variable.) Given the De Bruijn index debruijn (and name br) of some binder we have now encountered, this routine finds the value that we instantiated the region with; to do so, it indexes backwards into the list of ambient scopes scopes.

pub(in infer::nll_relate) fn replace_bound_region(
    &self,
    r: Region<'tcx>,
    first_free_index: DebruijnIndex,
    scopes: &[BoundRegionScope<'tcx>]
) -> Region<'tcx>
[src]

If r is a bound region, find the scope in which it is bound (from scopes) and return the value that we instantiated it with. Otherwise just return r.

pub(in infer::nll_relate) fn push_outlives(
    &mut self,
    sup: Region<'tcx>,
    sub: Region<'tcx>
)
[src]

Push a new outlives requirement into our output set of constraints.

pub(in infer::nll_relate) fn relate_projection_ty(
    &mut self,
    projection_ty: ProjectionTy<'tcx>,
    value_ty: Ty<'tcx>
) -> Ty<'tcx>
[src]

Relate a projection type and some value type lazily. This will always succeed, but we push an additional ProjectionEq goal depending on the value type:

  • if the value type is any type T which is not a projection, we push ProjectionEq(projection = T).
  • if the value type is another projection other_projection, we create a new inference variable ?U and push the two goals ProjectionEq(projection = ?U), ProjectionEq(other_projection = ?U).

pub(in infer::nll_relate) fn relate_ty_var<PAIR: VidValuePair<'tcx>>(
    &mut self,
    pair: PAIR
) -> RelateResult<'tcx, Ty<'tcx>>
[src]

Relate a type inference variable with a value type. This works by creating a "generalization" G of the value where all the lifetimes are replaced with fresh inference values. This genearlization G becomes the value of the inference variable, and is then related in turn to the value. So e.g. if you had vid = ?0 and value = &'a u32, we might first instantiate ?0 to a type like &'0 u32 where '0 is a fresh variable, and then relate &'0 u32 with &'a u32 (resulting in relations between '0 and 'a).

The variable pair can be either a (vid, ty) or (ty, vid) -- in other words, it is always a (unresolved) inference variable vid and a type ty that are being related, but the vid may appear either as the "a" type or the "b" type, depending on where it appears in the tuple. The trait VidValuePair lets us work with the vid/type while preserving the "sidedness" when necessary -- the sidedness is relevant in particular for the variance and set of in-scope things.

pub(in infer::nll_relate) fn generalize_value<T: Relate<'tcx>>(
    &mut self,
    value: T,
    for_vid: TyVid
) -> RelateResult<'tcx, T>
[src]

Trait Implementations

impl<'tcx, D, '_> ConstEquateRelation<'tcx> for TypeRelating<'_, 'tcx, D> where
    D: TypeRelatingDelegate<'tcx>, 
[src]

impl<D, 'tcx, 'me> TypeRelation<'tcx> for TypeRelating<'me, 'tcx, D> where
    D: TypeRelatingDelegate<'tcx>, 
[src]

Auto Trait Implementations

impl<'me, 'tcx, D> !RefUnwindSafe for TypeRelating<'me, 'tcx, D>

impl<'me, 'tcx, D> !Send for TypeRelating<'me, 'tcx, D>

impl<'me, 'tcx, D> !Sync for TypeRelating<'me, 'tcx, D>

impl<'me, 'tcx, D> Unpin for TypeRelating<'me, 'tcx, D> where
    D: Unpin,
    'tcx: 'me, 

impl<'me, 'tcx, D> !UnwindSafe for TypeRelating<'me, 'tcx, D>

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized, 
[src]

impl<T> Borrow<T> for T where
    T: ?Sized, 
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized, 
[src]

impl<'a, T> Captures<'a> for T where
    T: ?Sized, 
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

impl<T> WithConstness for T[src]