mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 08:13:41 +00:00
Rollup merge of #108902 - lcnr:do-while-sus, r=davidtwco,Nilstrieb
no more do while :<
This commit is contained in:
commit
5e449b32b5
@ -588,8 +588,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||||||
// let PATTERN = ... might not even exist until we do the assignment.
|
// let PATTERN = ... might not even exist until we do the assignment.
|
||||||
// so we set it here instead.
|
// so we set it here instead.
|
||||||
if set_match_place {
|
if set_match_place {
|
||||||
let mut candidate_ref = &candidate;
|
let mut next = Some(&candidate);
|
||||||
while let Some(next) = {
|
while let Some(candidate_ref) = next.take() {
|
||||||
for binding in &candidate_ref.bindings {
|
for binding in &candidate_ref.bindings {
|
||||||
let local = self.var_local_id(binding.var_id, OutsideGuard);
|
let local = self.var_local_id(binding.var_id, OutsideGuard);
|
||||||
// `try_to_place` may fail if it is unable to resolve the given
|
// `try_to_place` may fail if it is unable to resolve the given
|
||||||
@ -617,9 +617,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
// All of the subcandidates should bind the same locals, so we
|
// All of the subcandidates should bind the same locals, so we
|
||||||
// only visit the first one.
|
// only visit the first one.
|
||||||
candidate_ref.subcandidates.get(0)
|
next = candidate_ref.subcandidates.get(0)
|
||||||
} {
|
|
||||||
candidate_ref = next;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -537,29 +537,29 @@ impl TraverseCoverageGraphWithLoops {
|
|||||||
"TraverseCoverageGraphWithLoops::next - context_stack: {:?}",
|
"TraverseCoverageGraphWithLoops::next - context_stack: {:?}",
|
||||||
self.context_stack.iter().rev().collect::<Vec<_>>()
|
self.context_stack.iter().rev().collect::<Vec<_>>()
|
||||||
);
|
);
|
||||||
while let Some(next_bcb) = {
|
|
||||||
// Strip contexts with empty worklists from the top of the stack
|
while let Some(context) = self.context_stack.last_mut() {
|
||||||
while self.context_stack.last().map_or(false, |context| context.worklist.is_empty()) {
|
if let Some(next_bcb) = context.worklist.pop() {
|
||||||
|
if !self.visited.insert(next_bcb) {
|
||||||
|
debug!("Already visited: {:?}", next_bcb);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
debug!("Visiting {:?}", next_bcb);
|
||||||
|
if self.backedges[next_bcb].len() > 0 {
|
||||||
|
debug!("{:?} is a loop header! Start a new TraversalContext...", next_bcb);
|
||||||
|
self.context_stack.push(TraversalContext {
|
||||||
|
loop_backedges: Some((self.backedges[next_bcb].clone(), next_bcb)),
|
||||||
|
worklist: Vec::new(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
self.extend_worklist(basic_coverage_blocks, next_bcb);
|
||||||
|
return Some(next_bcb);
|
||||||
|
} else {
|
||||||
|
// Strip contexts with empty worklists from the top of the stack
|
||||||
self.context_stack.pop();
|
self.context_stack.pop();
|
||||||
}
|
}
|
||||||
// Pop the next bcb off of the current context_stack. If none, all BCBs were visited.
|
|
||||||
self.context_stack.last_mut().map_or(None, |context| context.worklist.pop())
|
|
||||||
} {
|
|
||||||
if !self.visited.insert(next_bcb) {
|
|
||||||
debug!("Already visited: {:?}", next_bcb);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
debug!("Visiting {:?}", next_bcb);
|
|
||||||
if self.backedges[next_bcb].len() > 0 {
|
|
||||||
debug!("{:?} is a loop header! Start a new TraversalContext...", next_bcb);
|
|
||||||
self.context_stack.push(TraversalContext {
|
|
||||||
loop_backedges: Some((self.backedges[next_bcb].clone(), next_bcb)),
|
|
||||||
worklist: Vec::new(),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
self.extend_worklist(basic_coverage_blocks, next_bcb);
|
|
||||||
return Some(next_bcb);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user