Enum rustc_mir_build::build::expr::as_place::PlaceBase[−][src]

pub(crate) enum PlaceBase {
    Local(Local),
    Upvar {
        var_hir_id: HirId,
        closure_def_id: DefId,
        closure_kind: ClosureKind,
    },
}

The “outermost” place that holds this value.

Variants

Local(Local)

Denotes the start of a Place.

Upvar

When building place for an expression within a closure, the place might start off a captured path. When capture_disjoint_fields is enabled, we might not know the capture index (within the desugared closure) of the captured path until most of the projections are applied. We use PlaceBase::Upvar to keep track of the root variable off of which the captured path starts, the closure the capture belongs to and the trait the closure implements.

Once we have figured out the capture index, we can convert the place builder to start from PlaceBase::Local.

Consider the following example

let t = (10, (10, (10, 10)));

let c = || {
    println!("{}", t.0.0.0);
};

Here the THIR expression for t.0.0.0 will be something like

* Field(0)
    * Field(0)
        * Field(0)
            * UpvarRef(t)

When capture_disjoint_fields is enabled, t.0.0.0 is captured and we won’t be able to figure out that it is captured until all the Field projections are applied.

Fields of Upvar

var_hir_id: HirId

HirId of the upvar

closure_def_id: DefId

DefId of the closure

closure_kind: ClosureKind

The trait closure implements, Fn, FnMut, FnOnce

Trait Implementations

impl Clone for PlaceBase[src]

impl Copy for PlaceBase[src]

impl Debug for PlaceBase[src]

impl<'tcx> From<PlaceBase> for PlaceBuilder<'tcx>[src]

impl PartialEq<PlaceBase> for PlaceBase[src]

impl StructuralPartialEq for PlaceBase[src]

Auto Trait Implementations

impl RefUnwindSafe for PlaceBase

impl Send for PlaceBase

impl Sync for PlaceBase

impl Unpin for PlaceBase

impl UnwindSafe for PlaceBase

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.