[−][src]Struct rustc_infer::infer::outlives::env::OutlivesEnvironment

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>,
}

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

impl<'a, 'tcx> OutlivesEnvironment<'tcx>[src]

pub fn new(param_env: ParamEnv<'tcx>) -> Self[src]

pub fn free_region_map(&self) -> &FreeRegionMap<'tcx>[src]

Borrows current value of the free_region_map.

pub fn region_bound_pairs_map(
    &self
) -> &FxHashMap<HirId, RegionBoundPairs<'tcx>>
[src]

Borrows current value of the region_bound_pairs.

pub fn into_free_region_map(self) -> FreeRegionMap<'tcx>[src]

Returns ownership of the free_region_map.

pub fn push_snapshot_pre_closure(&self) -> usize[src]

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_closure 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

pub fn pop_snapshot_post_closure(&mut self, len: usize)[src]

See push_snapshot_pre_closure.

pub fn save_implied_bounds(&mut self, body_id: HirId)[src]

Save the current set of region-bound pairs under the given body_id.

pub fn add_outlives_bounds<I>(
    &mut self,
    infcx: Option<&InferCtxt<'a, 'tcx>>,
    outlives_bounds: I
) where
    I: IntoIterator<Item = OutlivesBound<'tcx>>, 
[src]

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

impl<'tcx> Clone for OutlivesEnvironment<'tcx>[src]

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

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> ToOwned for T where
    T: Clone, 
[src]

type Owned = T

The resulting type after obtaining ownership.

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]