Type Alias rustc_middle::ty::sty::RegionKind

source ·
pub type RegionKind<'tcx> = RegionKind<TyCtxt<'tcx>>;

Aliased Type§

enum RegionKind<'tcx> {
    ReBound(DebruijnIndex, BoundRegion),




A region parameter; for example 'a in impl<'a> Trait for &'a ().

There are some important differences between region and type parameters. Not all region parameters in the source are represented via ReEarlyParam: late-bound function parameters are instead lowered to a ReBound. Late-bound regions get eagerly replaced with ReLateParam which behaves in the same way as ReEarlyParam. Region parameters are also sometimes implicit, e.g. in impl Trait for &().


ReBound(DebruijnIndex, BoundRegion)

A higher-ranked region. These represent either late-bound function parameters or bound variables from a for<'a>-binder.

While inside of a function, e.g. during typeck, the late-bound function parameters can be converted to ReLateParam by calling tcx.liberate_late_bound_regions.

Bound regions inside of types must not be erased, as they impact trait selection and the TypeId of that type. for<'a> fn(&'a ()) and fn(&'static ()) are different types and have to be treated as such.



Late-bound function parameters are represented using a ReBound. When inside of a function, we convert these bound variables to placeholder parameters via tcx.liberate_late_bound_regions. They are then treated the same way as ReEarlyParam while inside of the function.

See https://rustc-dev-guide.rust-lang.org/early-late-bound-summary.html for more info about early and late bound lifetime parameters.



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



A region variable. Should not exist outside of type inference.



A placeholder region – the higher-ranked version of ReLateParam. Should not exist outside of type inference.

Used when instantiating a forall binder via infcx.instantiate_binder_with_placeholders.



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



A region that resulted from some other error. Used exclusively for diagnostics.


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: 24 bytes

Size for each variant:

  • ReEarlyParam: 16 bytes
  • ReBound: 20 bytes
  • ReLateParam: 20 bytes
  • ReStatic: 0 bytes
  • ReVar: 4 bytes
  • RePlaceholder: 20 bytes
  • ReErased: 0 bytes
  • ReError: 0 bytes