]> git.lizzy.rs Git - rust.git/commitdiff
Fix infinite loops when regions are self-referential.
authorDavid Wood <david@davidtw.co>
Fri, 29 Jun 2018 21:17:35 +0000 (22:17 +0100)
committerDavid Wood <david@davidtw.co>
Sun, 1 Jul 2018 15:14:26 +0000 (16:14 +0100)
src/librustc_mir/borrow_check/nll/region_infer/error_reporting.rs

index f3372f6be703b0c0efbd417187d070ed617edfef..970652d8872cd71f4b4b220487fa1a90136f6249 100644 (file)
@@ -63,12 +63,15 @@ fn find_constraint_paths_from_region(
         // 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 @@ fn find_constraint_paths_from_region(
             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.