[−][src]Struct rustc_infer::infer::nll_relate::TypeRelating
Fields
infcx: &'me InferCtxt<'me, 'tcx>delegate: DCallback to use when we deduce an outlives relationship
ambient_variance: VarianceHow are we relating a and b?
- Covariant means
a <: b. - Contravariant means
b <: a. - Invariant means `a == b.
- Bivariant means that it doesn't matter.
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]
D: TypeRelatingDelegate<'tcx>,
pub fn new(
infcx: &'me InferCtxt<'me, 'tcx>,
delegate: D,
ambient_variance: Variance
) -> Self[src]
infcx: &'me InferCtxt<'me, 'tcx>,
delegate: D,
ambient_variance: Variance
) -> Self
pub(in infer::nll_relate) fn ambient_covariance(
&self
) -> bool[src]
&self
) -> bool
pub(in infer::nll_relate) fn ambient_contravariance(
&self
) -> bool[src]
&self
) -> bool
pub(in infer::nll_relate) fn create_scope(
&mut self,
value: Binder<impl Relate<'tcx>>,
universally_quantified: UniversallyQuantified
) -> BoundRegionScope<'tcx>[src]
&mut self,
value: Binder<impl Relate<'tcx>>,
universally_quantified: UniversallyQuantified
) -> BoundRegionScope<'tcx>
pub(in infer::nll_relate) fn lookup_bound_region(
debruijn: DebruijnIndex,
br: &BoundRegion,
first_free_index: DebruijnIndex,
scopes: &[BoundRegionScope<'tcx>]
) -> Region<'tcx>[src]
debruijn: DebruijnIndex,
br: &BoundRegion,
first_free_index: DebruijnIndex,
scopes: &[BoundRegionScope<'tcx>]
) -> Region<'tcx>
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]
&self,
r: Region<'tcx>,
first_free_index: DebruijnIndex,
scopes: &[BoundRegionScope<'tcx>]
) -> Region<'tcx>
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]
&mut self,
sup: Region<'tcx>,
sub: Region<'tcx>
)
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]
&mut self,
projection_ty: ProjectionTy<'tcx>,
value_ty: Ty<'tcx>
) -> Ty<'tcx>
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
Twhich is not a projection, we pushProjectionEq(projection = T). - if the value type is another projection
other_projection, we create a new inference variable?Uand push the two goalsProjectionEq(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]
&mut self,
pair: PAIR
) -> RelateResult<'tcx, Ty<'tcx>>
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]
&mut self,
value: T,
for_vid: TyVid
) -> RelateResult<'tcx, T>
Trait Implementations
impl<'tcx, D, '_> ConstEquateRelation<'tcx> for TypeRelating<'_, 'tcx, D> where
D: TypeRelatingDelegate<'tcx>, [src]
D: TypeRelatingDelegate<'tcx>,
pub fn const_equate_obligation(
&mut self,
a: &'tcx Const<'tcx>,
b: &'tcx Const<'tcx>
)[src]
&mut self,
a: &'tcx Const<'tcx>,
b: &'tcx Const<'tcx>
)
impl<D, 'tcx, 'me> TypeRelation<'tcx> for TypeRelating<'me, 'tcx, D> where
D: TypeRelatingDelegate<'tcx>, [src]
D: TypeRelatingDelegate<'tcx>,
pub fn tcx(&self) -> TyCtxt<'tcx>[src]
pub fn param_env(&self) -> ParamEnv<'tcx>[src]
pub fn tag(&self) -> &'static str[src]
pub fn a_is_expected(&self) -> bool[src]
pub fn relate_with_variance<T: Relate<'tcx>>(
&mut self,
variance: Variance,
a: T,
b: T
) -> RelateResult<'tcx, T>[src]
&mut self,
variance: Variance,
a: T,
b: T
) -> RelateResult<'tcx, T>
pub fn tys(&mut self, a: Ty<'tcx>, b: Ty<'tcx>) -> RelateResult<'tcx, Ty<'tcx>>[src]
pub fn regions(
&mut self,
a: Region<'tcx>,
b: Region<'tcx>
) -> RelateResult<'tcx, Region<'tcx>>[src]
&mut self,
a: Region<'tcx>,
b: Region<'tcx>
) -> RelateResult<'tcx, Region<'tcx>>
pub fn consts(
&mut self,
a: &'tcx Const<'tcx>,
b: &'tcx Const<'tcx>
) -> RelateResult<'tcx, &'tcx Const<'tcx>>[src]
&mut self,
a: &'tcx Const<'tcx>,
b: &'tcx Const<'tcx>
) -> RelateResult<'tcx, &'tcx Const<'tcx>>
pub fn binders<T>(
&mut self,
a: Binder<T>,
b: Binder<T>
) -> RelateResult<'tcx, Binder<T>> where
T: Relate<'tcx>, [src]
&mut self,
a: Binder<T>,
b: Binder<T>
) -> RelateResult<'tcx, Binder<T>> where
T: Relate<'tcx>,
pub fn with_cause<F, R>(&mut self, _cause: Cause, f: F) -> R where
F: FnOnce(&mut Self) -> R, [src]
F: FnOnce(&mut Self) -> R,
pub fn relate<T>(&mut self, a: T, b: T) -> Result<T, TypeError<'tcx>> where
T: Relate<'tcx>, [src]
T: Relate<'tcx>,
pub fn relate_item_substs(
&mut self,
item_def_id: DefId,
a_subst: &'tcx List<GenericArg<'tcx>>,
b_subst: &'tcx List<GenericArg<'tcx>>
) -> Result<&'tcx List<GenericArg<'tcx>>, TypeError<'tcx>>[src]
&mut self,
item_def_id: DefId,
a_subst: &'tcx List<GenericArg<'tcx>>,
b_subst: &'tcx List<GenericArg<'tcx>>
) -> Result<&'tcx List<GenericArg<'tcx>>, TypeError<'tcx>>
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,
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]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized, [src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized, [src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T[src]
impl<'a, T> Captures<'a> for T where
T: ?Sized, [src]
T: ?Sized,
impl<T> From<T> for T[src]
impl<T, U> Into<U> for T where
U: From<T>, [src]
U: From<T>,
impl<T, U> TryFrom<U> for T where
U: Into<T>, [src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>, [src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.