Struct rustc_infer::infer::outlives::env::OutlivesEnvironment
source · [−]pub struct OutlivesEnvironment<'tcx> {
pub param_env: ParamEnv<'tcx>,
free_region_map: FreeRegionMap<'tcx>,
region_bound_pairs_map: FxHashMap<HirId, RegionBoundPairs<'tcx>>,
region_bound_pairs_accum: RegionBoundPairs<'tcx>,
}Expand description
The OutlivesEnvironment collects information about what outlives
what in a given type-checking setting. For example, if we have a
where-clause like where T: 'a in scope, then the
OutlivesEnvironment would record that (in its
region_bound_pairs field). Similarly, it contains methods for
processing and adding implied bounds into the outlives
environment.
Other code at present does not typically take a
&OutlivesEnvironment, but rather takes some of its fields (e.g.,
process_registered_region_obligations wants the
region-bound-pairs). There is no mistaking it: the current setup
of tracking region information is quite scattered! The
OutlivesEnvironment, for example, needs to sometimes be combined
with the middle::RegionRelations, to yield a full picture of how
(lexical) lifetimes interact. However, I’m reluctant to do more
refactoring here, since the setup with NLL is quite different.
For example, NLL has no need of RegionRelations, and is solely
interested in the OutlivesEnvironment. -nmatsakis
Fields
param_env: ParamEnv<'tcx>free_region_map: FreeRegionMap<'tcx>region_bound_pairs_map: FxHashMap<HirId, RegionBoundPairs<'tcx>>region_bound_pairs_accum: RegionBoundPairs<'tcx>Implementations
sourceimpl<'a, 'tcx> OutlivesEnvironment<'tcx>
impl<'a, 'tcx> OutlivesEnvironment<'tcx>
pub fn new(param_env: ParamEnv<'tcx>) -> Self
sourcepub fn free_region_map(&self) -> &FreeRegionMap<'tcx>
pub fn free_region_map(&self) -> &FreeRegionMap<'tcx>
Borrows current value of the free_region_map.
sourcepub fn region_bound_pairs_map(
&self
) -> &FxHashMap<HirId, RegionBoundPairs<'tcx>>
pub fn region_bound_pairs_map(
&self
) -> &FxHashMap<HirId, RegionBoundPairs<'tcx>>
Borrows current value of the region_bound_pairs.
sourcepub fn push_snapshot_pre_typeck_child(&self) -> usize
pub fn push_snapshot_pre_typeck_child(&self) -> usize
This is a hack to support the old-skool regionck, which
processes region constraints from the main function and the
closure together. In that context, when we enter a closure, we
want to be able to “save” the state of the surrounding a
function. We can then add implied bounds and the like from the
closure arguments into the environment – these should only
apply in the closure body, so once we exit, we invoke
pop_snapshot_post_typeck_child to remove them.
Example:
fn foo<T>() {
callback(for<'a> |x: &'a T| {
// ^^^^^^^ not legal syntax, but probably should be
// within this closure body, `T: 'a` holds
})
}This “containment” of closure’s effects only works so well. In
particular, we (intentionally) leak relationships between free
regions that are created by the closure’s bounds. The case
where this is useful is when you have (e.g.) a closure with a
signature like for<'a, 'b> fn(x: &'a &'b u32) – in this
case, we want to keep the relationship 'b: 'a in the
free-region-map, so that later if we have to take LUB('b, 'a) we can get the result 'b.
I have opted to keep all modifications to the free-region-map, however, and not just those that concern free variables bound in the closure. The latter seems more correct, but it is not the existing behavior, and I could not find a case where the existing behavior went wrong. In any case, it seems like it’d be readily fixed if we wanted. There are similar leaks around givens that seem equally suspicious, to be honest. –nmatsakis
sourcepub fn pop_snapshot_post_typeck_child(&mut self, len: usize)
pub fn pop_snapshot_post_typeck_child(&mut self, len: usize)
See push_snapshot_pre_typeck_child.
sourcepub fn save_implied_bounds(&mut self, body_id: HirId)
pub fn save_implied_bounds(&mut self, body_id: HirId)
Save the current set of region-bound pairs under the given body_id.
sourcepub fn add_outlives_bounds<I>(
&mut self,
infcx: Option<&InferCtxt<'a, 'tcx>>,
outlives_bounds: I
) where
I: IntoIterator<Item = OutlivesBound<'tcx>>,
pub fn add_outlives_bounds<I>(
&mut self,
infcx: Option<&InferCtxt<'a, 'tcx>>,
outlives_bounds: I
) where
I: IntoIterator<Item = OutlivesBound<'tcx>>,
Processes outlives bounds that are known to hold, whether from implied or other sources.
The infcx parameter is optional; if the implied bounds may
contain inference variables, it must be supplied, in which
case we will register “givens” on the inference context. (See
RegionConstraintData.)
Trait Implementations
sourceimpl<'tcx> Clone for OutlivesEnvironment<'tcx>
impl<'tcx> Clone for OutlivesEnvironment<'tcx>
sourcefn clone(&self) -> OutlivesEnvironment<'tcx>
fn clone(&self) -> OutlivesEnvironment<'tcx>
Returns a copy of the value. Read more
1.0.0 · sourcefn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read more
Auto Trait Implementations
impl<'tcx> !RefUnwindSafe for OutlivesEnvironment<'tcx>
impl<'tcx> Send for OutlivesEnvironment<'tcx>
impl<'tcx> !Sync for OutlivesEnvironment<'tcx>
impl<'tcx> Unpin for OutlivesEnvironment<'tcx>
impl<'tcx> !UnwindSafe for OutlivesEnvironment<'tcx>
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcepub fn borrow_mut(&mut self) -> &mut T
pub fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
sourceimpl<T> ToOwned for T where
T: Clone,
impl<T> ToOwned for T where
T: Clone,
type Owned = T
type Owned = T
The resulting type after obtaining ownership.
sourcepub fn to_owned(&self) -> T
pub fn to_owned(&self) -> T
Creates owned data from borrowed data, usually by cloning. Read more
sourcepub fn clone_into(&self, target: &mut T)
pub fn clone_into(&self, target: &mut T)
toowned_clone_into)Uses borrowed data to replace owned data, usually by cloning. Read more
impl<'a, T> Captures<'a> for T where
T: ?Sized,
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: 192 bytes