struct ConstAnalysis<'a, 'tcx> {
    map: Map,
    tcx: TyCtxt<'tcx>,
    local_decls: &'a LocalDecls<'tcx>,
    ecx: InterpCx<'tcx, 'tcx, DummyMachine>,
    param_env: ParamEnv<'tcx>,
}

Fields§

§map: Map§tcx: TyCtxt<'tcx>§local_decls: &'a LocalDecls<'tcx>§ecx: InterpCx<'tcx, 'tcx, DummyMachine>§param_env: ParamEnv<'tcx>

Implementations§

source§

impl<'a, 'tcx> ConstAnalysis<'a, 'tcx>

source

pub fn new(tcx: TyCtxt<'tcx>, body: &'a Body<'tcx>, map: Map) -> Self

source

fn assign_operand( &self, state: &mut State<FlatSet<Scalar>>, place: PlaceIndex, operand: &Operand<'tcx> )

The caller must have flooded place.

source

fn assign_constant( &self, state: &mut State<FlatSet<Scalar>>, place: PlaceIndex, operand: OpTy<'tcx>, projection: &[PlaceElem<'tcx>] ) -> Option<!>

The caller must have flooded place.

Perform: place = operand.projection.

source

fn binary_op( &self, state: &mut State<FlatSet<Scalar>>, op: BinOp, left: &Operand<'tcx>, right: &Operand<'tcx> ) -> (FlatSet<Scalar>, FlatSet<bool>)

source

fn eval_operand( &self, op: &Operand<'tcx>, state: &mut State<FlatSet<Scalar>> ) -> FlatSet<ImmTy<'tcx>>

source

fn eval_discriminant( &self, enum_ty: Ty<'tcx>, variant_index: VariantIdx ) -> Option<Scalar>

source

fn wrap_immediate(&self, imm: Immediate) -> FlatSet<Scalar>

Trait Implementations§

source§

impl<'tcx> ValueAnalysis<'tcx> for ConstAnalysis<'_, 'tcx>

§

type Value = FlatSet<Scalar<AllocId>>

For each place of interest, the analysis tracks a value of the given type.
source§

const NAME: &'static str = "ConstAnalysis"

source§

fn map(&self) -> &Map

source§

fn handle_set_discriminant( &self, place: Place<'tcx>, variant_index: VariantIdx, state: &mut State<Self::Value> )

source§

fn handle_assign( &self, target: Place<'tcx>, rvalue: &Rvalue<'tcx>, state: &mut State<Self::Value> )

source§

fn handle_rvalue( &self, rvalue: &Rvalue<'tcx>, state: &mut State<Self::Value> ) -> ValueOrPlace<Self::Value>

source§

fn handle_constant( &self, constant: &ConstOperand<'tcx>, _state: &mut State<Self::Value> ) -> Self::Value

source§

fn handle_switch_int<'mir>( &self, discr: &'mir Operand<'tcx>, targets: &'mir SwitchTargets, state: &mut State<Self::Value> ) -> TerminatorEdges<'mir, 'tcx>

source§

fn handle_statement( &self, statement: &Statement<'tcx>, state: &mut State<Self::Value> )

source§

fn super_statement( &self, statement: &Statement<'tcx>, state: &mut State<Self::Value> )

source§

fn super_set_discriminant( &self, place: Place<'tcx>, _variant_index: VariantIdx, state: &mut State<Self::Value> )

source§

fn handle_intrinsic( &self, intrinsic: &NonDivergingIntrinsic<'tcx>, state: &mut State<Self::Value> )

source§

fn super_intrinsic( &self, intrinsic: &NonDivergingIntrinsic<'tcx>, _state: &mut State<Self::Value> )

source§

fn super_assign( &self, target: Place<'tcx>, rvalue: &Rvalue<'tcx>, state: &mut State<Self::Value> )

source§

fn super_rvalue( &self, rvalue: &Rvalue<'tcx>, state: &mut State<Self::Value> ) -> ValueOrPlace<Self::Value>

source§

fn handle_operand( &self, operand: &Operand<'tcx>, state: &mut State<Self::Value> ) -> ValueOrPlace<Self::Value>

source§

fn super_operand( &self, operand: &Operand<'tcx>, state: &mut State<Self::Value> ) -> ValueOrPlace<Self::Value>

source§

fn super_constant( &self, _constant: &ConstOperand<'tcx>, _state: &mut State<Self::Value> ) -> Self::Value

source§

fn handle_terminator<'mir>( &self, terminator: &'mir Terminator<'tcx>, state: &mut State<Self::Value> ) -> TerminatorEdges<'mir, 'tcx>

The effect of a successful function call return should not be applied here, see Analysis::apply_terminator_effect.
source§

fn super_terminator<'mir>( &self, terminator: &'mir Terminator<'tcx>, state: &mut State<Self::Value> ) -> TerminatorEdges<'mir, 'tcx>

source§

fn handle_call_return( &self, return_places: CallReturnPlaces<'_, 'tcx>, state: &mut State<Self::Value> )

source§

fn super_call_return( &self, return_places: CallReturnPlaces<'_, 'tcx>, state: &mut State<Self::Value> )

source§

fn super_switch_int<'mir>( &self, discr: &'mir Operand<'tcx>, targets: &'mir SwitchTargets, _state: &mut State<Self::Value> ) -> TerminatorEdges<'mir, 'tcx>

source§

fn wrap(self) -> ValueAnalysisWrapper<Self>where Self: Sized,

Auto Trait Implementations§

§

impl<'a, 'tcx> !RefUnwindSafe for ConstAnalysis<'a, 'tcx>

§

impl<'a, 'tcx> !Send for ConstAnalysis<'a, 'tcx>

§

impl<'a, 'tcx> !Sync for ConstAnalysis<'a, 'tcx>

§

impl<'a, 'tcx> Unpin for ConstAnalysis<'a, 'tcx>

§

impl<'a, 'tcx> !UnwindSafe for ConstAnalysis<'a, 'tcx>

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.

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: 320 bytes