diff --git a/src/librustc_mir/borrow_check/nll/mod.rs b/src/librustc_mir/borrow_check/nll/mod.rs index ffbb3d319174..725694fd5b74 100644 --- a/src/librustc_mir/borrow_check/nll/mod.rs +++ b/src/librustc_mir/borrow_check/nll/mod.rs @@ -16,7 +16,7 @@ use rustc::util::nodemap::FxHashMap; use std::collections::BTreeSet; use std::io; use transform::MirSource; -use util::liveness::{self, LivenessMode, LivenessResult, LocalSet}; +use util::liveness::{LivenessResults, LocalSet}; use borrow_check::FlowAtLocation; use dataflow::MaybeInitializedLvals; use dataflow::move_paths::MoveData; @@ -86,23 +86,7 @@ pub(in borrow_check) fn compute_regions<'cx, 'gcx, 'tcx>( subtype_constraint_generation::generate(&mut regioncx, mir, constraint_sets); // Compute what is live where. - let liveness = &LivenessResults { - regular: liveness::liveness_of_locals( - &mir, - LivenessMode { - include_regular_use: true, - include_drops: false, - }, - ), - - drop: liveness::liveness_of_locals( - &mir, - LivenessMode { - include_regular_use: false, - include_drops: true, - }, - ), - }; + let liveness = &LivenessResults::compute(mir); // Generate non-subtyping constraints. constraint_generation::generate_constraints( @@ -136,11 +120,6 @@ pub(in borrow_check) fn compute_regions<'cx, 'gcx, 'tcx>( (regioncx, closure_region_requirements) } -struct LivenessResults { - regular: LivenessResult, - drop: LivenessResult, -} - fn dump_mir_results<'a, 'gcx, 'tcx>( infcx: &InferCtxt<'a, 'gcx, 'tcx>, liveness: &LivenessResults, diff --git a/src/librustc_mir/util/liveness.rs b/src/librustc_mir/util/liveness.rs index 45c3fcd8a615..5163f74dd252 100644 --- a/src/librustc_mir/util/liveness.rs +++ b/src/librustc_mir/util/liveness.rs @@ -80,6 +80,39 @@ pub struct LivenessMode { pub include_drops: bool, } +/// A combination of liveness results, used in NLL. +pub struct LivenessResults { + /// Liveness results where a regular use makes a variable X live, + /// but not a drop. + pub regular: LivenessResult, + + /// Liveness results where a drop makes a variable X live, + /// but not a regular use. + pub drop: LivenessResult, +} + +impl LivenessResults { + pub fn compute<'tcx>(mir: &Mir<'tcx>) -> LivenessResults { + LivenessResults { + regular: liveness_of_locals( + &mir, + LivenessMode { + include_regular_use: true, + include_drops: false, + }, + ), + + drop: liveness_of_locals( + &mir, + LivenessMode { + include_regular_use: false, + include_drops: true, + }, + ), + } + } +} + /// Compute which local variables are live within the given function /// `mir`. The liveness mode `mode` determines what sorts of uses are /// considered to make a variable live (e.g., do drops count?).