Type Alias rustc_middle::mir::PlaceElem
source · 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§
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>),
Subtype(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
Fields
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 },
Subslice
Fields
These indices are generated by slice patterns.
If from_end
is true slice[from..slice.len() - to]
.
Otherwise array[from..to]
.
Downcast(Option<Symbol>, VariantIdx)
“Downcast” to a variant of an enum or a generator.
The included Symbol is the name of the variant, used for printing MIR.
OpaqueCast(Ty<'tcx>)
Like an explicit cast from an opaque type to a concrete type, but without requiring an intermediate variable.
Subtype(Ty<'tcx>)
A Subtype(T)
projection is applied to any StatementKind::Assign
where
type of lvalue doesn’t match the type of rvalue, the primary goal is making subtyping
explicit during optimizations and codegen.
This projection doesn’t impact the runtime behavior of the program except for potentially changing some type metadata of the interpreter or codegen backend.
This goal is achieved with mir_transform pass Subtyper
, which runs right after
borrowchecker, as we only care about subtyping that can affect trait selection and
TypeId
.
Implementations§
source§impl<V, T> ProjectionElem<V, T>
impl<V, T> ProjectionElem<V, T>
sourcefn is_indirect(&self) -> bool
fn is_indirect(&self) -> bool
Returns true
if the target of this projection may refer to a different region of memory
than the base.
sourcepub fn is_stable_offset(&self) -> bool
pub fn is_stable_offset(&self) -> bool
Returns true
if the target of this projection always refers to the same memory region
whatever the state of the program.
sourcepub fn is_downcast_to(&self, v: VariantIdx) -> bool
pub fn is_downcast_to(&self, v: VariantIdx) -> bool
Returns true
if this is a Downcast
projection with the given VariantIdx
.
sourcepub fn is_field_to(&self, f: FieldIdx) -> bool
pub fn is_field_to(&self, f: FieldIdx) -> bool
Returns true
if this is a Field
projection with the given index.
sourcepub fn can_use_in_debuginfo(&self) -> bool
pub fn can_use_in_debuginfo(&self) -> bool
Returns true
if this is accepted inside VarDebugInfoContents::Place
.
Trait Implementations§
source§impl<V: Clone, T: Clone> Clone for ProjectionElem<V, T>
impl<V: Clone, T: Clone> Clone for ProjectionElem<V, T>
source§fn clone(&self) -> ProjectionElem<V, T>
fn clone(&self) -> ProjectionElem<V, T>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl<'tcx, V, T, __D: TyDecoder<I = TyCtxt<'tcx>>> Decodable<__D> for ProjectionElem<V, T>where
T: Decodable<__D>,
V: Decodable<__D>,
impl<'tcx, V, T, __D: TyDecoder<I = TyCtxt<'tcx>>> Decodable<__D> for ProjectionElem<V, T>where T: Decodable<__D>, V: Decodable<__D>,
source§impl<'tcx, V, T, __E: TyEncoder<I = TyCtxt<'tcx>>> Encodable<__E> for ProjectionElem<V, T>where
T: Encodable<__E>,
V: Encodable<__E>,
impl<'tcx, V, T, __E: TyEncoder<I = TyCtxt<'tcx>>> Encodable<__E> for ProjectionElem<V, T>where T: Encodable<__E>, V: Encodable<__E>,
source§impl<'__ctx, V, T> HashStable<StableHashingContext<'__ctx>> for ProjectionElem<V, T>where
T: HashStable<StableHashingContext<'__ctx>>,
V: HashStable<StableHashingContext<'__ctx>>,
impl<'__ctx, V, T> HashStable<StableHashingContext<'__ctx>> for ProjectionElem<V, T>where T: HashStable<StableHashingContext<'__ctx>>, V: HashStable<StableHashingContext<'__ctx>>,
fn hash_stable( &self, __hcx: &mut StableHashingContext<'__ctx>, __hasher: &mut StableHasher )
source§impl<V: Ord, T: Ord> Ord for ProjectionElem<V, T>
impl<V: Ord, T: Ord> Ord for ProjectionElem<V, T>
source§fn cmp(&self, other: &ProjectionElem<V, T>) -> Ordering
fn cmp(&self, other: &ProjectionElem<V, T>) -> Ordering
1.21.0 · source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere Self: Sized,
source§impl<V: PartialEq, T: PartialEq> PartialEq<ProjectionElem<V, T>> for ProjectionElem<V, T>
impl<V: PartialEq, T: PartialEq> PartialEq<ProjectionElem<V, T>> for ProjectionElem<V, T>
source§fn eq(&self, other: &ProjectionElem<V, T>) -> bool
fn eq(&self, other: &ProjectionElem<V, T>) -> bool
self
and other
values to be equal, and is used
by ==
.source§impl<V: PartialOrd, T: PartialOrd> PartialOrd<ProjectionElem<V, T>> for ProjectionElem<V, T>
impl<V: PartialOrd, T: PartialOrd> PartialOrd<ProjectionElem<V, T>> for ProjectionElem<V, T>
source§fn partial_cmp(&self, other: &ProjectionElem<V, T>) -> Option<Ordering>
fn partial_cmp(&self, other: &ProjectionElem<V, T>) -> Option<Ordering>
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
self
and other
) and is used by the <=
operator. Read moresource§impl<'tcx, V, T> TypeFoldable<TyCtxt<'tcx>> for ProjectionElem<V, T>where
T: TypeFoldable<TyCtxt<'tcx>>,
V: TypeFoldable<TyCtxt<'tcx>>,
impl<'tcx, V, T> TypeFoldable<TyCtxt<'tcx>> for ProjectionElem<V, T>where T: TypeFoldable<TyCtxt<'tcx>>, V: TypeFoldable<TyCtxt<'tcx>>,
source§fn try_fold_with<__F: FallibleTypeFolder<TyCtxt<'tcx>>>(
self,
__folder: &mut __F
) -> Result<Self, __F::Error>
fn try_fold_with<__F: FallibleTypeFolder<TyCtxt<'tcx>>>( self, __folder: &mut __F ) -> Result<Self, __F::Error>
source§fn fold_with<F>(self, folder: &mut F) -> Selfwhere
F: TypeFolder<I>,
fn fold_with<F>(self, folder: &mut F) -> Selfwhere F: TypeFolder<I>,
try_fold_with
for use with infallible
folders. Do not override this method, to ensure coherence with
try_fold_with
.source§impl<'tcx, V, T> TypeVisitable<TyCtxt<'tcx>> for ProjectionElem<V, T>where
T: TypeVisitable<TyCtxt<'tcx>>,
V: TypeVisitable<TyCtxt<'tcx>>,
impl<'tcx, V, T> TypeVisitable<TyCtxt<'tcx>> for ProjectionElem<V, T>where T: TypeVisitable<TyCtxt<'tcx>>, V: TypeVisitable<TyCtxt<'tcx>>,
source§fn visit_with<__V: TypeVisitor<TyCtxt<'tcx>>>(
&self,
__visitor: &mut __V
) -> ControlFlow<__V::BreakTy>
fn visit_with<__V: TypeVisitor<TyCtxt<'tcx>>>( &self, __visitor: &mut __V ) -> ControlFlow<__V::BreakTy>
impl<V: Copy, T: Copy> Copy for ProjectionElem<V, T>
impl<V: Eq, T: Eq> Eq for ProjectionElem<V, T>
impl<V, T> StructuralEq for ProjectionElem<V, T>
impl<V, T> StructuralPartialEq for ProjectionElem<V, 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: 24 bytes
Size for each variant:
Deref
: 0 bytesField
: 15 bytesIndex
: 7 bytesConstantIndex
: 23 bytesSubslice
: 23 bytesDowncast
: 11 bytesOpaqueCast
: 15 bytesSubtype
: 15 bytes