[−][src]Struct rustc_mir::dataflow::impls::EverInitializedPlaces
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 Storage Dead.
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 Idx = InitIndex
The type of the elements in the state vector.
const NAME: &'static str[src]
fn bits_per_block(&self, _: &Body<'tcx>) -> usize[src]
fn initialize_start_block(
&self,
body: &Body<'tcx>,
state: &mut BitSet<Self::Idx>
)[src]
&self,
body: &Body<'tcx>,
state: &mut BitSet<Self::Idx>
)
type Direction: Direction = Forward
fn pretty_print_idx(&self, w: &mut impl Write, idx: Self::Idx) -> Result<()>[src]
impl<'a, 'tcx> BottomValue for EverInitializedPlaces<'a, 'tcx>[src]
const BOTTOM_VALUE: bool[src]
bottom = no initialized variables by default
fn join<T: Idx>(&self, inout_set: &mut BitSet<T>, in_set: &BitSet<T>) -> bool[src]
impl<'tcx, '_> GenKillAnalysis<'tcx> for EverInitializedPlaces<'_, 'tcx>[src]
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 discriminant_switch_effect(
&self,
_state: &mut impl GenKill<Self::Idx>,
_block: BasicBlock,
_enum_place: Place<'tcx>,
_adt: &AdtDef,
_variant: VariantIdx
)[src]
&self,
_state: &mut impl GenKill<Self::Idx>,
_block: BasicBlock,
_enum_place: Place<'tcx>,
_adt: &AdtDef,
_variant: VariantIdx
)
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,
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.
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.