Function rustc_borrowck::type_check::liveness::trace::trace

source ·
pub(super) fn trace<'mir, 'tcx>(
    typeck: &mut TypeChecker<'_, 'tcx>,
    body: &Body<'tcx>,
    elements: &Rc<DenseLocationMap>,
    flow_inits: &mut ResultsCursor<'mir, 'tcx, MaybeInitializedPlaces<'mir, 'tcx>>,
    move_data: &MoveData<'tcx>,
    relevant_live_locals: Vec<Local>,
    boring_locals: Vec<Local>,
    polonius_drop_used: Option<Vec<(Local, Location)>>
)
Expand description

This is the heart of the liveness computation. For each variable X that requires a liveness computation, it walks over all the uses of X and does a reverse depth-first search (“trace”) through the MIR. This search stops when we find a definition of that variable. The points visited in this search is the USE-LIVE set for the variable; of those points is added to all the regions that appear in the variable’s type.

We then also walks through each drop of those variables and does another search, stopping when we reach a use or definition. This is the DROP-LIVE set of points. Each of the points in the DROP-LIVE set are to the liveness sets for regions found in the dropck_outlives result of the variable’s type (in particular, this respects #[may_dangle] annotations).