[][src]Struct rustc_mir::dataflow::impls::EverInitializedPlaces

pub struct EverInitializedPlaces<'a, 'tcx> {
    tcx: TyCtxt<'tcx>,
    body: &'a Body<'tcx>,
    mdpe: &'a MoveDataParamEnv<'tcx>,
}

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]

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.

impl<'tcx, '_> GenKillAnalysis<'tcx> for EverInitializedPlaces<'_, 'tcx>[src]

type Idx = InitIndex

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, 

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

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

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

The type returned in the event of a conversion error.

impl<T> WithConstness for T[src]