pub type ProvidedValue<'tcx> = ConstValue<'tcx>;
Expand description

This type alias specifies the type returned from query providers and the type used for decoding. For regular queries this is the declared returned type V, but arena_cache will use <V as Deref>::Target instead.

Aliased Type§

enum ProvidedValue<'tcx> {
    Scalar(Scalar<AllocId>),
    ZeroSized,
    Slice {
        data: ConstAllocation<'tcx>,
        meta: u64,
    },
    Indirect {
        alloc_id: AllocId,
        offset: Size,
    },
}

Variants§

§

Scalar(Scalar<AllocId>)

Used for types with layout::abi::Scalar ABI.

Not using the enum Value to encode that this must not be Uninit.

§

ZeroSized

Only for ZSTs.

§

Slice

Fields

§data: ConstAllocation<'tcx>

The allocation storing the slice contents. This always points to the beginning of the allocation.

§meta: u64

The metadata field of the reference. This is a “target usize”, so we use u64 as in the interpreter.

Used for references to unsized types with slice tail.

This is worth an optimized representation since Rust has literals of type &str and &[u8]. Not having to indirect those through an AllocId (or two, if we used Indirect) has shown measurable performance improvements on stress tests. We then reuse this optimization for slice-tail types more generally during valtree-to-constval conversion.

§

Indirect

Fields

§alloc_id: AllocId

The backing memory of the value. May contain more memory than needed for just the value if this points into some other larger ConstValue.

We use an AllocId here instead of a ConstAllocation<'tcx> to make sure that when a raw constant (which is basically just an AllocId) is turned into a ConstValue and back, we can preserve the original AllocId.

§offset: Size

Offset into alloc

A value not representable by the other variants; needs to be stored in-memory.

Must not be used for scalars or ZST, but having &str or other slices in this variant is fine.

Implementations§

source§

impl<'tcx> ConstValue<'tcx>

source

pub fn try_to_scalar(&self) -> Option<Scalar<AllocId>>

source

pub fn try_to_scalar_int(&self) -> Option<ScalarInt>

source

pub fn try_to_bits(&self, size: Size) -> Option<u128>

source

pub fn try_to_bool(&self) -> Option<bool>

source

pub fn try_to_target_usize(&self, tcx: TyCtxt<'tcx>) -> Option<u64>

source

pub fn try_to_bits_for_ty( &self, tcx: TyCtxt<'tcx>, param_env: ParamEnv<'tcx>, ty: Ty<'tcx> ) -> Option<u128>

source

pub fn from_bool(b: bool) -> Self

source

pub fn from_u64(i: u64) -> Self

source

pub fn from_u128(i: u128) -> Self

source

pub fn from_target_usize(i: u64, cx: &impl HasDataLayout) -> Self

source

pub fn try_get_slice_bytes_for_diagnostics( &self, tcx: TyCtxt<'tcx> ) -> Option<&'tcx [u8]>

Must only be called on constants of type &str or &[u8]!

Trait Implementations§

source§

impl<'tcx> Clone for ConstValue<'tcx>

source§

fn clone(&self) -> ConstValue<'tcx>

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<'tcx> Debug for ConstValue<'tcx>

source§

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

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

impl<'tcx, __D: TyDecoder<I = TyCtxt<'tcx>>> Decodable<__D> for ConstValue<'tcx>

source§

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

source§

impl<'tcx, __E: TyEncoder<I = TyCtxt<'tcx>>> Encodable<__E> for ConstValue<'tcx>

source§

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

source§

impl<'tcx> EraseType for ConstValue<'tcx>

§

type Result = [u8; 24]

source§

impl<'tcx> Hash for ConstValue<'tcx>

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<'tcx, '__ctx> HashStable<StableHashingContext<'__ctx>> for ConstValue<'tcx>

source§

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

source§

impl<'tcx, '__lifted> Lift<'__lifted> for ConstValue<'tcx>

§

type Lifted = ConstValue<'__lifted>

source§

fn lift_to_tcx(self, __tcx: TyCtxt<'__lifted>) -> Option<ConstValue<'__lifted>>

source§

impl<'tcx> PartialEq<ConstValue<'tcx>> for ConstValue<'tcx>

source§

fn eq(&self, other: &ConstValue<'tcx>) -> 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<'tcx> TypeFoldable<TyCtxt<'tcx>> for ConstValue<'tcx>

source§

fn try_fold_with<F: FallibleTypeFolder<TyCtxt<'tcx>>>( self, _: &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: TypeFolder<TyCtxt<'tcx>>>(self, _: &mut F) -> Self

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> TypeVisitable<TyCtxt<'tcx>> for ConstValue<'tcx>

source§

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

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

impl<'tcx> Copy for ConstValue<'tcx>

source§

impl<'tcx> Eq for ConstValue<'tcx>

source§

impl<'tcx> StructuralEq for ConstValue<'tcx>

source§

impl<'tcx> StructuralPartialEq for ConstValue<'tcx>

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:

  • Scalar: 24 bytes
  • ZeroSized: 0 bytes
  • Slice: 24 bytes
  • Indirect: 24 bytes