Enum rustc::ty::RegionKind [] [src]

pub enum RegionKind {
    ReEarlyBound(EarlyBoundRegion),
    ReLateBound(DebruijnIndexBoundRegion),
    ReFree(FreeRegion),
    ReScope(Scope),
    ReStatic,
    ReVar(RegionVid),
    ReSkolemized(SkolemizedRegionVidBoundRegion),
    ReEmpty,
    ReErased,
}
🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

Representation of regions.

Unlike types, most region variants are "fictitious", not concrete, regions. Among these, ReStatic, ReEmpty and ReScope are the only ones representing concrete regions.

Bound Regions

These are regions that are stored behind a binder and must be substituted with some concrete region before being used. There are 2 kind of bound regions: early-bound, which are bound in an item's Generics, and are substituted by a Substs, and late-bound, which are part of higher-ranked types (e.g. for<'a> fn(&'a ())) and are substituted by the likes of liberate_late_bound_regions. The distinction exists because higher-ranked lifetimes aren't supported in all places. See [1][2].

Unlike TyParam-s, bound regions are not supposed to exist "in the wild" outside their binder, e.g. in types passed to type inference, and should first be substituted (by skolemized regions, free regions, or region variables).

Skolemized and Free Regions

One often wants to work with bound regions without knowing their precise identity. For example, when checking a function, the lifetime of a borrow can end up being assigned to some region parameter. In these cases, it must be ensured that bounds on the region can't be accidentally assumed without being checked.

The process of doing that is called "skolemization". The bound regions are replaced by skolemized markers, which don't satisfy any relation not explicitly provided.

There are 2 kinds of skolemized regions in rustc: ReFree and ReSkolemized. When checking an item's body, ReFree is supposed to be used. These also support explicit bounds: both the internally-stored scope, which the region is assumed to outlive, as well as other relations stored in the FreeRegionMap. Note that these relations aren't checked when you make_subregion (or eq_types), only by resolve_regions_and_report_errors.

When working with higher-ranked types, some region relations aren't yet known, so you can't just call resolve_regions_and_report_errors. ReSkolemized is designed for this purpose. In these contexts, there's also the risk that some inference variable laying around will get unified with your skolemized region: if you want to check whether for<'a> Foo<'_>: 'a, and you substitute your bound region 'a with a skolemized region '%a, the variable '_ would just be instantiated to the skolemized region '%a, which is wrong because the inference variable is supposed to satisfy the relation for every value of the skolemized region. To ensure that doesn't happen, you can use leak_check. This is more clearly explained by infer/higher_ranked/README.md.

[1] http://smallcultfollowing.com/babysteps/blog/2013/10/29/intermingled-parameter-lists/ [2] http://smallcultfollowing.com/babysteps/blog/2013/11/04/intermingled-parameter-lists/

Variants

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

When checking a function body, the types of all arguments and so forth that refer to bound region parameters are modified to refer to free region parameters.

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

A concrete region naming some statically determined scope (e.g. an expression or sequence of statements) within the current function.

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

Static data that has an "infinite" lifetime. Top in the region lattice.

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

A region variable. Should not exist after typeck.

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

A skolemized region - basically the higher-ranked version of ReFree. Should not exist after typeck.

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

Empty lifetime is for data that is never accessed. Bottom in the region lattice. We treat ReEmpty somewhat specially; at least right now, we do not generate instances of it during the GLB computations, but rather generate an error instead. This is to improve error messages. The only way to get an instance of ReEmpty is to have a region variable with no constraints.

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

Erased region, used by trait selection, in MIR and during trans.

Methods

impl RegionKind
[src]

Region utilities

[src]

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

[src]

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

[src]

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

[src]

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

Returns the depth of self from the (1-based) binding level depth

[src]

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

[src]

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

Given an early-bound or free region, returns the def-id where it was bound. For example, consider the regions in this snippet of code:

impl<'a> Foo {
     ^^ -- early bound, declared on an impl

    fn bar<'b, 'c>(x: &self, y: &'b u32, z: &'c u64) where 'static: 'c
           ^^  ^^     ^ anonymous, late-bound
           |   early-bound, appears in where-clauses
           late-bound, appears only in fn args
    {..}
}

Here, free_region_binding_scope('a) would return the def-id of the impl, and for all the other highlighted regions, it would return the def-id of the function. In other cases (not shown), this function might return the def-id of a closure.

Trait Implementations

impl<'gcx> HashStable<StableHashingContext<'gcx>> for RegionKind
[src]

[src]

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

impl Clone for RegionKind
[src]

[src]

Returns a copy of the value. Read more

1.0.0
[src]

Performs copy-assignment from source. Read more

impl PartialEq for RegionKind
[src]

[src]

This method tests for self and other values to be equal, and is used by ==. Read more

[src]

This method tests for !=.

impl Eq for RegionKind
[src]

impl Hash for RegionKind
[src]

[src]

Feeds this value into the given [Hasher]. Read more

1.3.0
[src]

Feeds a slice of this type into the given [Hasher]. Read more

impl Copy for RegionKind
[src]

impl Encodable for RegionKind
[src]

[src]

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

impl Decodable for RegionKind
[src]

[src]

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

impl PartialOrd for RegionKind
[src]

[src]

This method returns an ordering between self and other values if one exists. Read more

[src]

This method tests less than (for self and other) and is used by the < operator. Read more

[src]

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

[src]

This method tests greater than (for self and other) and is used by the > operator. Read more

[src]

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

impl Ord for RegionKind
[src]

[src]

This method returns an Ordering between self and other. Read more

1.21.0
[src]

Compares and returns the maximum of two values. Read more

1.21.0
[src]

Compares and returns the minimum of two values. Read more

impl Print for RegionKind
[src]

[src]

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

[src]

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

[src]

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

[src]

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

[src]

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

[src]

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

impl Display for RegionKind
[src]

[src]

Formats the value using the given formatter. Read more

impl Debug for RegionKind
[src]

[src]

Formats the value using the given formatter. Read more