pub type PlaceElem<'tcx> = ProjectionElem<Local, Ty<'tcx>>;
Expand description
Alias for projections as they appear in places, where the base is a place and the index is a local.
Aliased Type§
pub enum PlaceElem<'tcx> {
Deref,
Field(FieldIdx, Ty<'tcx>),
Index(Local),
ConstantIndex {
offset: u64,
min_length: u64,
from_end: bool,
},
Subslice {
from: u64,
to: u64,
from_end: bool,
},
Downcast(Option<Symbol>, VariantIdx),
OpaqueCast(Ty<'tcx>),
UnwrapUnsafeBinder(Ty<'tcx>),
}
Variants§
Deref
Field(FieldIdx, Ty<'tcx>)
A field (e.g., f
in _1.f
) is one variant of ProjectionElem
. Conceptually,
rustc can identify that a field projection refers to either two different regions of memory
or the same one between the base and the ‘projection element’.
Read more about projections in the rustc-dev-guide
Index(Local)
Index into a slice/array.
Note that this does not also dereference, and so it does not exactly correspond to slice indexing in Rust. In other words, in the below Rust code:
let x = &[1, 2, 3, 4];
let i = 2;
x[i];
The x[i]
is turned into a Deref
followed by an Index
, not just an Index
. The same
thing is true of the ConstantIndex
and Subslice
projections below.
ConstantIndex
These indices are generated by slice patterns. Easiest to explain by example:
[X, _, .._, _, _] => { offset: 0, min_length: 4, from_end: false },
[_, X, .._, _, _] => { offset: 1, min_length: 4, from_end: false },
[_, _, .._, X, _] => { offset: 2, min_length: 4, from_end: true },
[_, _, .._, _, X] => { offset: 1, min_length: 4, from_end: true },
Fields
Subslice
These indices are generated by slice patterns.
If from_end
is true slice[from..slice.len() - to]
.
Otherwise array[from..to]
.
Fields
Downcast(Option<Symbol>, VariantIdx)
“Downcast” to a variant of an enum or a coroutine.
The included Symbol is the name of the variant, used for printing MIR.
This operation itself is never UB, all it does is change the type of the place.
OpaqueCast(Ty<'tcx>)
Like an explicit cast from an opaque type to a concrete type, but without requiring an intermediate variable.
This is unused with -Znext-solver
.
UnwrapUnsafeBinder(Ty<'tcx>)
A transmute from an unsafe binder to the type that it wraps. This is a projection of a place, so it doesn’t necessarily constitute a move out of the binder.
Layout§
Note: Unable to compute type layout, possibly due to this type having generic parameters. Layout can only be computed for concrete, fully-instantiated types.