pub enum ProjectionElem {
    Deref,
    Field(FieldProjKind, FieldId),
    PtrMetadata,
    Index {
        offset: Box<Operand>,
        from_end: bool,
    },
    Subslice {
        from: Box<Operand>,
        to: Box<Operand>,
        from_end: bool,
    },
}Expand description
Note that we don’t have the equivalent of “downcasts”.
Downcasts are actually necessary, for instance when initializing enumeration
values: the value is initially Bottom, and we need a way of knowing the
variant.
For example:
((_0 as Right).0: T2) = move _1;
In MIR, downcasts always happen before field projections: in our internal
language, we thus merge downcasts and field projections.
Variants§
Deref
Dereference a shared/mutable reference, a box, or a raw pointer.
Field(FieldProjKind, FieldId)
Projection from ADTs (variants, structures). We allow projections to be used as left-values and right-values. We should never have projections to fields of symbolic variants (they should have been expanded before through a match).
PtrMetadata
A built-in pointer (a reference, raw pointer, or Box) in Rust is always a fat pointer: it
contains an address and metadata for the pointed-to place. This metadata is empty for sized
types, it’s the length for slices, and the vtable for dyn Trait.
We consider such pointers to be like a struct with two fields; this represent access to the metadata “field”.
Index
MIR imposes that the argument to an index projection be a local variable, meaning that even constant indices into arrays are let-bound as separate variables. We eliminate this variant in a micro-pass for LLBC.
Subslice
Take a subslice of a slice or array. If from_end is true this is
slice[from..slice.len() - to], otherwise this is slice[from..to].
We eliminate this variant in a micro-pass for LLBC.
Implementations§
Source§impl ProjectionElem
 
impl ProjectionElem
pub fn as_deref_mut(&mut self) -> Option<()>
pub fn as_field_mut(&mut self) -> Option<(&mut FieldProjKind, &mut FieldId)>
pub fn as_ptr_metadata_mut(&mut self) -> Option<()>
pub fn as_index_mut(&mut self) -> Option<(&mut Box<Operand>, &mut bool)>
pub fn as_subslice_mut( &mut self, ) -> Option<(&mut Box<Operand>, &mut Box<Operand>, &mut bool)>
Source§impl ProjectionElem
 
impl ProjectionElem
pub fn variant_name(&self) -> &'static str
Source§impl ProjectionElem
 
impl ProjectionElem
Sourcepub fn project_type(&self, krate: &TranslatedCrate, ty: &Ty) -> Result<Ty, ()>
 
pub fn project_type(&self, krate: &TranslatedCrate, ty: &Ty) -> Result<Ty, ()>
Compute the type obtained when applying the current projection to a place of type ty.
Trait Implementations§
Source§impl AstVisitable for ProjectionElem
 
impl AstVisitable for ProjectionElem
Source§fn drive<V: VisitAst>(&self, v: &mut V) -> ControlFlow<V::Break>
 
fn drive<V: VisitAst>(&self, v: &mut V) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner.Source§fn drive_mut<V: VisitAstMut>(&mut self, v: &mut V) -> ControlFlow<V::Break>
 
fn drive_mut<V: VisitAstMut>(&mut self, v: &mut V) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner.Source§fn dyn_visit<T: AstVisitable>(&self, f: impl FnMut(&T))
 
fn dyn_visit<T: AstVisitable>(&self, f: impl FnMut(&T))
self, in pre-order traversal.Source§fn dyn_visit_mut<T: AstVisitable>(&mut self, f: impl FnMut(&mut T))
 
fn dyn_visit_mut<T: AstVisitable>(&mut self, f: impl FnMut(&mut T))
self, in pre-order traversal.Source§impl BodyVisitable for ProjectionElem
 
impl BodyVisitable for ProjectionElem
Source§fn drive_body<V: VisitBody>(&self, v: &mut V) -> ControlFlow<V::Break>
 
fn drive_body<V: VisitBody>(&self, v: &mut V) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner.Source§fn drive_body_mut<V: VisitBodyMut>(
    &mut self,
    v: &mut V,
) -> ControlFlow<V::Break>
 
fn drive_body_mut<V: VisitBodyMut>( &mut self, v: &mut V, ) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner.Source§fn dyn_visit_in_body<T: BodyVisitable>(&self, f: impl FnMut(&T))
 
fn dyn_visit_in_body<T: BodyVisitable>(&self, f: impl FnMut(&T))
self, in pre-order traversal.Source§fn dyn_visit_in_body_mut<T: BodyVisitable>(&mut self, f: impl FnMut(&mut T))
 
fn dyn_visit_in_body_mut<T: BodyVisitable>(&mut self, f: impl FnMut(&mut T))
self, in pre-order traversal.Source§impl Clone for ProjectionElem
 
impl Clone for ProjectionElem
Source§fn clone(&self) -> ProjectionElem
 
fn clone(&self) -> ProjectionElem
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
 
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ProjectionElem
 
