Fix infinite loops when regions are self-referential.

This commit is contained in:
David Wood 2018-06-29 22:17:35 +01:00
parent f334a9e8dd
commit 15aad83560
No known key found for this signature in database
GPG Key ID: 01760B4F9F53F154

View File

@ -63,12 +63,15 @@ impl<'tcx> RegionInferenceContext<'tcx> {
// Regions that have been visited.
let mut visited = FxHashSet();
// Ends of paths.
let mut end_regions: Vec<RegionVid> = Vec::new();
let mut end_regions = FxHashSet();
// When we've still got points to visit...
while let Some(current) = next.pop() {
// ...take the next point...
debug!("find_constraint_paths_from_region: current={:?} next={:?}", current, next);
debug!("find_constraint_paths_from_region: current={:?} visited={:?} next={:?}",
current, visited, next);
// ...but make sure not to visit this point again...
visited.insert(current);
// ...find the edges containing it...
let mut upcoming = Vec::new();
@ -93,16 +96,13 @@ impl<'tcx> RegionInferenceContext<'tcx> {
if upcoming.is_empty() {
// If we didn't find any edges then this is the end of a path...
debug!("find_constraint_paths_from_region: new end region current={:?}", current);
end_regions.push(current);
end_regions.insert(current);
} else {
// ...but, if we did find edges, then add these to the regions yet to visit...
// ...but, if we did find edges, then add these to the regions yet to visit.
debug!("find_constraint_paths_from_region: extend next upcoming={:?}", upcoming);
next.extend(upcoming);
}
// ...and don't visit it again.
visited.insert(current.clone());
debug!("find_constraint_paths_from_region: next={:?} visited={:?}", next, visited);
}
// Now we've visited each point, compute the final paths.