diff --git a/src/librustc_mir/borrow_check/nll/constraint_set.rs b/src/librustc_mir/borrow_check/nll/constraint_set.rs index 249b03e0c8b..c927aa871fc 100644 --- a/src/librustc_mir/borrow_check/nll/constraint_set.rs +++ b/src/librustc_mir/borrow_check/nll/constraint_set.rs @@ -23,17 +23,21 @@ crate struct ConstraintSet { } impl ConstraintSet { - pub fn push(&mut self, outlives_constraint: OutlivesConstraint) { + pub fn new() -> Self { + Default::default() + } + + pub fn push(&mut self, constraint: OutlivesConstraint) { debug!("add_outlives({:?}: {:?} @ {:?}", - outlives_constraint.sup, - outlives_constraint.sub, - outlives_constraint.point); - if outlives_constraint.sup == outlives_constraint.sub { + constraint.sup, + constraint.sub, + constraint.point); + if constraint.sup == constraint.sub { // 'a: 'a is pretty uninteresting return; } - if self.seen_constraints.insert(outlives_constraint.dedup_key()) { - self.constraints.push(outlives_constraint); + if self.seen_constraints.insert(constraint.dedup_key()) { + self.constraints.push(constraint); } } @@ -41,11 +45,17 @@ impl ConstraintSet { &self.constraints } - /// Do Not use this to add nor remove items to the Vec, - /// nor change the `sup`, - /// nor `sub` of the data. - pub fn inner_mut(&mut self) -> &mut IndexVec { - &mut self.constraints + pub fn link(&mut self, len: usize) -> IndexVec> { + let mut map = IndexVec::from_elem_n(None, len); + + for (idx, constraint) in self.constraints.iter_enumerated_mut().rev() { + let mut head = &mut map[constraint.sub]; + debug_assert!(constraint.next.is_none()); + constraint.next = *head; + *head = Some(idx); + } + + map } } diff --git a/src/librustc_mir/borrow_check/nll/region_infer/mod.rs b/src/librustc_mir/borrow_check/nll/region_infer/mod.rs index 3a2eb7faaa5..ef61b162e9c 100644 --- a/src/librustc_mir/borrow_check/nll/region_infer/mod.rs +++ b/src/librustc_mir/borrow_check/nll/region_infer/mod.rs @@ -486,16 +486,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { /// These are constraints like Y: X @ P -- so if X changed, we may /// need to grow Y. fn build_dependency_map(&mut self) -> IndexVec> { - let mut map = IndexVec::from_elem(None, &self.definitions); - - for (idx, constraint) in self.constraints.inner_mut().iter_enumerated_mut().rev() { - let mut head = &mut map[constraint.sub]; - debug_assert!(constraint.next.is_none()); - constraint.next = *head; - *head = Some(idx); - } - - map + self.constraints.link(self.definitions.len()) } /// Once regions have been propagated, this method is used to see