impl Debug for ProjectionElem
Source§impl<'de> Deserialize<'de> for ProjectionElem
 
impl<'de> Deserialize<'de> for ProjectionElem
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
    __D: Deserializer<'de>,
 
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
    __D: Deserializer<'de>,
Source§impl<'s, V> Drive<'s, V> for ProjectionElem
 
impl<'s, V> Drive<'s, V> for ProjectionElem
Source§fn drive_inner(&'s self, visitor: &mut V) -> ControlFlow<V::Break>
 
fn drive_inner(&'s self, visitor: &mut V) -> ControlFlow<V::Break>
v.visit() on the immediate contents of self.Source§impl<'s, V> DriveMut<'s, V> for ProjectionElemwhere
    V: Visitor + VisitMut<'s, FieldProjKind> + VisitMut<'s, FieldId> + VisitMut<'s, Box<Operand>>,
 
impl<'s, V> DriveMut<'s, V> for ProjectionElemwhere
    V: Visitor + VisitMut<'s, FieldProjKind> + VisitMut<'s, FieldId> + VisitMut<'s, Box<Operand>>,
Source§fn drive_inner_mut(&'s mut self, visitor: &mut V) -> ControlFlow<V::Break>
 
fn drive_inner_mut(&'s mut self, visitor: &mut V) -> ControlFlow<V::Break>
v.visit() on the immediate contents of self.Source§impl PartialEq for ProjectionElem
 
impl PartialEq for ProjectionElem
Source§impl Serialize for ProjectionElem
 
impl Serialize for ProjectionElem
impl Eq for ProjectionElem
impl StructuralPartialEq for ProjectionElem
Auto Trait Implementations§
impl Freeze for ProjectionElem
impl RefUnwindSafe for ProjectionElem
impl Send for ProjectionElem
impl Sync for ProjectionElem
impl Unpin for ProjectionElem
impl UnwindSafe for ProjectionElem
Blanket Implementations§
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> CloneToUninit for Twhere
    T: Clone,
 
impl<T> CloneToUninit for Twhere
    T: Clone,
§impl<Q, K> Equivalent<K> for Q
 
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
 
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
 
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
 
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.§impl<I, T> ExtractContext<I, ()> for T
 
impl<I, T> ExtractContext<I, ()> for T
§fn extract_context(self, _original_input: I)
 
fn extract_context(self, _original_input: I)
§impl<T> Instrument for T
 
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
 
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
 
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
 
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
 
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
 
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<I> RecreateContext<I> for I
 
impl<I> RecreateContext<I> for I
§fn recreate_context(_original_input: I, tail: I) -> I
 
fn recreate_context(_original_input: I, tail: I) -> I
Source§impl<T> TyVisitable for Twhere
    T: AstVisitable,
 
impl<T> TyVisitable for Twhere
    T: AstVisitable,
Source§fn visit_vars(&mut self, v: &mut impl VarsVisitor)
 
fn visit_vars(&mut self, v: &mut impl VarsVisitor)
self, as seen from the outside of self. This means
that any variable bound inside self will be skipped, and all the seen De Bruijn indices
will count from the outside of self.Source§fn substitute(self, generics: &GenericArgs) -> Self
 
fn substitute(self, generics: &GenericArgs) -> Self
self by replacing them with the provided values.
Note: if self is an item that comes from a TraitDecl, you most likely want to use
substitute_with_self.Source§fn substitute_explicits(self, generics: &GenericArgs) -> Self
 
fn substitute_explicits(self, generics: &GenericArgs) -> Self
Source§fn substitute_with_self(
    self,
    generics: &GenericArgs,
    self_ref: &TraitRefKind,
) -> Self
 
fn substitute_with_self( self, generics: &GenericArgs, self_ref: &TraitRefKind, ) -> Self
TraitRefKind::Self trait ref.Source§fn move_under_binder(self) -> Self
 
fn move_under_binder(self) -> Self
Source§fn move_under_binders(self, depth: DeBruijnId) -> Self
 
fn move_under_binders(self, depth: DeBruijnId) -> Self
depth binders.Source§fn move_from_under_binder(self) -> Option<Self>
 
fn move_from_under_binder(self) -> Option<Self>
Source§fn move_from_under_binders(self, depth: DeBruijnId) -> Option<Self>
 
fn move_from_under_binders(self, depth: DeBruijnId) -> Option<Self>
depth binders. Returns None if it contains a variable bound in
one of these depth binders.Source§fn visit_db_id<B>(
    &mut self,
    f: impl FnMut(&mut DeBruijnId) -> ControlFlow<B>,
) -> ControlFlow<B>
 
fn visit_db_id<B>( &mut self, f: impl FnMut(&mut DeBruijnId) -> ControlFlow<B>, ) -> ControlFlow<B>
self, as seen from the outside of self. This means
that any variable bound inside self will be skipped, and all the seen indices will count
from the outside of self.