Skip to content

Commit f277b39

Browse files
committed
generate extra liveness constraints before regioncx is created
1 parent 92786a4 commit f277b39

File tree

2 files changed

+21
-15
lines changed

2 files changed

+21
-15
lines changed

src/librustc_mir/borrow_check/nll/constraint_generation.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,20 @@ use borrow_check::borrow_set::BorrowSet;
1212
use borrow_check::location::LocationTable;
1313
use borrow_check::nll::ToRegionVid;
1414
use borrow_check::nll::facts::AllFacts;
15-
use borrow_check::nll::region_infer::RegionInferenceContext;
15+
use borrow_check::nll::region_infer::values::{RegionValueElements, RegionValues};
1616
use rustc::infer::InferCtxt;
1717
use rustc::mir::visit::TyContext;
1818
use rustc::mir::visit::Visitor;
1919
use rustc::mir::{BasicBlock, BasicBlockData, Location, Mir, Place, Rvalue};
2020
use rustc::mir::{Local, Statement, Terminator};
2121
use rustc::ty::fold::TypeFoldable;
2222
use rustc::ty::subst::Substs;
23-
use rustc::ty::{self, CanonicalTy, ClosureSubsts, GeneratorSubsts};
23+
use rustc::ty::{self, CanonicalTy, ClosureSubsts, GeneratorSubsts, RegionVid};
2424

2525
pub(super) fn generate_constraints<'cx, 'gcx, 'tcx>(
2626
infcx: &InferCtxt<'cx, 'gcx, 'tcx>,
27-
regioncx: &mut RegionInferenceContext<'tcx>,
27+
elements: &RegionValueElements,
28+
liveness_constraints: &mut RegionValues<RegionVid>,
2829
all_facts: &mut Option<AllFacts>,
2930
location_table: &LocationTable,
3031
mir: &Mir<'tcx>,
@@ -33,9 +34,10 @@ pub(super) fn generate_constraints<'cx, 'gcx, 'tcx>(
3334
let mut cg = ConstraintGeneration {
3435
borrow_set,
3536
infcx,
36-
regioncx,
37+
liveness_constraints,
3738
location_table,
3839
all_facts,
40+
elements,
3941
};
4042

4143
for (bb, data) in mir.basic_blocks().iter_enumerated() {
@@ -48,8 +50,9 @@ struct ConstraintGeneration<'cg, 'cx: 'cg, 'gcx: 'tcx, 'tcx: 'cx> {
4850
infcx: &'cg InferCtxt<'cx, 'gcx, 'tcx>,
4951
all_facts: &'cg mut Option<AllFacts>,
5052
location_table: &'cg LocationTable,
51-
regioncx: &'cg mut RegionInferenceContext<'tcx>,
53+
liveness_constraints: &'cg mut RegionValues<RegionVid>,
5254
borrow_set: &'cg BorrowSet<'tcx>,
55+
elements: &'cg RegionValueElements,
5356
}
5457

5558
impl<'cg, 'cx, 'gcx, 'tcx> Visitor<'tcx> for ConstraintGeneration<'cg, 'cx, 'gcx, 'tcx> {
@@ -202,7 +205,7 @@ impl<'cx, 'cg, 'gcx, 'tcx> ConstraintGeneration<'cx, 'cg, 'gcx, 'tcx> {
202205
.tcx
203206
.for_each_free_region(&live_ty, |live_region| {
204207
let vid = live_region.to_region_vid();
205-
self.regioncx.add_live_element(vid, location);
208+
self.liveness_constraints.add_element(&self.elements, vid, location);
206209
});
207210
}
208211
}

src/librustc_mir/borrow_check/nll/mod.rs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -136,10 +136,21 @@ pub(in borrow_check) fn compute_regions<'cx, 'gcx, 'tcx>(
136136
// base constraints generated by the type-check.
137137
let var_origins = infcx.take_region_var_origins();
138138
let MirTypeckRegionConstraints {
139-
liveness_constraints,
139+
mut liveness_constraints,
140140
outlives_constraints,
141141
type_tests,
142142
} = constraint_sets;
143+
144+
constraint_generation::generate_constraints(
145+
infcx,
146+
&elements,
147+
&mut liveness_constraints,
148+
&mut all_facts,
149+
location_table,
150+
&mir,
151+
borrow_set,
152+
);
153+
143154
let mut regioncx = RegionInferenceContext::new(
144155
var_origins,
145156
universal_regions,
@@ -151,14 +162,6 @@ pub(in borrow_check) fn compute_regions<'cx, 'gcx, 'tcx>(
151162
);
152163

153164
// Generate various additional constraints.
154-
constraint_generation::generate_constraints(
155-
infcx,
156-
&mut regioncx,
157-
&mut all_facts,
158-
location_table,
159-
&mir,
160-
borrow_set,
161-
);
162165
invalidation::generate_invalidates(
163166
infcx,
164167
&mut all_facts,

0 commit comments

Comments
 (0)