about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMaybe Waffle <waffle.lapkin@gmail.com>2023-09-28 23:50:56 +0000
committerMaybe Waffle <waffle.lapkin@gmail.com>2023-09-28 23:50:56 +0000
commita4d11d936ec9750297734d0233e2d7dc5f8728af (patch)
tree8d92c66f4fa875a75be816f02b60423437987deb
parent3b75db7aa6692db31fdffd3c78d2a8029c536318 (diff)
downloadrust-a4d11d936ec9750297734d0233e2d7dc5f8728af.tar.gz
rust-a4d11d936ec9750297734d0233e2d7dc5f8728af.zip
Reverse postorder instead of using reversed postorder
-rw-r--r--clippy_utils/src/mir/mod.rs32
1 files changed, 19 insertions, 13 deletions
diff --git a/clippy_utils/src/mir/mod.rs b/clippy_utils/src/mir/mod.rs
index f04467dc19d..9dbb4c68d13 100644
--- a/clippy_utils/src/mir/mod.rs
+++ b/clippy_utils/src/mir/mod.rs
@@ -30,20 +30,26 @@ pub fn visit_local_usage(locals: &[Local], mir: &Body<'_>, location: Location) -
         locals.len()
     ];
 
-    traversal::ReversePostorder::new(mir, location.block).try_fold(init, |usage, (tbb, tdata)| {
-        // Give up on loops
-        if tdata.terminator().successors().any(|s| s == location.block) {
-            return None;
-        }
+    traversal::Postorder::new(&mir.basic_blocks, location.block)
+        .collect::<Vec<_>>()
+        .into_iter()
+        .rev()
+        .try_fold(init, |usage, tbb| {
+            let tdata = &mir.basic_blocks[tbb];
+
+            // Give up on loops
+            if tdata.terminator().successors().any(|s| s == location.block) {
+                return None;
+            }
 
-        let mut v = V {
-            locals,
-            location,
-            results: usage,
-        };
-        v.visit_basic_block_data(tbb, tdata);
-        Some(v.results)
-    })
+            let mut v = V {
+                locals,
+                location,
+                results: usage,
+            };
+            v.visit_basic_block_data(tbb, tdata);
+            Some(v.results)
+        })
 }
 
 struct V<'a> {