about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEh2406 <YeomanYaacov@gmail.com>2018-06-27 17:47:55 -0400
committerEh2406 <YeomanYaacov@gmail.com>2018-06-28 10:18:31 -0400
commit9bd2a63f29d4a64643aa6c25fe2e8390fa14b277 (patch)
tree237bdeac9da7d7ba9b066a1e12701f96016aaa8a /src
parent497a3b4fd5d0b9d773f40dd7acef952a7acd4ce5 (diff)
remove inner_mut as it can mess up invariants
Diffstat (limited to 'src')
-rw-r--r--src/librustc_mir/borrow_check/nll/constraint_set.rs34
-rw-r--r--src/librustc_mir/borrow_check/nll/region_infer/mod.rs11
2 files changed, 23 insertions, 22 deletions
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<ConstraintIndex, OutlivesConstraint> {
-        &mut self.constraints
+    pub fn link(&mut self, len: usize) -> IndexVec<RegionVid, Option<ConstraintIndex>> {
+        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<RegionVid, Option<ConstraintIndex>> {
-        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