From b57ca9d97f286fce6b11335af710c7e3a2a6b6d9 Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Fri, 26 Jan 2018 20:13:51 -0500 Subject: [PATCH] change from `dirty_bit_vec` to `clean_bit_vec` Otherwise the vector is initially out of sync --- src/librustc_mir/borrow_check/nll/region_infer/mod.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) 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 b9acb837dba..b8258c76676 100644 --- a/src/librustc_mir/borrow_check/nll/region_infer/mod.rs +++ b/src/librustc_mir/borrow_check/nll/region_infer/mod.rs @@ -467,12 +467,16 @@ fn propagate_constraints(&mut self, mir: &Mir<'tcx>) { let mut inferred_values = self.liveness_constraints.clone(); let dependency_map = self.build_dependency_map(); + + // Constraints that may need to be repropagated (initially all): let mut dirty_list: Vec<_> = (0..self.constraints.len()).collect(); - let mut dirty_bit_vec = BitVector::new(dirty_list.len()); + + // Set to 0 for each constraint that is on the dirty list: + let mut clean_bit_vec = BitVector::new(dirty_list.len()); debug!("propagate_constraints: --------------------"); while let Some(constraint_idx) = dirty_list.pop() { - dirty_bit_vec.remove(constraint_idx); + clean_bit_vec.insert(constraint_idx); let constraint = &self.constraints[constraint_idx]; debug!("propagate_constraints: constraint={:?}", constraint); @@ -495,7 +499,7 @@ fn propagate_constraints(&mut self, mir: &Mir<'tcx>) { debug!("propagate_constraints: sup={:?}", constraint.sup); for &dep_idx in dependency_map.get(&constraint.sup).unwrap_or(&vec![]) { - if dirty_bit_vec.insert(dep_idx) { + if clean_bit_vec.remove(dep_idx) { dirty_list.push(dep_idx); } } -- GitLab