1
Fork 0

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