X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Flibrustc_mir%2Fborrow_check%2Fnll%2Ftype_check%2Fliveness.rs;h=0eb88b7bcbfd390d2ca8009f1fd5353c23bb43fd;hb=43b69c27771929e6dfa7bf1771bc8ee5ce7a99c5;hp=d84dcc5678279a918a545e914832c2c989e59454;hpb=e75e78256f07aadd120fb867880c0c7913748cbe;p=rust.git diff --git a/src/librustc_mir/borrow_check/nll/type_check/liveness.rs b/src/librustc_mir/borrow_check/nll/type_check/liveness.rs index d84dcc56782..0eb88b7bcbf 100644 --- a/src/librustc_mir/borrow_check/nll/type_check/liveness.rs +++ b/src/librustc_mir/borrow_check/nll/type_check/liveness.rs @@ -8,7 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -use borrow_check::nll::region_infer::Cause; use borrow_check::nll::type_check::AtLocation; use dataflow::move_paths::{HasMoveData, MoveData}; use dataflow::MaybeInitializedPlaces; @@ -22,7 +21,7 @@ use rustc::ty::{Ty, TypeFoldable}; use rustc_data_structures::fx::FxHashMap; use std::rc::Rc; -use util::liveness::LivenessResults; +use util::liveness::{IdentityMap, LivenessResults}; use super::TypeChecker; @@ -37,7 +36,7 @@ pub(super) fn generate<'gcx, 'tcx>( cx: &mut TypeChecker<'_, 'gcx, 'tcx>, mir: &Mir<'tcx>, - liveness: &LivenessResults, + liveness: &LivenessResults, flow_inits: &mut FlowAtLocation>, move_data: &MoveData<'tcx>, ) { @@ -48,6 +47,7 @@ pub(super) fn generate<'gcx, 'tcx>( flow_inits, move_data, drop_data: FxHashMap(), + map: &IdentityMap::new(mir), }; for bb in mir.basic_blocks().indices() { @@ -64,10 +64,11 @@ struct TypeLivenessGenerator<'gen, 'typeck, 'flow, 'gcx, 'tcx> { cx: &'gen mut TypeChecker<'typeck, 'gcx, 'tcx>, mir: &'gen Mir<'tcx>, - liveness: &'gen LivenessResults, + liveness: &'gen LivenessResults, flow_inits: &'gen mut FlowAtLocation>, move_data: &'gen MoveData<'tcx>, drop_data: FxHashMap, DropData<'tcx>>, + map: &'gen IdentityMap<'gen, 'tcx>, } struct DropData<'tcx> { @@ -85,18 +86,17 @@ fn add_liveness_constraints(&mut self, bb: BasicBlock) { self.liveness .regular - .simulate_block(self.mir, bb, |location, live_locals| { + .simulate_block(self.mir, bb, self.map, |location, live_locals| { for live_local in live_locals.iter() { let live_local_ty = self.mir.local_decls[live_local].ty; - let cause = Cause::LiveVar(live_local, location); - Self::push_type_live_constraint(&mut self.cx, live_local_ty, location, cause); + Self::push_type_live_constraint(&mut self.cx, live_local_ty, location); } }); let mut all_live_locals: Vec<(Location, Vec)> = vec![]; self.liveness .drop - .simulate_block(self.mir, bb, |location, live_locals| { + .simulate_block(self.mir, bb, self.map, |location, live_locals| { all_live_locals.push((location, live_locals.iter().collect())); }); debug!( @@ -161,7 +161,6 @@ fn push_type_live_constraint( cx: &mut TypeChecker<'_, 'gcx, 'tcx>, value: T, location: Location, - cause: Cause, ) where T: TypeFoldable<'tcx>, { @@ -171,9 +170,18 @@ fn push_type_live_constraint( ); cx.tcx().for_each_free_region(&value, |live_region| { - cx.constraints - .liveness_set - .push((live_region, location, cause.clone())); + if let Some(ref mut borrowck_context) = cx.borrowck_context { + let region_vid = borrowck_context.universal_regions.to_region_vid(live_region); + borrowck_context.constraints.liveness_constraints.add_element(region_vid, location); + + if let Some(all_facts) = borrowck_context.all_facts { + let start_index = borrowck_context.location_table.start_index(location); + all_facts.region_live_at.push((region_vid, start_index)); + + let mid_index = borrowck_context.location_table.mid_index(location); + all_facts.region_live_at.push((region_vid, mid_index)); + } + } }); } @@ -210,9 +218,8 @@ fn add_drop_live_constraint( // All things in the `outlives` array may be touched by // the destructor and must be live at this point. - let cause = Cause::DropVar(dropped_local, location); for &kind in &drop_data.dropck_result.kinds { - Self::push_type_live_constraint(&mut self.cx, kind, location, cause); + Self::push_type_live_constraint(&mut self.cx, kind, location); } }