diff --git a/src/librustc_data_structures/obligation_forest/mod.rs b/src/librustc_data_structures/obligation_forest/mod.rs index 0ee751d33c9..b1931ca459f 100644 --- a/src/librustc_data_structures/obligation_forest/mod.rs +++ b/src/librustc_data_structures/obligation_forest/mod.rs @@ -584,7 +584,7 @@ impl ObligationForest { // function call. if let NodeState::Success(waiting) = node.state.get() { if !self.is_still_waiting(waiting) { - self.find_cycles_from_node(&mut stack, processor, index); + self.find_cycles_from_node(&mut stack, processor, index, index); } } } @@ -592,7 +592,8 @@ impl ObligationForest { debug_assert!(stack.is_empty()); } - fn find_cycles_from_node

(&self, stack: &mut Vec, processor: &mut P, index: usize) + fn find_cycles_from_node

(&self, stack: &mut Vec, processor: &mut P, min_index: usize, + index: usize) where P: ObligationProcessor { let node = &self.nodes[index]; @@ -601,8 +602,11 @@ impl ObligationForest { match stack.iter().rposition(|&n| n == index) { None => { stack.push(index); - for &index in node.dependents.iter() { - self.find_cycles_from_node(stack, processor, index); + for &dep_index in node.dependents.iter() { + // The index check avoids re-considering a node. + if dep_index >= min_index { + self.find_cycles_from_node(stack, processor, min_index, dep_index); + } } stack.pop(); }