struct TOFinder<'a, 'tcx> {
tcx: TyCtxt<'tcx>,
typing_env: TypingEnv<'tcx>,
ecx: InterpCx<'tcx, DummyMachine>,
body: &'a Body<'tcx>,
map: Map<'tcx>,
maybe_loop_headers: DenseBitSet<BasicBlock>,
entry_states: IndexVec<BasicBlock, ConditionSet>,
}Fields§
§tcx: TyCtxt<'tcx>§typing_env: TypingEnv<'tcx>§ecx: InterpCx<'tcx, DummyMachine>§body: &'a Body<'tcx>§map: Map<'tcx>§maybe_loop_headers: DenseBitSet<BasicBlock>§entry_states: IndexVec<BasicBlock, ConditionSet>This stores the state of each visited block on entry, and the current state of the block being visited.
Implementations§
Source§impl<'a, 'tcx> TOFinder<'a, 'tcx>
impl<'a, 'tcx> TOFinder<'a, 'tcx>
Sourcefn populate_from_outgoing_edges(&mut self, bb: BasicBlock) -> ConditionSet
fn populate_from_outgoing_edges(&mut self, bb: BasicBlock) -> ConditionSet
Construct the condition set for bb from the terminator, without executing its effect.
Sourcefn flood_state(
&self,
place: Place<'tcx>,
extra_elem: Option<TrackElem>,
state: &mut ConditionSet,
)
fn flood_state( &self, place: Place<'tcx>, extra_elem: Option<TrackElem>, state: &mut ConditionSet, )
Remove all conditions in the state that alias given place.
Sourcefn mutated_statement(
&self,
stmt: &Statement<'tcx>,
) -> Option<(Place<'tcx>, Option<TrackElem>)>
fn mutated_statement( &self, stmt: &Statement<'tcx>, ) -> Option<(Place<'tcx>, Option<TrackElem>)>
Extract the mutated place from a statement.
This method returns the Place so we can flood the state in case of a partial assignment.
(_1 as Ok).0 = _5;
(_1 as Err).0 = _6;
We want to ensure that a SwitchInt((_1 as Ok).0) does not see the first assignment, as
the value may have been mangled by the second assignment.
In case we assign to a discriminant, we return Some(TrackElem::Discriminant), so we can
stop at flooding the discriminant, and preserve the variant fields.
(_1 as Some).0 = _6;
SetDiscriminant(_1, 1);
switchInt((_1 as Some).0)
fn process_immediate( &mut self, lhs: PlaceIndex, rhs: ImmTy<'tcx>, state: &mut ConditionSet, )
Sourcefn process_constant(
&mut self,
lhs: PlaceIndex,
constant: OpTy<'tcx>,
state: &mut ConditionSet,
)
fn process_constant( &mut self, lhs: PlaceIndex, constant: OpTy<'tcx>, state: &mut ConditionSet, )
If we expect lhs ?= A, we have an opportunity if we assume constant == A.
fn process_copy( &mut self, lhs: PlaceIndex, rhs: PlaceIndex, state: &mut ConditionSet, )
fn process_operand( &mut self, lhs: PlaceIndex, rhs: &Operand<'tcx>, state: &mut ConditionSet, )
fn process_assign( &mut self, lhs_place: &Place<'tcx>, rvalue: &Rvalue<'tcx>, state: &mut ConditionSet, )
fn process_statement( &mut self, stmt: &Statement<'tcx>, state: &mut ConditionSet, )
Sourcefn process_terminator(&mut self, bb: BasicBlock, state: &mut ConditionSet)
fn process_terminator(&mut self, bb: BasicBlock, state: &mut ConditionSet)
Execute the terminator for block bb into state entry_states[bb].
fn process_switch_int( &mut self, discr: &Operand<'tcx>, targets: &SwitchTargets, state: &mut ConditionSet, )
Auto Trait Implementations§
impl<'a, 'tcx> DynSend for TOFinder<'a, 'tcx>
impl<'a, 'tcx> !DynSync for TOFinder<'a, 'tcx>
impl<'a, 'tcx> !Freeze for TOFinder<'a, 'tcx>
impl<'a, 'tcx> !RefUnwindSafe for TOFinder<'a, 'tcx>
impl<'a, 'tcx> !Send for TOFinder<'a, 'tcx>
impl<'a, 'tcx> !Sync for TOFinder<'a, 'tcx>
impl<'a, 'tcx> Unpin for TOFinder<'a, 'tcx>
impl<'a, 'tcx> !UnwindSafe for TOFinder<'a, 'tcx>
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, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§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 moreSource§impl<P> IntoQueryParam<P> for P
impl<P> IntoQueryParam<P> for P
fn into_query_param(self) -> P
Source§impl<T> MaybeResult<T> for T
impl<T> MaybeResult<T> for T
Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
Source§impl<I, T> UpcastFrom<I, T> for T
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> T
Source§impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
default fn from_cycle_error( tcx: Tcx, cycle_error: &CycleError, _guar: ErrorGuaranteed, ) -> T
Source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
Source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<T> ErasedDestructor for Twhere
T: 'static,
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: 456 bytes