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;
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(
(regioncx, closure_region_requirements)
}
-struct LivenessResults {
- regular: LivenessResult,
- drop: LivenessResult,
-}
-
fn dump_mir_results<'a, 'gcx, 'tcx>(
infcx: &InferCtxt<'a, 'gcx, 'tcx>,
liveness: &LivenessResults,
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?).