pub(crate) enum PlaceBase {
Local(Local),
Upvar {
var_hir_id: LocalVarId,
closure_def_id: LocalDefId,
},
}
Expand description
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.
Trait Implementations§
source§impl<'tcx> From<PlaceBase> for PlaceBuilder<'tcx>
impl<'tcx> From<PlaceBase> for PlaceBuilder<'tcx>
source§impl PartialEq for PlaceBase
impl PartialEq for PlaceBase
impl Copy for PlaceBase
impl StructuralPartialEq for PlaceBase
Auto Trait Implementations§
impl DynSend for PlaceBase
impl DynSync for PlaceBase
impl Freeze for PlaceBase
impl RefUnwindSafe for PlaceBase
impl Send for PlaceBase
impl Sync for PlaceBase
impl Unpin for PlaceBase
impl UnwindSafe for PlaceBase
Blanket Implementations§
§impl<T> AnyEq for T
impl<T> AnyEq for T
source§impl<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for Twhere
T: Copy,
impl<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for Twhere
T: Copy,
fn allocate_on<'a>(self, arena: &'a Arena<'tcx>) -> &'a mut T
fn allocate_from_iter<'a>( arena: &'a Arena<'tcx>, iter: impl IntoIterator<Item = T> ) -> &'a mut [T]
source§impl<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for Twhere
T: Copy,
impl<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for Twhere
T: Copy,
fn allocate_on<'a>(self, arena: &'a Arena<'tcx>) -> &'a mut T
fn allocate_from_iter<'a>( arena: &'a Arena<'tcx>, iter: impl IntoIterator<Item = T> ) -> &'a mut [T]
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
§impl<T> Filterable for T
impl<T> Filterable for T
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<P> IntoQueryParam<P> for P
impl<P> IntoQueryParam<P> for P
fn into_query_param(self) -> P
source§impl<T> MaybeResult<T> for T
impl<T> MaybeResult<T> for T
§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<'tcx, T> ToPredicate<'tcx, T> for T
impl<'tcx, T> ToPredicate<'tcx, T> for T
fn to_predicate(self, _tcx: TyCtxt<'tcx>) -> T
source§impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
default fn from_cycle_error( tcx: Tcx, cycle_error: &CycleError, _guar: ErrorGuaranteed ) -> T
source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<T> ErasedDestructor for Twhere
T: 'static,
impl<T> MaybeSendSync for T
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: 12 bytes
Size for each variant:
Local
: 4 bytesUpvar
: 12 bytes