Struct rustc_mir::dataflow::impls::EverInitializedPlaces [−][src]
EverInitializedPlaces tracks all places that might have ever been
initialized upon reaching a particular point in the control flow
for a function, without an intervening StorageDead.
This dataflow is used to determine if an immutable local variable may be assigned to.
For example, in code like the following, we have corresponding dataflow information shown in the right-hand comments.
struct S; fn foo(pred: bool) { // ever-init: // { } let a = S; let b = S; let c; let d; // {a, b } if pred { drop(a); // {a, b, } b = S; // {a, b, } } else { drop(b); // {a, b, } d = S; // {a, b, d } } // {a, b, d } c = S; // {a, b, c, d } }
Fields
tcx: TyCtxt<'tcx>body: &'a Body<'tcx>mdpe: &'a MoveDataParamEnv<'tcx>Implementations
impl<'a, 'tcx> EverInitializedPlaces<'a, 'tcx>[src]
pub fn new(
tcx: TyCtxt<'tcx>,
body: &'a Body<'tcx>,
mdpe: &'a MoveDataParamEnv<'tcx>
) -> Self[src]
tcx: TyCtxt<'tcx>,
body: &'a Body<'tcx>,
mdpe: &'a MoveDataParamEnv<'tcx>
) -> Self
Trait Implementations
impl<'tcx> AnalysisDomain<'tcx> for EverInitializedPlaces<'_, 'tcx>[src]
type Domain = BitSet<InitIndex>
The type that holds the dataflow state at any given point in the program.
const NAME: &'static str[src]
fn bottom_value(&self, _: &Body<'tcx>) -> Self::Domain[src]
fn initialize_start_block(&self, body: &Body<'tcx>, state: &mut Self::Domain)[src]
type Direction: Direction = Forward
impl<'tcx> GenKillAnalysis<'tcx> for EverInitializedPlaces<'_, 'tcx>[src]
type Idx = InitIndex
fn statement_effect(
&self,
trans: &mut impl GenKill<Self::Idx>,
stmt: &Statement<'tcx>,
location: Location
)[src]
&self,
trans: &mut impl GenKill<Self::Idx>,
stmt: &Statement<'tcx>,
location: Location
)
fn terminator_effect(
&self,
trans: &mut impl GenKill<Self::Idx>,
_terminator: &Terminator<'tcx>,
location: Location
)[src]
&self,
trans: &mut impl GenKill<Self::Idx>,
_terminator: &Terminator<'tcx>,
location: Location
)
fn call_return_effect(
&self,
trans: &mut impl GenKill<Self::Idx>,
block: BasicBlock,
_func: &Operand<'tcx>,
_args: &[Operand<'tcx>],
_dest_place: Place<'tcx>
)[src]
&self,
trans: &mut impl GenKill<Self::Idx>,
block: BasicBlock,
_func: &Operand<'tcx>,
_args: &[Operand<'tcx>],
_dest_place: Place<'tcx>
)
fn before_statement_effect(
&self,
_trans: &mut impl GenKill<Self::Idx>,
_statement: &Statement<'tcx>,
_location: Location
)[src]
&self,
_trans: &mut impl GenKill<Self::Idx>,
_statement: &Statement<'tcx>,
_location: Location
)
fn before_terminator_effect(
&self,
_trans: &mut impl GenKill<Self::Idx>,
_terminator: &Terminator<'tcx>,
_location: Location
)[src]
&self,
_trans: &mut impl GenKill<Self::Idx>,
_terminator: &Terminator<'tcx>,
_location: Location
)
fn yield_resume_effect(
&self,
_trans: &mut impl GenKill<Self::Idx>,
_resume_block: BasicBlock,
_resume_place: Place<'tcx>
)[src]
&self,
_trans: &mut impl GenKill<Self::Idx>,
_resume_block: BasicBlock,
_resume_place: Place<'tcx>
)
fn switch_int_edge_effects<G: GenKill<Self::Idx>>(
&self,
_block: BasicBlock,
_discr: &Operand<'tcx>,
_edge_effects: &mut impl SwitchIntEdgeEffects<G>
)[src]
&self,
_block: BasicBlock,
_discr: &Operand<'tcx>,
_edge_effects: &mut impl SwitchIntEdgeEffects<G>
)
impl<'a, 'tcx> HasMoveData<'tcx> for EverInitializedPlaces<'a, 'tcx>[src]
Auto Trait Implementations
impl<'a, 'tcx> !RefUnwindSafe for EverInitializedPlaces<'a, 'tcx>
impl<'a, 'tcx> !Send for EverInitializedPlaces<'a, 'tcx>
impl<'a, 'tcx> !Sync for EverInitializedPlaces<'a, 'tcx>
impl<'a, 'tcx> Unpin for EverInitializedPlaces<'a, 'tcx> where
'tcx: 'a,
'tcx: 'a,
impl<'a, 'tcx> !UnwindSafe for EverInitializedPlaces<'a, 'tcx>
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized, [src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized, [src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized, [src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T[src]
impl<T> From<T> for T[src]
impl<T, U> Into<U> for T where
U: From<T>, [src]
U: From<T>,
impl<T, U> TryFrom<U> for T where
U: Into<T>, [src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>, [src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.