Type Alias rustc_middle::mir::ProjectionKind

source ·
pub type ProjectionKind = ProjectionElem<(), ()>;
Expand description

Alias for projections as they appear in UserTypeProjection, where we need neither the V parameter for Index nor the T for Field.

Aliased Type§

enum ProjectionKind {
    Deref,
    Field(FieldIdx, ()),
    Index(()),
    ConstantIndex {
        offset: u64,
        min_length: u64,
        from_end: bool,
    },
    Subslice {
        from: u64,
        to: u64,
        from_end: bool,
    },
    Downcast(Option<Symbol>, VariantIdx),
    OpaqueCast(()),
    Subtype(()),
}

Variants§

§

Deref

§

Field(FieldIdx, ())

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(())

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

§offset: u64

index or -index (in Python terms), depending on from_end

§min_length: u64

The thing being indexed must be at least this long. For arrays this is always the exact length.

§from_end: bool

Counting backwards from end? This is always false when indexing an array.

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

§from: u64
§to: u64
§from_end: bool

Whether to counts from the start or end of the array/slice. For PlaceElems this is true if and only if the base is a slice. For ProjectionKind, this can also be true for arrays.

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(())

Like an explicit cast from an opaque type to a concrete type, but without requiring an intermediate variable.

§

Subtype(())

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>

source

fn is_indirect(&self) -> bool

Returns true if the target of this projection may refer to a different region of memory than the base.

source

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.

source

pub fn is_downcast_to(&self, v: VariantIdx) -> bool

Returns true if this is a Downcast projection with the given VariantIdx.

source

pub fn is_field_to(&self, f: FieldIdx) -> bool

Returns true if this is a Field projection with the given index.

source

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>

source§

fn clone(&self) -> ProjectionElem<V, T>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<V: Debug, T: Debug> Debug for ProjectionElem<V, T>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'tcx, V, T, __D: TyDecoder<I = TyCtxt<'tcx>>> Decodable<__D> for ProjectionElem<V, T>where T: Decodable<__D>, V: Decodable<__D>,

source§

fn decode(__decoder: &mut __D) -> Self

source§

impl<'tcx, V, T, __E: TyEncoder<I = TyCtxt<'tcx>>> Encodable<__E> for ProjectionElem<V, T>where T: Encodable<__E>, V: Encodable<__E>,

source§

fn encode(&self, __encoder: &mut __E)

source§

impl<V: Hash, T: Hash> Hash for ProjectionElem<V, T>

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl<'__ctx, V, T> HashStable<StableHashingContext<'__ctx>> for ProjectionElem<V, T>where T: HashStable<StableHashingContext<'__ctx>>, V: HashStable<StableHashingContext<'__ctx>>,

source§

fn hash_stable( &self, __hcx: &mut StableHashingContext<'__ctx>, __hasher: &mut StableHasher )

source§

impl<V: Ord, T: Ord> Ord for ProjectionElem<V, T>

source§

fn cmp(&self, other: &ProjectionElem<V, T>) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Selfwhere Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Selfwhere Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Selfwhere Self: Sized + PartialOrd<Self>,

Restrict a value to a certain interval. Read more
source§

impl<V: PartialEq, T: PartialEq> PartialEq<ProjectionElem<V, T>> for ProjectionElem<V, T>

source§

fn eq(&self, other: &ProjectionElem<V, T>) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<V: PartialOrd, T: PartialOrd> PartialOrd<ProjectionElem<V, T>> for ProjectionElem<V, T>

source§

fn partial_cmp(&self, other: &ProjectionElem<V, T>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more
source§

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>

The entry point for folding. To fold a value t with a folder f call: t.try_fold_with(f). Read more
source§

fn fold_with<F>(self, folder: &mut F) -> Selfwhere F: TypeFolder<I>,

A convenient alternative to 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>>,

source§

fn visit_with<__V: TypeVisitor<TyCtxt<'tcx>>>( &self, __visitor: &mut __V ) -> ControlFlow<__V::BreakTy>

The entry point for visiting. To visit a value t with a visitor v call: t.visit_with(v). Read more
source§

impl<V: Copy, T: Copy> Copy for ProjectionElem<V, T>

source§

impl<V: Eq, T: Eq> Eq for ProjectionElem<V, T>

source§

impl<V, T> StructuralEq for ProjectionElem<V, T>

source§

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 bytes
  • Field: 7 bytes
  • Index: 0 bytes
  • ConstantIndex: 23 bytes
  • Subslice: 23 bytes
  • Downcast: 11 bytes
  • OpaqueCast: 0 bytes
  • Subtype: 0 bytes