pub(super) fn trace<'mir, 'tcx>( typeck: &mut TypeChecker<'_, 'tcx>, body: &Body<'tcx>, elements: &Rc<RegionValueElements>, 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)>> )
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,